見出し画像

【技術解説】DeepLabのセマンティックセグメンテーションとTouchDesignerを用いた映像制作

こんにちは!デザイニウムのBBOY/エンジニアの平澤@eatora22)です。今回は機械学習の技術を活用した映像制作の例をご紹介しようと思います!

はじめに

まずは以下の動画をご覧ください。

こちらの映像は、人物や自動車といった画像内の物体領域を識別してくれるセマンティックセグメンテーション(Semantic Segmentation)という機械学習の手法を用いて制作しました。ピクセル単位で識別された物体に対して視覚的なエフェクトを加えることで不思議な映像に仕上がりました!

最近話題となったミュージックビデオ「Squarepusher - Terminal Slam」においても同様の技術が一部使われているそうです。今回の技術選定においても参考にさせていただきました。詳しくは以下のURLをご参照ください。

【追記】インスタンスセグメンテーション用の機械学習モデルであるYOLACT++の記事も書いたのでぜひご参照ください。

技術紹介

セマンティックセグメンテーションにはTensorFlowのリポジトリのDeepLab v3+モデルを利用します。ライセンスは「Apache License 2.0」となっており誰でも自由に使用することができます。リポジトリの中にはdeeplab_demo.ipynbというデモ用のノートブックファイルが入っているので、こちらを実行するとサンプル画像に対するセグメンテーションの結果を確認することができます。

画像3

補足として、モデルへの入力画像は513×513以内のサイズにおさめる必要があります(上記デモでは自動でリサイズ処理をしてくれるみたいです)。また出力結果として、画像入力サイズのピクセル数分のクラス分類したインデックス番号(NumPy配列)が返されます。これは簡単に言うと、画像のピクセルごとに「この部分は人」「こっちは車」というように識別しているということになります。何故そういったことが分かるのかというと、畳み込み演算を用いて周囲のピクセル情報を元に識別対象のピクセルがどの物体に該当するのか判断しているためです(実際のモデル構造はより複雑ですが……)。デフォルトではbackground(背景)を含む21個のカテゴリに分類することができます('background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tv')。※これらはモデルの学習条件に依存します。

今回はdeeplab_demo.ipynbをベースにWebカメラ&動画ファイルに対してもセグメンテーションできるように改造しました。以下の動画ではDeepLabで実行できるMobileNetv2Xceptionという二つのネットワークで各々学習したモデルの推論結果を比較しています。※tensorflow-gpuを使いWindows機のGPU上(GeForce RTX2070 MAX-Q Design)で動作確認。

動画を見て比較すると、MobileNetv2の方が推論処理が速い代わりに精度が落ち、Xceptionの方は処理が遅い代わりに精度が良いことが分かります。これは前者のネットワークがモバイルデバイス上での動作を目的として設計されているのに対し、後者はサーバー上での動作を目的としているためでもあります。

ここで、BodyPixというこちらもTensorFlowによる人物のセグメンテーション用モデルと比較してみましょう。動作環境やセグメンテーションの対象が異なるので純粋な比較はできないのですが、両方気になる方のために簡単ながら以下の表を用意してみました。

画像1

表に関していくつか補足しておくと、DeepLabの識別対象や画像入力サイズは学習条件に依存します。BodyPixでは画像内の人物のID情報も得ることができます。また、画像の入力サイズを大きくするほど精度が良くなりますが処理に時間がかかります。精度や処理速度についてはDeepLabの方が総じて良い印象を受けたのですが、BodyPixはブラウザ上で動作するため環境構築という点ではとても楽でおすすめです(もし間違いがありましたらコメントで教えていただけると幸いです)。

加えて、BodyPixを使った制作例もご紹介しておきます。ちなみにこちらはTensorFlowやGoogle Developersアカウントでもご紹介いただきました。

DeepLabではMobileNetv3など別のネットワークや独自で用意したデータセットを使っての学習も可能です。私は公式で事前に用意されていた学習済みモデル(pbファイル)しか確認していないので、余裕のある方は是非試してみてください(詳しくは以下のページを参考)。

制作過程

DeepLabの出力結果を使って実際にビジュアルエフェクトを加えるまでの流れをご紹介します。以下の図をご覧ください。

画像2

先ほど、モデルからはピクセル数分のインデックス番号が出力されると書きましたが、外部ソフトウェアでエフェクトをかけるためにはそのデータをやり取りする仕組みが必要です(モデルが動作しているPython上だけで完結させる分には特に必要ありません)。そのデータ共有処理の実装は大変そうですし、処理負荷も大きくなりそうだったので、今回はDeepLab側から画像の該当部分をマスクした映像を出力しクロマキー合成でエフェクトを付加できるような仕組みを考えました。マスク色は一つにそろえる必要があるので、モデルが出力したインデックス情報を「背景orその他」「人orそれ以外」というように変換する処理も実装しました。

また、DeepLab側ではマスク画像を動画ファイルとして出力する機能Spout for Pythonを使ってマスク映像をリアルタイムで共有する機能を実装しました。ただし後者の場合、モデルの推論処理速度を考慮するとより速いMobileNetv2を使った方が良さそうです。

参考までに、Webカメラ映像にエフェクトをリアルタイムで付加した例も載せておきます。ちなみに、TouchDesigner側ではChroma Key TOPを使ってマスク部分を透過させることが可能です。

最後にTouchDesigner側でエフェクトを付加する際に参考にさせていただいたチュートリアルをご紹介します。動画の1カットごとに違うエフェクトを用意したのでなかなか大変でした……

Noise Displacement in TouchDesigner

Pixel Sorting – TouchDesigner Tutorial 16

Glitch effect in TuochDesigner

GLSL TOP Post Effects (日本語)

Voronoi tricks in Touchdesigner

さいごに

以上、DeepLabとTouchDesignerを用いた映像の制作過程をご紹介しました。今回ご紹介した以外のセマンティックセグメンテーション用モデルも色々あります。ライセンスの関係ですぐに使えないものも多いのですが、良さげなものを発見したらまた試してみるかもしれません。

他にもデザイニウムでは様々な開発を行っていますので、気になる方は是非SNSのアカウントもチェックしてみてください!

The Desinium.inc
Interactive Website
The Designium YouTube Channel
Facebook
Twitter


この記事が気に入ったらサポートをしてみませんか?