【机器学习】视频3D效果实现

  • 2020 年 10 月 19 日
  • AI

一、前言

现在有一些网站视频的弹幕会从人像后面穿过,要实现这种效果,一种简单的方法是通过物体分割算法对视频帧进行分割,记录下分割出来的人体边缘像素位置,当弹幕流动到这些像素位置时则不再显示。基于此,本文试图实现一个可以给视频添加简单3D效果的功能,效果如下:

「机器学习」视频3D效果实现

二、Yolact简介

YolAct是一种基于神经网络的分割算法,其优势在于实时性较好。算法的整体结构如下图所示:

「机器学习」视频3D效果实现

网络基础骨架为ResNet101,采用经典的FPN进行特征融合。网络的创新点在于增加了的prorotype分支进行不同位置和前景背景分割的预测,并且在FPN的预测部分,也增加了分割的一个分支。使用FPN处分割的分支预测的权值和prorotype mask结合,生成每一个anchor对应的mask分割结果。

三、实现

使用基于NCNN开源库的实现,NCNN是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖且跨平台。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行。在其开源的例子程序中就已经实现了Yolact的推理计算。本文在此基础上添加后处理以实现3D效果的功能。

(1)类设计

通过继承MediaHandler实现VideoHandler和ImageHandler分别处理视频和图像,定义DetectorManager和EffectManager用于管理和创建不同的目标检测器和不同的效果,本文目前仅实现了YolactDetector和Effect3d的效果类。定义的类图如下所示:

「机器学习」视频3D效果实现

(2)3D效果

简单的3D效果是给图像帧画两条白线,当目标从左到右移动时,左线一直保持,右线根据目标的分割位置进行动态调整。同理,当目标从右到左移动时,右线一直保持,左线根据目标位置调整。所以,需要根据目标移动的方向由用户指定使用哪一种。

(3)编译与使用

在Linux环境下:

git clone //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效果。