据可靠消息,加载PaddleHub DeepLabv3+模型(deeplabv3p_xception65_humanseg),可以轻松实现实现一键抠图。
有多轻松呢?一共需要2行:
humanseg = hub.Module( name="deeplabv3p_xception65_humanseg" )
result = humanseg.segmentation( data={"image": [tmp_png_file_name]} )
得到的result是个list,取result[0]['processed']就可以获得一张png图,通过alpha通道只露出抠出的人像。
突然想到,这个很适合把那种镜头焦点主要在演员身上的视频,转成3d效果。方法如下:
1、首先把人像抠出来,然后向右移动一点儿在贴回去,生成新图B;
2、取原图A的红色通道,与新图B的绿色蓝色通道合并。
貌似简单吧?其实有几个坑要处理:
1、制作图B的时候,人像右移,就会空出一块,这块的处理比较头疼:如果填白色,出现一条亮边,没法看了;如果用黑色,合成的图左边是条黑边,立体感很好,但是也挺怪的;如果用原像素填充,会导致左边完全没有立体感。最后采取的办法是用原像素填充一部分,而最左边的1个像素,用遮罩的左边填充,这样会有一定的灰度,既有立体感,又没有明显断裂。
2、用PIL处理,通道顺序为RGB,那么用cv转为视频时,要按照cv的BGR通道顺序调整一下,否则出来的不是红色而是黄色。
3、deeplabv3p_xception65_humanseg如果自动下载有问题,要用 hub install deeplabv3p_xception65_humanseg 安装一下。
处理之后,单帧的效果是这样的:
这张图里,投球手和橄榄球识别成了一个整体,所以不会出现人在前景里,而球在背景里的错误。
具体的处理过程、视频效果,请移步AI Studio工程查看: https://aistudio.baidu.com/aistudio/projectdetail/428347
差点忘了说,需要用红蓝眼镜看:
在加上景深的计算作为偏移量的依据就更合理了
这个酷,红蓝3d经典的技术