---
title: "AIとAzure Kinectでどこでもグリーンバックを実現する「Virtual Stage」を試してみた"
emoji: "📝"
type: "tech"
topics: ["Azure Kinect", "N"]
published: true
published_at: "2020-06-01 01:08"
cover: "./20200601003345.jpg"
category: "info"
author: "中村 薫"
description: "コロナ禍でイベントがバーチャル化するなか、いままでのオフラインイベントのようなステージ上での講演のような動画を作成できる「Virtual Stage」が発表されました。なお、リアルタイムではなく録画データを使用した後処理になります。 www"
original_url: "https://blog.hololab.co.jp/entry/2020/06/01/010830"
---
![](./20200601003345.jpg)

コロナ禍でイベントがバーチャル化するなか、いままでのオフラインイベントのようなステージ上での講演のような動画を作成できる「Virtual Stage」が発表されました。なお、リアルタイムではなく録画データを使用した後処理になります。

<iframe width="480" height="270" src="https://www.youtube.com/embed/nUnmqhGxCEE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=nUnmqhGxCEE&feature=youtu.be)

オープンソースなので機材を準備すれば誰でも同じ動画を作成することがきでます。

<https://github.com/microsoft/ailab/tree/master/VirtualStage>

[github.com](https://github.com/microsoft/ailab/tree/master/VirtualStage)

実際に作ってみた動画がこちらです

<iframe width="480" height="270" src="https://www.youtube.com/embed/542O49v2VQM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=542O49v2VQM)

撮影環境はこのようになっています。真っ白な壁に向かってAzure Kinectで撮影します。

![f:id:kaorun55:20200601001417j:plain](./20200601001417.jpg)

# 環境

環境はこのようになっています(画像はGitHubより引用) PCにAzure Kinectを2台接続しています(なお、Azure Kinectは1台でも最後まで動作します)

![f:id:kaorun55:20200601001525p:plain](./20200601001525.png)

この環境で「Speaker.Recorder」を起動すると、Azure Kinectの録画(カラー、深度)と、PowerPointのスライド録画と音声が、それぞれ記録されます。

![f:id:kaorun55:20200601001611p:plain](./20200601001611.png)

撮影したAzure Kinectの録画データを「Background Matting」というソフトウェアを使用して背景の除去を行います。

![f:id:kaorun55:20200601001628p:plain](./20200601001628.jpg)

「Background Matting」は下記をベースに、Azure Kinectの深度データを使って除去の精度を向上させているようです。

<http://grail.cs.washington.edu/projects/background-matting/>

[grail.cs.washington.edu](http://grail.cs.washington.edu/projects/background-matting/)

# 撮影手順

撮影の手順は大きく下記のようになります。

## 流れ

### 準備

-   ハードウェア
    -   NVIDIAのGPUが搭載されたPC
        -   Azure Kinect BodyTracking SDKを使用しているためNVIDIAのGPU(CUDA)が必要です
    -   Azure Kinect
-   各種ソフトウェアのインストール
    -   「Speaker.Recorder」のビルドに必要なソフトウェアの設定
    -   「Background Matting」の実行に必要なソフトウェアの設定

### 撮影

-   「Speaker.Recorder」で講演を記録します
-   「Background Matting」で講演者の背景を除去した動画を作成します
-   背景が除去された動画を使用して、講演動画を作成します

## 準備

GitHubからプロジェクトをダウンロードします。

<https://github.com/microsoft/ailab/tree/master/VirtualStage>

[github.com](https://github.com/microsoft/ailab/tree/master/VirtualStage)

### Speaker.Recorder

「Speaker.Recorder.sln」を開き「Speaker.Recorder」をスタートアッププロジェクトに設定してビルドします。

![f:id:kaorun55:20200601002716p:plain](./20200601002716.png)

ビルド環境は下記になります。

-   Windows 10 64 ビット版 version 1903 以降
-   Windows 10 SDK 10.0.18362
-   Visual Studio 2019 16.5.5

アプリケーションの実行には下記が必要です

-   Windows 10 64 ビット版 バージョン 1903 以降
-   [.Net Core 3.1 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-desktop-3.1.3-windows-x64-installer)
-   [HEVC Video Extensions](https://www.microsoft.com/en-us/p/hevc-video-extensions-from-device-manufacturer/9n4wgh0z6vhq)
-   [Visual C++ Redistributable](https://aka.ms/vs/16/release/VC_redist.x64.exe)

### Background Matting

Background MattingはPythonのスクリプトです。ここでAzure Kiectの録画データを使って背景除去を行います。

環境構築はちょっと手間がかかります。

-   Windows 10 x64 と NVIDIA のグラフィックカード
-   NVIDIA CUDA 10.0 と NVIDIA CudNN をインストールする(CudNNはcudnn64\_7.dllを「BackgroundMatting」フォルダにコピーする)
-   Conda 環境のインストール
    
    -   [miniconda](https://docs.conda.io/en/latest/miniconda.html)をインストールする
    -   PowerShellでBackgroundMattingフォルダへ移動し初期化と環境設定を行う
    
    `conda init exit conda env create -f .\environment.yaml`
    
-   OpenCV 4.3.0
    
    -   [OpenCV 4.3.0](https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-vc14_vc15.exe/download) をダウンロードする
    -   _3rdparty/opencv_ フォルダに展開する(訳注: ほかの環境でも利用する場合はCドライブ直下などでパスを通した方がよい)
    -   `[ROOT]\3rdparty\opencv\build\x64\vc15\bin` にパスを通す
-   FFMPEG 4.2.2
    -   [ffmpeg 4.2.2](https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-4.2.2-win64-static.zip) をダウンロードする
    -   _3rdparty/ffmpeg-4.2.2_ フォルダに展開する(訳注: ほかの環境でも利用する場合はCドライブ直下などでパスを通した方がよい)
    -   `[ROOT]\3rdparty\ffmpeg-4.2.2\bin` にパスを通す
-   Visual C++ Redistributable
    -   [ダウンロード](https://aka.ms/vs/16/release/VC_redist.x64.exe) してインストールする
-   推論モデル
    -   [推論モデル](https://drive.google.com/drive/folders/1WLDBC_Q-cA72QC8bB-Rdj53UB2vSPnXv?usp=sharing) をダウンロードする
    -   「BackgroundMatting」の _Models\\_ フォルダに配置する
-   Azure Kinect SDK 1.4.0
    -   [ダウンロード](https://download.microsoft.com/download/4/5/a/45aa3917-45bf-4f24-b934-5cff74df73e1/Azure%20Kinect%20SDK%201.4.0.exe) してインストールする
    -   環境変数 `PATH` に `C:\Program Files\Azure Kinect SDK v1.4.0\sdk\windows-desktop\amd64\release\bin` フォルダを追加する
-   Azure Kinect Body Tracking SDK 1.0.1
    -   [ダウンロード](https://www.microsoft.com/en-us/download/details.aspx?id=100942) してインストールする
    -   環境変数 `PATH` に `C:\Program Files\Azure Kinect Body Tracking SDK\sdk\windows-desktop\amd64\release\bin` フォルダを追加する

## 撮影

最初に「Speaker.Recorder」で講演の記録を行います。

「Speaker.Recorder」を実行すると、PowerPointの選択(必要な場合)、背景の記録、撮影、後処理の順で進んでいきます。

講演に使用するPowerPointファイルを指定すると、スライドと音声が記録された動画もAzure Kinectの録画ファイルと一緒に生成されます。

![f:id:kaorun55:20200601003721p:plain](./20200601003721.png)

PowerPointファイルを開いた時にこのようなエラーがよく発生します。アプリを再起動して直ることもありますが、場合によってはスライドを作り直す必要もあるかもしれません。

![f:id:kaorun55:20200601003739p:plain](./20200601003739.png)

録画が完了するとドキュメントフォルダの「Recorded Sessions」に記録された動画が保存されます。

-   kinect0.mkv: Azure Kinectの録画データ(mkvファイル)
-   presentation.mp4: スライドと音声の動画
-   slides.pptx: 実際のスライドファイル

![f:id:kaorun55:20200601004101p:plain](./20200601004101.png)

続いて「Background Matting」を実行します。「BackgroundMatting」フォルダの「run.ps1」が実行用のスクリプトです。

これを開くと下記のようになっています。--input および --outputを指定します。 全体を変換する場合 --startおよび--durationは削除します(この時「--fixed\_threshold "640," ’」の最後の「’」は削除します)。

conda activate bgmatting
$Env:CUDA\_VISIBLE\_DEVICES=0
python .\\bg\_matting.py \`
  --name "Speaker" \`
  --input D:\\Speaker\\ \`
  --output\_dir D:\\Speaker\\output\\ \`
  --fixed\_threshold "640," \`
  --start 34 \`
  --duration 234
conda deactivate

スクリプトが正常に終了すると --output で指定したフォルダに背景除去された動画が生成されます。

![f:id:kaorun55:20200601005937p:plain](./20200601005937.png)

-   kinect0\_color\_Speaker.mp4: オリジナル動画
-   kinect0\_matte\_Speaker.mp4: 背景が除去された動画
-   kinect0\_out\_Speaker.mp4: マスク動画

## 編集

kinect0\_matte\_Speaker.mp4を動画編集ツールなどでグリーンバック動画として利用します。

完成した動画がこちら。背景やスライドの重ね合わせについては、いろいろアイデアがでそうですね。

<iframe width="480" height="270" src="https://www.youtube.com/embed/542O49v2VQM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=542O49v2VQM)

# 参考

元の動画を並べたもの

<iframe width="480" height="270" src="https://www.youtube.com/embed/videoseries?list=PLcIuMEVR3eYd_AMHZRYAu5mYXoDIYETZA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=E_OAUeTsLJA&list=PLcIuMEVR3eYd_AMHZRYAu5mYXoDIYETZA&index=2&t=0s)

背景除去を行った動画

<iframe width="480" height="270" src="https://www.youtube.com/embed/jqgLampAPyc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=jqgLampAPyc)

編集後1

<iframe width="480" height="270" src="https://www.youtube.com/embed/0FyQr-cndr8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=0FyQr-cndr8)

編集後2

<iframe width="480" height="270" src="https://www.youtube.com/embed/542O49v2VQM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=542O49v2VQM)
