【機器學習】影片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效果。