一、前言
现在有一些网站视频的弹幕会从人像后面穿过,要实现这种效果,一种简单的方法是通过物体分割算法对视频帧进行分割,记录下分割出来的人体边缘像素位置,当弹幕流动到这些像素位置时则不再显示。基于此,本文试图实现一个可以给视频添加简单3D效果的功能,效果如下:
二、Yolact简介
YolAct是一种基于神经网络的分割算法,其优势在于实时性较好。算法的整体结构如下图所示:
网络基础骨架为ResNet101,采用经典的FPN进行特征融合。网络的创新点在于增加了的prorotype分支进行不同位置和前景背景分割的预测,并且在FPN的预测部分,也增加了分割的一个分支。使用FPN处分割的分支预测的权值和prorotype mask结合,生成每一个anchor对应的mask分割结果。
三、实现
使用基于NCNN开源库的实现,NCNN是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖且跨平台。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行。在其开源的例子程序中就已经实现了Yolact的推理计算。本文在此基础上添加后处理以实现3D效果的功能。
(1)类设计
通过继承MediaHandler实现VideoHandler和ImageHandler分别处理视频和图像,定义DetectorManager和EffectManager用于管理和创建不同的目标检测器和不同的效果,本文目前仅实现了YolactDetector和Effect3d的效果类。定义的类图如下所示:
(2)3D效果
简单的3D效果是给图像帧画两条白线,当目标从左到右移动时,左线一直保持,右线根据目标的分割位置进行动态调整。同理,当目标从右到左移动时,右线一直保持,左线根据目标位置调整。所以,需要根据目标移动的方向由用户指定使用哪一种。
(3)编译与使用
在Linux环境下:
git clone https://github.com/Oreobird/effect3d
mkdir build && cd build && cmake .. && make
命令选项:
./effect3d --file hand.wmv 输入的文件名
--video hand3d.mp4 输出的文件名
--detector yolact 使用的检测器
--effect lr 目标移动方向 lr 从左到右,rl从右到左
--target person 指定检测的目标
四、总结
本文在NCNN实现的Yolact基础上,对检测与分割得到的目标边缘添加后处理,实现了一个简单的3D效果。
网友评论