撮影した看板

学習対象を撮らずに学習してみた

ISPでは、以前から『つくばチャレンジ看板の検出』の課題に取り組んでいます。
今回は、撮影した看板画像データを使用せず、3Dモデルデータを利用してDeep Learning学習/実際の看板を検出させてみました。

by Nagasawa Kazuki 2016/11/28


【過去記事】
『ダイレクトなR-CNN』で物体検出する

Deeplearning で用いるデータを「生成」してみた


Unity で看板画像生成

今回は3Dモデル作成ツールとして、3Dコンテンツ統合開発エンジンである「Unity」を使用しました。
Unityを選んだ理由としては、(個人的に触ってみたかったのもありますが、) ライティングやカメラの制御を C# コードを書くことで簡単に行うことができるのが大きいです。
今回は実験なので、簡単に『地面から 90 cm の位置で、2m の距離から水平に 360°グリーンバック撮影してみる』という状況を Unity で作成して看板画像データを撮りました。

Unity 上撮影環境
Unity 上撮影環境
撮影した看板
撮影した看板

Unity で作成した看板は板3枚をつなげ、ラベルを張っただけの『つくばチャレンジ看板もどき』です。本物と比べると取手が無いのが非常に大きな違いです。下に正面から撮って透過したものを並べてみました。左が実際に撮影した看板、右が今回Unityで作成したものです。画像を比べてみると、左はグリーンバックの皺が若干気になります。

実際に撮影した看板
実際に撮影した看板
Unityで作成した看板
Unityで作成した看板

データ拡張

Unity で作成した透過済み看板写真を用いて、Deep Learning 学習用画像を生成しました。
以前と同じデータ拡張手法を用いて、『隠れ』も考慮した上で任意の背景画像と合成して、学習用画像を大量生成しました。

合成画像例
合成画像例

結果

近所の広場で撮影した動画を使って検出を試してみました。
(A) 赤色 : 実際の看板をグリーンバックで撮った画像を学習データとしたもの
(B) 青色 : Unity 3D モデル画像を学習データとしたもの (今回)

Unity 版もなかなか良い感じで検出しています。
簡単に、いくつかのポイントで比較してみました。

看板の裏側

(A) (B) ともに学習データとして看板の裏側を入れていないため、本来は検出しないで欲しいところ。(B) の方は想定通り検出されていないです。
以前学習した (A) の方は、いくつかのフレームで検出されてしまっていました。これは、看板の色・形に対して過学習してしまったためかと思われます。

06_comparison_01

障害物で隠れている看板

障害物で看板が隠れている場合は、(A) (B) ともに検出されていました。以前の(A)よりも隠れている部分の推定が良いように見えます。これは、グリーンバックで撮影したときよりも透過が綺麗にできていたところに、学習データのラベルの付与の精度が影響しているためと考えられます。( (A) の方はグリーンバックの皺があった分、透過した時の画像の大きさに微妙な違いが出てしまった )

06_comparison_02

カメラを看板に近づけた場合

カメラを看板に近づけた場合、(B) では反応しなくなってしまいました。これは単に近づけた画像を学習データとして含めていなかったためです。

06_comparison_03

まとめ

今回、実際に撮影した画像を一切使わず、

  • 前景データ : 3D モデルから生成した画像データ
  • 背景データ : Webサイトから取得したフリー素材背景画像

として学習データを大量生成したもので学習し、以前に実際の看板画像で学習した検出器と比較して同程度の精度を得ることができました。

3D モデルについては、Microsoft Windowsで「Paint 3D」が発表されるなど、技術のすそ野が広がり、盛り上がりを見せる予感がしています。
今回行ったデータの生成を始め、様々なところに応用が効きそうで楽しみです。


【参照】
Unity – Game Engine