見出し画像

【機械学習】YOLACT++によるインスタンスセグメンテーションを試してみた

こんにちは!デザイニウムのBBOY/エンジニアの平澤@eatora22)です。今回はYOLACT++という機械学習モデルのご紹介をしようと思います。

はじめに

YOLACT++はセグメンテーション用のモデルなのですが、以前にDeepLabというモデルもご紹介させていただきました。せっかくなのでまずは両者のモデルを比較してみようと思います。

動画素材はブレイクダンスのエアートラックス(AirFlare)という技で人間らしからぬ動きをしていると思うのですが笑、それでもYOLACT++の方は綺麗にセグメンテーションしているのが分かると思います。見にくいですが動作速度もDeepLabは約5FPSであるのに比べ、YOLACT++は約17FPSほど出ています。※バックボーンとなるネットワークごとに異なるモデルが存在するのですが、今回は両者から精度が良さげなものをピックアップしています。

DeepLabによるセグメンテーション事例については以下の記事もご参照ください。

技術紹介

改めてYOLACT++についてご紹介していきます。GitHubのリポジトリは以下URLとなります。ライセンスは「MIT License」となっており商用利用も可能です。最初の名前はYOLACTでしたが、2019年12月にその改善版であるYOLACT++論文が投稿されました。

また、DeepLabはセマンティックセグメンテーションでしたが、YOLACTは正確に書くとインスタンスセグメンテーションのための機械学習モデルです。何が違うのかというと、前者は入力画像全体からピクセルごとにカテゴリの分類を行っていましたが後者はまず物体検出を行い画像内におけるおおよその位置を把握した後にピクセルに対するセグメンテーションを行います。

ここまでの説明も非常にざっくりなのですが、特にYOLACTはセグメンテーションのためのアプローチとしてSSDYOLOといった物体検出用モデルでも採用されているOne-stage手法というものを用いています。私も専門ではないので詳細な解説は省かせていただきますが、第一著者であるDaniel Bolyaさんの論文や以下の日本語解説記事など参考になるかと思います(皆さんに感謝)。

環境構築に関してはREADMEにも書いてあるのですが、yamlファイル(environment.yml)を使用する手順は普通に失敗したので、必要なパッケージを一つずつ確認しながら手動で入れました。ここではハマりそうな部分だけ補足します。

pycocotools(COCO API)のインストールは「pip install ~」と書かれていますが私の環境では失敗しました。COCO APIのリポジトリをダウンロードし、以下の記事に倣ってPythonAPI→setup.pyの修正を行います(こちらも感謝)。その後「python setup.py install」を実行してインストール完了です。

YOLACTだけでなくYOLACT++のモデルを使用するためにはDeformable Convolutional LayersDCNv2)という変形可能な畳み込み層のコンパイルが事前に必要です(YOLACT++にだけ使われているレイヤーです)。手順自体はREADMEに書いてあるようにシンプルですが、どうやらCUDAのバージョン依存がシビアな模様。最初は既にインストールされていたCUDA10.0用の環境でコンパイルしようとしましたが失敗しました。GitHubのIssuesにもDCNv2のコンパイルで失敗したという書き込みがたくさんあります。この辺を試したりもしましたが失敗。最終的に、成功しそうな雰囲気だった以下の組み合わせでコンパイルできました。参考までに残しておきます。

・CUDA: CUDA Toolkit 10.1 update2
・cuDNN: 7.6.5
・PyTorch: 1.4.0
・torchvision: 0.5.0
・cudatoolkit: 10.1.243

さらに補足で、同一環境(PC)に複数バージョンのCUDAを入れても「Program Files→NVIDIA GPU Computing Toolkit→CUDA」内でバージョン別にディレクトリが分けられた状態で格納されます。cuDNNインストール時もその分けられたディレクトリ別に必要なファイルを追加するので問題なし。私の場合はCUDAの環境変数パスもバージョン別に自動で追加されているようでした(多分)。

では実際にYOLACT++を動かしてみましょう。eval.pyでは画像や動画ファイルの他にWebカメラでリアルタイムに取得した映像に対してもセグメンテーションを行うことができます。

実際に動かしている様子がこちらです(YOLACT++, Resnet101-FPN)。背景にいる式波・アスカ・ラングレーも"person"としてセグメンテーションしているのが分かるかと思います。ちなみに私の環境ではWebカメラで動かすといくらか遅延が発生してしまうようでした(eval.py実行時に"--video_multiframe=1"と指定するとFPSが落ちる代わりに少し遅延が改善されます)。

また、YOLACTではバックボーンとなるネットワークによって使用するモデルも異なります。YOLACT++を含めるとデフォルトでは6つのモデルが使用できたので、各々の比較動画も作成しました。

こちらの動画を見ると、YOLACT(++でない)モデルの物体検出率があまり良くない印象です。ただ、Webカメラで動かしたときはそこまで悪いようには見えなかったので素材動画との相性かもしれません。

最後にDeepLabの紹介記事でやったように特定のカテゴリーだけマスク処理する等いった場合の補足を載せておきます。入力画像に対してマスクをかける処理はeval.py内のprep_display関数で行っています。最初はモデルの出力結果から得られたマスク情報(output_utils.pyのpostprocessを経由)をmasks変数に格納するのですが、その後args.display_masksが真の場合に行う処理があるのでその辺をいじればいける……でしょう。もしくはpostprocess側を改変してもいけると思います。

さいごに

以上、YOLACT++のご紹介を行いました。今回はインスタンスセグメンテーションを用いた作品制作まではできなかったのですが、機会があれば何か他でご紹介するかもしれません。

編集後記

広報のマリコです。今回も最初にアップされているYOLACT++とDeepLabの比較動画はダンスに目がいってしまい、何度も見直してしまいました笑 同じくYOLACTやYOLACT++のバックボーンの違いによるYou Tube動画は6画面もあって、違いを見つけるのに何度も再生してしまいました!(間違い探ししてるみたいで毎回面白い)DeepLabの記事同様、ダンスと機械学習の動画は技術に詳しくない私も楽しんでいます。

というわけで、平澤の記事をマガジンにまとめたので、ぜひご覧になってみてくださいね!フォローもお待ちしています!!

The Desinium.inc
Interactive Website
Facebook
Twitter


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