VTuberSys開発めも

VTuberシステムの開発関連めも

既存技術調査:ポーズ推定:ThreeDPoseTracker 処理内容調査めも

ThreeDPoseTrackerの処理内容調査のめも

ThreeDPoseTracker

github.com
概要:カメラ画像をつかってポーズ推定
使用技術:Unity , ニューラルネットワーク , Barracuda

使用ニューラルネットワークモデル

HighQualityTrainedModel.nn
tensorflow_to_barracuda.pyで変換したTensorflowモデル
input:3x448x448 が3つ

簡易版NN
input:3x224x224が1つ

Barracuda

Unityでニューラルネットワークを処理するライブラリ
CPUやGPUでNNを実行できる
いろいろなNNモデル形式のデータを読み込める



ThreeDPoseTrackerの前バージョン

github.com
ニューラルネットワークモデルがonnx形式


使用ニューラルネットワークモデル

Resnet34_3inputs_448x448_20200417.onnx
114MB
おそらくResnetの34レイヤー版
ジョイント数 24
HeatMapCol 28
input:1x3x448x448 が 3つ(カラー画像448x448を3枚。連続する3フレーム分)
output: 1x2x24x28x28 1x24x28x28 1x3x24x28x28x28 1x24x28x28x28

入力
    private void UpdateVNectModel()
    {
        input = new Tensor(videoCapture.MainTexture);
        if (inputs[inputName_1] == null)
        {
            inputs[inputName_1] = input;
            inputs[inputName_2] = new Tensor(videoCapture.MainTexture);
            inputs[inputName_3] = new Tensor(videoCapture.MainTexture);
        }

ビデオキャプチャ画像3フレームを入力にわたしている
入力画像サイズ448x448

出力
offset3D = b_outputs[2].data.Download(b_outputs[2].data.GetMaxCount());
heatMap3D = b_outputs[3].data.Download(b_outputs[3].data.GetMaxCount());

出力は1、2個目は未使用で3つ目をオフセット、4つ目をヒートマップとして利用

出力からジョイントの座標への計算

Assets/Scripts/VNectBarracudaRunner.csでNN処理してる
PredictPose()で実行している
まず24個のジョイント毎に、ヒートマップ3Dデータから最大を探す。(大ざっぱに座標を決定)
次に、その位置のオフセットデータを使って座標値の調整。
その他のジョイント位置は計算で算出。
カルマンフィルタで座標値のノイズを軽減。
という感じっぽい。

パフォーマンス

RTX2080super 30fps
RTX1070 20fps

2013/02/19 [GPU][spec] GTX TITAN 4709GFLOPS
2013/05/30 [GPU][spec] GTX770 3333GFLOPS
2014/09/19 [GPU][spec] GTX970 3920GFLOPS
2016/07/19 [GPU][spec] GTX1060 3855 GFLOPS
2017/12/07 [GPU][spec] TITAN V 14899 GFLOPS FP32
2019/04/-- [GPU][spec] GTX1650 2984 GFLOPS FP32
2018/10/-- [GPU][spec] GTX2070 7465 GFLOPS FP32
2018/09/-- [GPU][spec] GTX2080 10070 GFLOPS FP32
2019/07/-- [GPU][spec] GTX2080super 11150 GFLOPS FP32





ONNX(Open Neural Network eXchange)

ニューラルネットワークのモデルを定義するためのオープンフォーマット
ファイル名 *.onnx

github.com
ONNXモデル集

models/vision/classification/resnet at master · onnx/models · GitHub
ResNetのonnx

python3でonnxの確認

pip3 install onnx

import onnx
model = onnx.load("model_file_path.onnx")
model.graph.input

でグラフの情報をとれる

ResNet

ResNetの仕組み
機械学習論文読み:Deep Residual Learning for Image Recognition - Qiita
ニューラルネットワークの構造の1つ。
Residual networkのこと
2015年ごろImageNetに登場 
深いニューラルネットの学習を適切に行えるようにネット構造を改良したもの。少し前の層の値をバイパスして利用するネット構造。
従来は十数層以上にするとエラーが増えていたが、ResNetだと層を増やすことでエラーを減らせるようになった。1202層では少し悪化する
学習が長いという欠点あり。2015年ごろ152層でGPU8枚で数週間

計算量

VGG-19のモデル。計算量は19.6 GFlops
Residual network付きの34レイヤ。計算量は3.6GFlops

ImageNet

画像用のNNコンテスト コンペティション
ImageNet データベース [1]