python抠图合成(Python装逼指南五行代码实现批量抠图)
python抠图合成(Python装逼指南五行代码实现批量抠图)我们首先执行语句:它的安装也比较简单,官网首页就有安装指引,我们这里根据官网的安装指引,使用 pip 方式来安装 CPU 版本。既然要装逼,准备工作是少不了的。所谓“站在巨人的肩膀上,做事事半功倍”,我们这里的“巨人”就是 paddlepaddle 了,中文名称叫“飞桨”,那么这个 paddlepaddle 是什么呢?它是“源于产业实践的开源深度学习平台,致力于让深度学习技术的创新与应用更简单”,直白点就是我帮你实现了深度学习底层框架,你只要有创意就可以在我平台上运用少量简单代码轻松实现。它的官网是 https://www.paddlepaddle.org.cn/ 。
你是否曾经想将某张照片中的人物抠出来,然后拼接到其他图片上去,从而可以即使你在天涯海角,我也可以到此一游?
专业点的人使用 PhotoShop 的“魔棒”工具可以抠图,非专业人士可以使用各种美图 APP 来实现,但是他们毕竟处理能力有限,一次只能处理一张图片,而且比较复杂的图像可能耗时较久。
今天我来向大家展示第三种途径——用 Python 一键批量抠图。
准备工作
既然要装逼,准备工作是少不了的。所谓“站在巨人的肩膀上,做事事半功倍”,我们这里的“巨人”就是 paddlepaddle 了,中文名称叫“飞桨”,那么这个 paddlepaddle 是什么呢?
它是“源于产业实践的开源深度学习平台,致力于让深度学习技术的创新与应用更简单”,直白点就是我帮你实现了深度学习底层框架,你只要有创意就可以在我平台上运用少量简单代码轻松实现。
它的官网是 https://www.paddlepaddle.org.cn/ 。
它的安装也比较简单,官网首页就有安装指引,我们这里根据官网的安装指引,使用 pip 方式来安装 CPU 版本。
我们首先执行语句:
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安装成功后,我们在 python 环境中测试一下是否安装成功(这个也是按照官网指引来做),我们切换到 python 环境,运行如下代码:
Python3.7.0(v3.7.0:1bf9cc5093 Jun262018 23:26:24)
[Clang6.0(clang-600.0.57)]ondarwin
Type"help" "copyright" "credits"or"license"formoreinformation.
>>>importpaddle.fluid
>>>paddle.fluid.install_check.run_check()
RunningVerifyPaddleProgram...
YourPaddleworkswellonSINGLEGPUorCPU.
I050621:47:48.6574042923565952parallel_executor.cc:440]TheProgramwillbeexecutedonCPUusingParallelExecutor 2cardsareused so2programsareexecutedinparallel.
W050621:47:48.6584072923565952fuse_all_reduce_op_pass.cc:74]Findall_reduceoperators:2.Tomakethespeedfaster someall_reduceopsarefusedduringtraining afterfusion thenumberofall_reduceopsis1.
I050621:47:48.6585162923565952build_strategy.cc:365]SeqOnlyAllReduceOps:0 num_trainers:1
I050621:47:48.6591372923565952parallel_executor.cc:307]Inplacestrategyisenabled whenbuild_strategy.enable_inplace=True
I050621:47:48.6595952923565952parallel_executor.cc:375]Garbagecollectionstrategyisenabled whenFLAGS_eager_delete_tensor_gb=0
YourPaddleworkswellonMUTIPLEGPUorCPU.
YourPaddleisinstalledsuccessfully!Let'sstartdeepLearningwithPaddlenow
>>>
看到 Your Paddle is installed successfully 就表示安装成功了。
我们接下来需要使用的是这个平台的 paddlehub 工具,所以我们还需要安装 paddlehub :
pip install -i https://mirror.baidu.com/pypi/simple paddlehub
安装完成后,我们就可以开始运用了。
代码实现我们的实现步骤很简单:导入模块 -> 加载模型 -> 获取图片文件 -> 调用模块抠图。
下面我们看代码实现:
importos paddlehubashub
huseg=hub.Module(name='deeplabv3p_xception65_humanseg')#加载模型
path='./imgs/'#文件目录
files=[path iforiinos.listdir(path)]#获取文件列表
results=huseg.segmentation(data={'image':files})#抠图
我将图片放在代码文件夹的同级目录 imgs 文件夹下,运行代码后,输出的抠图图片会自动放在代码同级目录的 humanseg_output 目录下,文件名称跟原图片的名称相同,但是文件格式是 png 。
我在 imgs 目录下放了5张图片,为了便于展示,我将他们放在一起截图:
原图片
运行程序后,在 humanseg_output 目录下生成了5张图片,同样的,我将他们放在一起截图:
抠图图片
我们可以看到程序将每张图片中的人物(可以是一个,也可以是多个)识别出来,并且抠出来成图,背景是白色。虽然有些细节处还有些许瑕疵,但是看起来还算不错。
总结:本文基于 paddlepaddle 平台,使用简单的五行代码实现了批量抠图,不仅解放了好多人的双手和双眼,而且为某些程序猿/程序媛的装逼工具箱提供了一件宝器。下次如果碰到某个女生或者闺蜜在为抠图发愁,别忘了掏出神器,赢得芳心哦!
在视频创作过程中,有时也会遇到人像抠图的需求,最一般的做法是使用PR、AE等工具将视频中的每一帧图像手动抠图。这么繁琐的步骤在理工男面前简直是不可存在的,那么有什么简单的方法能快速抠图吗?
当然有啦,接下来给大家介绍如何使用PaddleHub一键视频人像抠图。
效果展示
首先展示一些抠图完毕的小片段,上一秒我还在家里的小房间,下一秒我就出现在了土耳其。那顺便去看看埃菲尔铁塔呗。
到洛杉矶的海边散散步。
到上海欢乐谷锻炼锻炼身体。
最后到东京的观景台上看个日落
视频效果是不是很逼真呢,一天环游世界不是梦哈哈哈……
其实这些人像素材都是在房间里拍摄,然后使用PaddleHub工具库一键抠图,最后使用PR进行后期创作的,接下来介绍下如何操作吧。
这是如何实现的?
视频人像抠图跟上面是类似的,只要把视频的每一帧图像所含有的人像提取出来,然后加上背景重新合成视频就可以啦。大体的步骤知道了,那接下来开始实践吧。
哦对了,还得有一段含有人像的素材,小伙伴们可以自己拍摄或者从网络搜集。
01
安装必要组建
需要安装的是飞桨框架和PaddleHub工具库,安装步骤可以参考别再用PS了,我用5行Python代码就实现了批量抠图。或者直接阅读原文进入飞桨官网查看安装步骤。
02
人像抠图制作素材
由于目前PaddleHub人像抠图模型API的输入是单张图像的路径,故需要先将视频的每一帧图像分离存储后才能进行抠图。
当然也可以通过修改模型的源码,将API的输入修改成图像输入,这样就省去了视频分离存储的步骤,具体的源码可以参考:
https://aistudio.baidu.com/aistudio/projectdetail/370260,
这里主要介绍前一种方法。
2.1 导入所有相关模块importcv2
importos
importnumpyasnp
fromPILimportImage
importpaddlehubashub
2.2 将视频内图像分离存储
defCutVideo2Image(video_path img_path):
cap=cv2.VideoCapture(video_path)
index=0
while(True):
ret frame=cap.read()
ifret:
cv2.imwrite(img_path '%d.jpg'%index frame)
index =1
else:
break
cap.release()
print('Videocutfinish all%dframe'%index)
该步骤将会把每一帧图像保存到本地目录。
2.3 导入模型进行人像抠图defGetHumanSeg(frame_path out_path):
#加载模型
module=hub.Module(name="deeplabv3p_xception65_humanseg")
#配置
test_img_path=[os.path.join(frame_path fname)forfnameinos.listdir(in_path)]
input_dict={"image":test_img_path}
results=module.segmentation(data=input_dict output_dir=out_path)
# Tips:使用GPU加速需安装paddlepaddle-gpu
#results=module.segmentation(data=input_dict use_gpu=gpu batch_size=10 output_dir=out_path)
该步骤将会把人像提取并保存为png至本地
2.4 生成绿幕并与人像合成为什么要使用绿幕呢,主要是为了后续在视频后期软件里方便使用素材。当然熟悉Python的同学也可以直接使用一些Python模块进行视频后期。但是在这里还是推荐使用PR、AE这类专业软件,可以方便地对素材进行缩放、变速、位置处理、以及添加特效等操作。更重要的是,可以对素材进行调色,与新的背景更好地融合。
definit_canvas(width height color=(255 255 255)):
canvas=np.ones((height width 3) dtype="uint8")
canvas[:]=color
returncanvas
#生成绿幕
defGetGreenScreen(size out_path):
canvas=init_canvas(size[0] size[1] color=(0 255 0))
cv2.imwrite(out_path canvas)
defBlendImg(fore_image base_image output_path):
"""
将抠出的人物图像换背景
fore_image:前景图片,抠出的人物图片
base_image:背景图片
"""
#读入图片
base_image=Image.open(base_image).convert('RGB')
fore_image=Image.open(fore_image).resize(base_image.size)
#图片加权合成
scope_map=np.array(fore_image)[: : -1]/255
scope_map=scope_map[: : np.newaxis]
scope_map=np.repeat(scope_map repeats=3 axis=2)
res_image=np.multiply(scope_map np.array(fore_image)[: : :3]) np.multiply((1-scope_map) np.array(base_image))
#保存图片
res_image=Image.fromarray(np.uint8(res_image))
res_image.save(output_path)
defBlendHumanImg(in_path screen_path out_path):
humanseg_png=[filenameforfilenameinos.listdir(in_path)]
fori imginenumerate(humanseg_png):
img_path=os.path.join(in_path '%d.png'%(i))
output_path_img=out_path '%d.png'%i
BlendImg(img_path screen_path output_path_img)
该步骤完成后将会得到类似这样的绿幕图片:
defCompVideo(in_path out_path size):
fourcc=cv2.VideoWriter_fourcc(*'mp4v')
out=cv2.VideoWriter(out_path fourcc 30.0 size)
files=os.listdir(in_path)
foriinrange(len(files)):
img=cv2.imread(in_path '%d.png'%i)
out.write(img)#保存帧
out.release()
该步骤完成后即可得到类似下图的人体绿幕素材
#Config
Video_Path='video/0.mp4'
Video_Size=(1920 1080)
FrameCut_Path='video/frame/'
FrameSeg_Path='video/frame_seg/'
FrameCom_Path='video/frame_com/'
GreenScreen_Path='video/green.jpg'
ComOut_Path='output.mp4'
if__name__=="__main__":
#第一步:视频->图像
ifnotos.path.exists(FrameCut_Path):
os.mkdir(FrameCut_Path)
CutVideo2Image(Video_Path FrameCut_Path)
#第二步:抠图
ifnotos.path.exists(FrameSeg_Path):
os.mkdir(FrameSeg_Path)
GetHumanSeg(FrameCut_Path FrameSeg_Path)
#第三步:生成绿幕并合成
ifnotos.path.exists(GreenScreen_Path):
GetGreenScreen(Video_Size GreenScreen_Path)
ifnotos.path.exists(FrameCom_Path):
os.mkdir(FrameCom_Path)
BlendHumanImg(FrameSeg_Path GreenScreen_Path FrameCom_Path)
#第四步:合成视频
ifnotos.path.exists(ComOut_Path):
CompVideo(FrameCom_Path ComOut_Path Video_Size)
OK,绿幕素材都已经制作完毕,下一步就可以导入到后期软件内进行创作啦,这里以PR为例。
03
后期创作
将绿幕素材和背景素材导入PR,在绿幕素材上使用`超级键`效果,并将主要颜色选取为绿幕的颜色,即可轻松去除绿幕颜色。
再往后的各种骚操作就看各位小伙伴的想象力啦!
这里附上我的作品:[AI人像抠图]|百度PaddleHub抠图创意赛[附教程、代码]:
https://www.bilibili.com/video/BV1cA411b7r2
目前存在的问题:- 头发、手指等细节部分还需要进一步完善。
- 人体动作幅度大导致图像帧模糊,会造成提取失败。
- 模型的API接口有待继续丰富。