3Dゲームエンジンを使って建機のアノテーション済みデータを自動生成する

R&Dチームの中村健太郎です。トマトの記事に続き2度目の登場になります。そして、5月30日でアラサーを迎えました。
今回は深層学習において肝でもあり、手間もかかるデータセット作成を自動化することを記事にしてみました。

背景

コンピューターグラフィックス(CG)で作成されたのデータセットの研究に関してはNVIDIA Researchがよく登場することがあり、一例として以下の論文が出されています。

arxiv.org

ここでは現実世界の画像を使うことなく学習させた結果、Faster R-CNNで物体検出ができたという内容が触れられています。

学習の方法として教師なし学習、弱教師あり学習、教師あり学習など様々な手法が提案されています。それぞれに強み弱みはあれど、今のところ早く学習が収束し、精度的にも良い結果を出しているものは教師あり学習です。
となれば、必然的にデータセット(教師データ)が必要になってきます。例えばラベル付された教師データのフォーマットの種類の1つにCOCOがあり、この場合はアノテーション方式としてバウンディングボックスポリゴンセグメンテーション(RLE圧縮)キーポイントの4種類をサポートしています。

f:id:optim-tech:20190527182421p:plain
COCOでサポートされているアノテーション方式イメージ図

このような教師データ作成作業(アノテーション)をサポートするlabelImgLabelboxVGG Image Annotatorのようなツールやサービスもいくつかあります。
それでもデータセットの数を揃えようと思うとなかなか骨の折れる作業です。

今回はそんなデータセットをゲームエンジンを使って、楽にCGの世界から作ってみようという話です。

データソース

今回は油圧ショベルのデータセットを自動生成して学習させていきます。

f:id:optim-tech:20190531044238p:plain
Blenderで読み込ませた様子

ポリゴン数は8681なので、そこまで密ではありません。
ちなみに初代PlayStationは演算能力で最大150万[ポリゴン/秒]、表示能力で最大36万[ポリゴン/秒]です。

私達が思っている以上に様々な人工物のCGモデルが作られており、TurboSquid などCGモデルを販売するサイトにたくさんのモデルが公開されています。
少し前ですが、Disney Researchがアニメ映画「モアナと伝説の海」(2016年)に登場する架空の島「モトヌイ島」の3DCGデータアセットを研究目的・ソフトウェア開発目的として無償公開するといったトピックもありました。

Unreal Engineを用いてCGからデータセットを創るためのツールとしてNDDS・UnrealCV・MakeHumanが公開されていますが、カスタマイズするには少し手間が掛かりそうだったので、1からツールを自作したものを用いています。*1

github.com

github.com

www.makehumancommunity.org

データセット

キャプチャと自動アノテーションを行うと、以下の画像のような出力を得ることができます。今回は使用しませんが、インスタンスセグメンテーションのものをプレビューします。
これらのほかにバウンディングボックス・キーポイント・クラスセグメンテーション用のデータを出力できるようにしました。
合計で603枚のPascalVOCフォーマットのデータセットが完成しました。
今回はローポリゴンなCGモデルの画像データから学習ができそうかどうかの傾向を見れればいいと思ったので、少なめのデータセットで行っています。
実際にスタートから終わりまで作業時間を計測したところ、10分18秒でした。約1.02 [枚/秒] になるので、人がやるより明らかに早いですね。*2

f:id:optim-tech:20190531043841g:plain
キャプチャされた画像と自動アノテーション後の画像サンプル

f:id:optim-tech:20190531043657j:plain
キャプチャの様子

学習

次に学習をさせてみます。今回はRefineDetと呼ばれる物体検出のネットワークモデルを用います。
以前、別の記事でもRefineDetをTensorRT化した時の速度ベンチマーク記事で登場しています。
カスタマイズされたクラスで学習させやすいようになっている社内でPyTorchで再現実装したものを用いましたが、Githubでもrefinedet.pytorchのようなPyTorch実装などが公開されています。

tech-blog.optim.co.jp

データセットはトレーニング用に450枚、バリデーション用に153枚を使い、以下のパラメータを用いました。

  • 入力サイズ: 320
  • ベースネットワークモデル: vgg16_reducedfc.pth
  • 学習率(lr): 0.005
  • バッチサイズ: 24
  • Epoch数: 200

nvidia-smiをすると以下のようになります。GPU使用率が100%近くにずっと張り付いているわけではなかったので、改善の余地ありですね。200エポックで約4時間でした。以下学習環境です。

  • CPU: i7-7700 CPU @ 3.60GHz
  • GPU: NVIDIA GTX 1080Ti x 2
  • RAM: DDR4 16GB (8GB x 2)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 418.56       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0 Off |                  N/A |
| 75%   75C    P2   338W / 280W |   4703MiB / 11178MiB |     99%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:02:00.0 Off |                  N/A |
| 59%   65C    P2   329W / 280W |   4259MiB / 11178MiB |     89%      Default |
+-------------------------------+----------------------+----------------------+

f:id:optim-tech:20190531043837p:plain
トレーニング中のLossの推移

推論

次に推論をさせてみます。もちろん現実世界の画像を入れてみます。

f:id:optim-tech:20190531043827p:plain
推論結果1: 正面向きの油圧ショベルですが、無事検出されています。

f:id:optim-tech:20190531043823p:plain
推論結果2: 結果1に変わって向きが反転しましたが、依然として検出されています。
キャタピラー部分は微妙に枠からはみ出てますね。

f:id:optim-tech:20190531043818p:plain
推論結果3: 今回油圧ショベルの色を黄色のみでデータセットを作成したため、オレンジ色の建機を見逃しています。
ただ、同じ黄色い建機でも左手の油圧ショベルでないものはきちんと除外されているので、単純に色だけで判断されているわけではなさそうですね。

以上のようになりました。

オレンジ色の油圧ショベルが検出されていないのは、データセットの色が黄色だけだったという点が大きいと思います。
このほかにも、スケールがやや大きいものがデータセットの中心になっていたので、より小さなものも増やしていけばスケール変化にも対応できるモデルになると思います。

今回は一切現実の画像を用いることの無いデータだけの学習をやってみましたが、がんばれているように思います。
手間が減ることもありますが、同時に3Dモデルで表現できる物体であればデータセットが作れるという点も大きいですね。
さらにポリゴン数の多いCGモデルを使うと今回以上の結果が期待できそうです。

改善点としては陰と影が強すぎる(暗すぎる)という話もあったので、そういった点もパラメータとして調整できるようにしていきたいです。

おわりに

OPTiMでは独自で用意した検出対象の画像に加え、3Dモデルのデータを実験的に加えて学習させたりしています。
現実世界の様子を仮想世界で再現させたデータを混ぜ込んで学習させることで、データセットに無いパターンを補うようなことが可能になります。

ちなみに今回の内容については 課題解決とサービス実装のためのAIプロジェクト実践読本 の最後の方で少し触れられています。

仮想世界に興味がある方も、現実世界に興味がある方も、ぜひ快適なデータセットライフをご一緒しましょう!

www.optim.co.jp

*1:具体的には任意のCGモデルの使用、決まった枚数や決まった角度からの撮影、空の色や対象の物体の色やマテリアルの変更、撮影ポイントや対象物体の位置などをまとめてキャプチャタスク化する、等のカスタマイズです

*2:手元のMacMiniで実行したため、GPUありの環境であれば更に早いです