python视频处理代码_Python装逼指南——五行代码实现批量抠图,附视频抠图

你是否曾经想将某张照片中的人物抠出来,然后拼接到其他图片上去,从而可以即使你在天涯海角,我也可以到此一游?

专业点的人使用 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 环境,运行如下代码:

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) [Clang 6.0 (clang-600.0.57)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import paddle.fluid>>> paddle.fluid.install_check.run_check()Running Verify Paddle Program ... Your Paddle works well on SINGLE GPU or CPU.I0506 21:47:48.657404 2923565952 parallel_executor.cc:440] The Program will be executed on CPU using ParallelExecutor, 2 cards are used, so 2 programs are executed in parallel.W0506 21:47:48.658407 2923565952 fuse_all_reduce_op_pass.cc:74] Find all_reduce operators: 2. To make the speed faster, some all_reduce ops are fused during training, after fusion, the number of all_reduce ops is 1.I0506 21:47:48.658516 2923565952 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1I0506 21:47:48.659137 2923565952 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = TrueI0506 21:47:48.659595 2923565952 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0Your Paddle works well on MUTIPLE GPU or CPU.Your Paddle is installed successfully! Let's start deep Learning with Paddle now>>>

看到 Your Paddle is installed successfully 就表示安装成功了。

我们接下来需要使用的是这个平台的 paddlehub 工具,所以我们还需要安装 paddlehub :

pip install -i https://mirror.baidu.com/pypi/simple paddlehub

安装完成后,我们就可以开始运用了。

代码实现

我们的实现步骤很简单:导入模块 -> 加载模型 -> 获取图片文件 -> 调用模块抠图。

下面我们看代码实现:

import os, paddlehub as hubhuseg = hub.Module(name='deeplabv3p_xception65_humanseg') # 加载模型path = './imgs/' # 文件目录files = [path + i for i in os.listdir(path)] # 获取文件列表results = huseg.segmentation(data={'image': files}) # 抠图

我将图片放在代码文件夹的同级目录 imgs 文件夹下,运行代码后,输出的抠图图片会自动放在代码同级目录的 humanseg_output 目录下,文件名称跟原图片的名称相同,但是文件格式是 png 。

我在 imgs 目录下放了5张图片,为了便于展示,我将他们放在一起截图:

810a19d8bc3eb13555ec910584e5bbd4fc1f4462.jpeg?token=abe130c9a586bbebeb26ae33714d0414

运行程序后,在 humanseg_output 目录下生成了5张图片,同样的,我将他们放在一起截图:

42a98226cffc1e17bfac2e6e686be504728de964.jpeg?token=52b34147ba1b307b525a1be7c830d821

我们可以看到程序将每张图片中的人物(可以是一个,也可以是多个)识别出来,并且抠出来成图,背景是白色。虽然有些细节处还有些许瑕疵,但是看起来还算不错。

总结:

本文基于 paddlepaddle 平台,使用简单的五行代码实现了批量抠图,不仅解放了好多人的双手和双眼,而且为某些程序猿/程序媛的装逼工具箱提供了一件宝器。下次如果碰到某个女生或者闺蜜在为抠图发愁,别忘了掏出神器,赢得芳心哦!

在视频创作过程中,有时也会遇到人像抠图的需求,最一般的做法是使用PR、AE等工具将视频中的每一帧图像手动抠图。这么繁琐的步骤在理工男面前简直是不可存在的,那么有什么简单的方法能快速抠图吗?

当然有啦,接下来给大家介绍如何使用PaddleHub一键视频人像抠图。

效果展示

首先展示一些抠图完毕的小片段,上一秒我还在家里的小房间,下一秒我就出现在了土耳其。

0538bd13ae496dc546bf5e5525cc4559.gif

那顺便去看看埃菲尔铁塔呗。

a2756f7be21c76d57270929ea64889a6.gif

到洛杉矶的海边散散步。

6889d1c59bd91ae94743a079bfcbb43f.gif

到上海欢乐谷锻炼锻炼身体。

a90ff1bec50a2a1bbdb669405150c1fc.gif

最后到东京的观景台上看个日落

f04d6de87b5cc974ad880ae15400fe4e.gif

视频效果是不是很逼真呢,一天环游世界不是梦哈哈哈……

其实这些人像素材都是在房间里拍摄,然后使用PaddleHub工具库一键抠图,最后使用PR进行后期创作的,接下来介绍下如何操作吧。

这是如何实现的?

视频人像抠图跟上面是类似的,只要把视频的每一帧图像所含有的人像提取出来,然后加上背景重新合成视频就可以啦。大体的步骤知道了,那接下来开始实践吧。

