R&Dチームの中村健太郎です。トマトの記事に続き2度目の登場になります。そして、5月30日でアラサーを迎えました。
今回は深層学習において肝でもあり、手間もかかるデータセット作成を自動化することを記事にしてみました。
背景
コンピューターグラフィックス(CG)で作成されたのデータセットの研究に関してはNVIDIA Researchがよく登場することがあり、一例として以下の論文が出されています。
ここでは現実世界の画像を使うことなく学習させた結果、Faster R-CNNで物体検出ができたという内容が触れられています。
学習の方法として教師なし学習、弱教師あり学習、教師あり学習など様々な手法が提案されています。それぞれに強み弱みはあれど、今のところ早く学習が収束し、精度的にも良い結果を出しているものは教師あり学習です。
となれば、必然的にデータセット(教師データ)が必要になってきます。例えばラベル付された教師データのフォーマットの種類の1つにCOCOがあり、この場合はアノテーション方式としてバウンディングボックス・ポリゴン・セグメンテーション(RLE圧縮)・キーポイントの4種類をサポートしています。
このような教師データ作成作業(アノテーション)をサポートするlabelImg、Labelbox、VGG Image Annotatorのようなツールやサービスもいくつかあります。
それでもデータセットの数を揃えようと思うとなかなか骨の折れる作業です。
今回はそんなデータセットをゲームエンジンを使って、楽にCGの世界から作ってみようという話です。
データソース
今回は油圧ショベルのデータセットを自動生成して学習させていきます。
ポリゴン数は8681なので、そこまで密ではありません。
ちなみに初代PlayStationは演算能力で最大150万[ポリゴン/秒]、表示能力で最大36万[ポリゴン/秒]です。
私達が思っている以上に様々な人工物のCGモデルが作られており、TurboSquid などCGモデルを販売するサイトにたくさんのモデルが公開されています。
少し前ですが、Disney Researchがアニメ映画「モアナと伝説の海」(2016年)に登場する架空の島「モトヌイ島」の3DCGデータアセットを研究目的・ソフトウェア開発目的として無償公開するといったトピックもありました。
Unreal Engineを用いてCGからデータセットを創るためのツールとしてNDDS・UnrealCV・MakeHumanが公開されていますが、カスタマイズするには少し手間が掛かりそうだったので、1からツールを自作したものを用いています。*1
データセット
キャプチャと自動アノテーションを行うと、以下の画像のような出力を得ることができます。今回は使用しませんが、インスタンスセグメンテーションのものをプレビューします。
これらのほかにバウンディングボックス・キーポイント・クラスセグメンテーション用のデータを出力できるようにしました。
合計で603枚のPascalVOCフォーマットのデータセットが完成しました。
今回はローポリゴンなCGモデルの画像データから学習ができそうかどうかの傾向を見れればいいと思ったので、少なめのデータセットで行っています。
実際にスタートから終わりまで作業時間を計測したところ、10分18秒でした。約1.02 [枚/秒] になるので、人がやるより明らかに早いですね。*2
学習
次に学習をさせてみます。今回はRefineDetと呼ばれる物体検出のネットワークモデルを用います。
以前、別の記事でもRefineDetをTensorRT化した時の速度ベンチマーク記事で登場しています。
カスタマイズされたクラスで学習させやすいようになっている社内でPyTorchで再現実装したものを用いましたが、Githubでもrefinedet.pytorchのようなPyTorch実装などが公開されています。
データセットはトレーニング用に450枚、バリデーション用に153枚を使い、以下のパラメータを用いました。
- 入力サイズ: 320
- ベースネットワークモデル: vgg16_reducedfc.pth
- ssd.pytorchリポジトリよりダウンロード
- 学習率(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 | +-------------------------------+----------------------+----------------------+
推論
次に推論をさせてみます。もちろん現実世界の画像を入れてみます。
以上のようになりました。
オレンジ色の油圧ショベルが検出されていないのは、データセットの色が黄色だけだったという点が大きいと思います。
このほかにも、スケールがやや大きいものがデータセットの中心になっていたので、より小さなものも増やしていけばスケール変化にも対応できるモデルになると思います。
今回は一切現実の画像を用いることの無いデータだけの学習をやってみましたが、がんばれているように思います。
手間が減ることもありますが、同時に3Dモデルで表現できる物体であればデータセットが作れるという点も大きいですね。
さらにポリゴン数の多いCGモデルを使うと今回以上の結果が期待できそうです。
改善点としては陰と影が強すぎる(暗すぎる)という話もあったので、そういった点もパラメータとして調整できるようにしていきたいです。
おわりに
OPTiMでは独自で用意した検出対象の画像に加え、3Dモデルのデータを実験的に加えて学習させたりしています。
現実世界の様子を仮想世界で再現させたデータを混ぜ込んで学習させることで、データセットに無いパターンを補うようなことが可能になります。
ちなみに今回の内容については 課題解決とサービス実装のためのAIプロジェクト実践読本 の最後の方で少し触れられています。
仮想世界に興味がある方も、現実世界に興味がある方も、ぜひ快適なデータセットライフをご一緒しましょう!