点击上方小白学视觉”,选择加"星标"或“置顶
重磅干货,第一时间送达

创作背景

“飞雪连天射白鹿,笑书神侠倚碧鸳”,相信很多90后知道这副对联的含义,这是武侠小说作家金庸先生的作品合集,说实话在所有的作品中我最喜欢的是倚天屠龙记和天龙八部,应该说基本都喜欢,但是这两部中的爱恨情仇最为突出,倚天屠龙记中周芷若和赵敏,张无忌,再到天龙八部中的乔峰。

说起来武侠小说中的武林高手是真的帅!现在的电影制作技术越来越高超了,武术特效做的效果的做的真的很酷炫。最为酷炫的一个是残影特效,说到残影特效,我们直接上效果!


‍‍以上是天龙八部中的灵鹫宫宫主虚竹与鸠摩智进行比武时的武功展示,看得出来残影效果真的给人一种感觉武功深不可测的感觉,那种这种酷炫的残影效果是怎么实现的呢?今天就让我们使用百度开源的深度学习框架飞桨来实现这样的视频残影效果。
在实践历程中我们使用了Paddle框架所集成的Paddlehub的深度学习模型库,Paddlehub中包含了很多的深度学习的预训练模型,包含图像分类,目标检测,GAN图像风格迁移,在本次的视频残影生成中所使用的是deeplabv3p_xception65预训练模型,其原始用途是用来实现视频的语义分割,将其OpenCV的后续处理进行搭配,即可实现我们所说的“残影”了!

算法实现过程

算法实现环境:

百度AIstudio深度学习平台,Python3.7,Paddlepaddle1.8.4
步骤1:安装Paddlehub深度学习模型库,使用pip在jupyter notebook进行安装操作。
!pip install paddlehub==1.6.2 -i https://mirror.baidu.com/pypi/simple
步骤2:导入运行需要使用的Python工具包

import
 numpy
as
 np //导入数据科学报numpy

import
 os  

import
 paddlehub
as
 hub

import
 cv2

from
 moviepy.editor
import
 VideoFileClip  //导入视频分帧工具

from
 tqdm
import
 tqdm //导入终端输出进度条

import
 copy
步骤3:指定GPU编号,AIstudio上为单机单卡因此,只存在GPU:0

os.environ["CUDA_VISIBLE_DEVICES"]="0"
步骤4:进行残影效果的推理代码编写与模型的运行:

def do_seg(module, frame):

    result = module.segmentation(images=[frame],use_gpu=True)

return
 result[
0
][
'data'
]


module = hub.Module(name=
"deeplabv3p_xception65_humanseg"
)


originname =
"test.mp4"   //test.mp4为原始的输入视频
resultname =
"test_result.mp4"  //test_result.mp4为处理后的残影视频
shadowcount =
9

cap = cv2.VideoCapture(originname) //将视频转换为图片流处理

fps =
int
(cap.
get
(cv2.CAP_PROP_FPS))

width =
int
(cap.
get
(cv2.CAP_PROP_FRAME_WIDTH))

height =
int
(cap.
get
(cv2.CAP_PROP_FRAME_HEIGHT))

framecount =
int
(cap.
get
(cv2.CAP_PROP_FRAME_COUNT))


fourcc = cv2.VideoWriter_fourcc(*
'mp4v'
)

out = cv2.VideoWriter(resultname, cv2.VideoWriter_fourcc(
'M'
,
'J'
,
'P'
,
'G'
), fps, (width, height))


tmpres = []


forindex
 in tqdm(
range
(framecount)):

ret
, frame = cap.
read
()

if
 not re
t:
break
    seg_mask = np.around(do_seg(module,frame) /
255
)

    seg_mask3 = np.
repeat
(seg_mask[:,:,np.newaxis],
3
, axis=
2
)

    background =
copy
.
deepcopy
(frame)

    stbackground =
copy
.
deepcopy
(frame)

iflen
(tmpres) > shadowcoun
t:
        tmpres = tmpres[
1
:]

    # tmpres.
append
([
copy
.
deepcopy
(seg_mask3),
copy
.
deepcopy
(cv2.GaussianBlur(seg_mask3 * background,(
9
,
9
),
0
))])

    tmpres.
append
([
copy
.
deepcopy
(seg_mask3),
copy
.
deepcopy
(seg_mask3 * background)])

    thuman =
copy
.
deepcopy
(seg_mask3 * background)

ifindex
 >
len
(tmpres):

for
 fi, [t_mask3, t_human] in enumerate(tmpres):

            background = t_human * (fi +
1
) /
len
(tmpres) + t_mask3 * (
len
(tmpres) -
1
 - fi) /
len
(tmpres) * stbackground + (
1
 - t_mask3) * background

    result = background.astype(np.uint8)

    out.
write
(result)

cap.release()

out.release()
可以看出,在本项目中调用了deeplabv3p_xception65模型,其原理很简单,是使用deeplabv3p_xception65模型进行图像中的人物与背景进行图像分割分离,在整个的视频流中,将处理当前帧的图片,同时与上一张的图片中使用deeplabv3p_xception65模型进行语义分割所得到人物实体部分进行同时显示播放,从而达到“影片残影”的表现效果!

实际测试效果

这是李小龙传奇中第36集,李小龙与独臂人的决斗画面,独臂人是李小龙在全剧中唯一输掉的一个对手,快点开看看,加上“残影效果”后的对决场面效果如何吧!

最后感谢ninetailskim大佬做的开源代码贡献,欢迎关注他的AIstudio社区,点击阅读全文即可。同时读者如果有更好的武侠片段,也可以自己试一试,欢迎和我交流哦~!
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
继续阅读
阅读原文