哦对了,还得有一段含有人像的素材,小伙伴们可以自己拍摄或者从网络搜集。

01

安装必要组建

需要安装的是飞桨框架和PaddleHub工具库,安装步骤可以参考别再用PS了,我用5行Python代码就实现了批量抠图。或者直接阅读原文进入飞桨官网查看安装步骤。

02

人像抠图制作素材

由于目前PaddleHub人像抠图模型API的输入是单张图像的路径,故需要先将视频的每一帧图像分离存储后才能进行抠图。

当然也可以通过修改模型的源码,将API的输入修改成图像输入,这样就省去了视频分离存储的步骤,具体的源码可以参考:

https://aistudio.baidu.com/aistudio/projectdetail/370260,

这里主要介绍前一种方法。

2.1 导入所有相关模块

import cv2import osimport numpy as npfrom PIL import Imageimport paddlehub as hub

2.2 将视频内图像分离存储

def CutVideo2Image(video_path, img_path):cap = cv2.VideoCapture(video_path) index = 0 while(True): ret,frame = cap.read() if ret: cv2.imwrite(img_path + '%d.jpg' % index, frame) index += 1 else: break cap.release() print('Video cut finish, all %d frame' % index)

该步骤将会把每一帧图像保存到本地目录。

2.3 导入模型进行人像抠图

def GetHumanSeg(frame_path, out_path):# 加载模型 module = hub.Module(name="deeplabv3p_xception65_humanseg") # 配置 test_img_path = [os.path.join(frame_path, fname) for fname in os.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这类专业软件,可以方便地对素材进行缩放、变速、位置处理、以及添加特效等操作。更重要的是,可以对素材进行调色,与新的背景更好地融合。

def init_canvas(width, height, color=(255, 255, 255)):canvas = np.ones((height, width, 3), dtype="uint8") canvas[:] = color return canvas# 生成绿幕def GetGreenScreen(size, out_path): canvas = init_canvas(size[0], size[1], color=(0, 255, 0)) cv2.imwrite(out_path, canvas)def BlendImg(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)def BlendHumanImg(in_path, screen_path, out_path): humanseg_png = [filename for filename in os.listdir(in_path)] for i, img in enumerate(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)

该步骤完成后将会得到类似这样的绿幕图片:

dcc451da81cb39db1fb4acc4f0ed1a23aa18302a.jpeg?token=1610d737c3820fb3dd834d73b6cd93ec

2.5 视频合成

def CompVideo(in_path, out_path, size):fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter(out_path,fourcc, 30.0, size) files = os.listdir(in_path) for i in range(len(files)): img = cv2.imread(in_path + '%d.png' % i) out.write(img) # 保存帧 out.release()

该步骤完成后即可得到类似下图的人体绿幕素材

81ede3453323067b2bb273dc7f70125b.gif

2.6 主程序

# ConfigVideo_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__":# 第一步:视频->图像 if not os.path.exists(FrameCut_Path): os.mkdir(FrameCut_Path) CutVideo2Image(Video_Path, FrameCut_Path) # 第二步:抠图 if not os.path.exists(FrameSeg_Path): os.mkdir(FrameSeg_Path) GetHumanSeg(FrameCut_Path, FrameSeg_Path) # 第三步:生成绿幕并合成 if not os.path.exists(GreenScreen_Path): GetGreenScreen(Video_Size, GreenScreen_Path) if not os.path.exists(FrameCom_Path): os.mkdir(FrameCom_Path) BlendHumanImg(FrameSeg_Path, GreenScreen_Path, FrameCom_Path) # 第四步:合成视频 if not os.path.exists(ComOut_Path): CompVideo(FrameCom_Path, ComOut_Path, Video_Size)

OK,绿幕素材都已经制作完毕,下一步就可以导入到后期软件内进行创作啦,这里以PR为例。

03

后期创作

将绿幕素材和背景素材导入PR,在绿幕素材上使用`超级键`效果,并将主要颜色选取为绿幕的颜色,即可轻松去除绿幕颜色。

1e4407fc6d847668e2d6f27a79539f3a.gif

再往后的各种骚操作就看各位小伙伴的想象力啦!

这里附上我的作品:[AI人像抠图]|百度PaddleHub抠图创意赛[附教程、代码]:

https://www.bilibili.com/video/BV1cA411b7r2

目前存在的问题:

头发、手指等细节部分还需要进一步完善。人体动作幅度大导致图像帧模糊,会造成提取失败。模型的API接口有待继续丰富。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值