画像を1枚も撮影しないUnityを使ったディープラーニング学習

f:id:karaage:20210503163917p:plain:w640

Unityを使ってディープラーニング

 Unityに入門してみたので、GWもUnityを少し触っていました。

 「UnityとAIを組み合わせて何かやってみたいなー」とは思ったものの、自分の場合は何か試行錯誤して作ってみないと身につかないので、単純な題材に取り組んでみることにしました。

 というわけで、取り組む題材はサイコロの目の画像認識にしました。正直、ディープラーニングで学習させれば簡単に性能は出てしまうでしょう。そこで、実際の画像(写真)を1枚も使わずにチャレンジすることにしました。

「えっ!!画像を使わずにディープラーニング!?」 「出来らぁっ!」

 というわけでやってみます。

Unityで教師データを生成

 画像無しでどうやって教師データを用意するか。もちろん使うのはUnityです。Unityでサイコロのモデルを作って、Unity内で大量に画像を撮影するのです。

 ちなみに、これは全く新しい試みではなく「Domain Randomization」と呼ばれる既存の手法です。Unity自身もそのようなサービスとデータを提供したりしていますしね。

 画像の生成方法に関しては、Zennに投稿したので詳細は以下記事参照ください。

 この手法で1万枚の画像も数分で生成できてしまいます。

f:id:karaage:20210503165223j:plain:w640

 生成された画像

f:id:karaage:20210503165233p:plain:w480

 生成した学習と推論はGoogle Colaboratory(Google Colab)を使って実施しています。ノートブックのリンクも上記記事の最後に貼ってあります。

 もし詳しく知りたい方は、拙作「からあげ先生のAI自作教室」を参考にしてみてください。

実験結果

 何度か、データ作成の条件を変えたり、モデルのパラメータを試行錯誤した結果、Unityのデータに対して、99%の精度を達成しました。

f:id:karaage:20210503164944p:plain:w480

 あとは、リアルな画像でちゃんと認識するか…ここでようやくリアルなサイコロが登場します。Amazonで買いました。

 カメラで撮影したサイコロでテストしたら…ちゃんと認識しました!

 左上の赤い数字が認識結果です。

f:id:karaage:20210503163911p:plain:w640

f:id:karaage:20210503163917p:plain:w640

f:id:karaage:20210503163923p:plain:w640

 ちゃんとそれぞれの目を認識します。感覚的には精度は99%よりは多少低そうですが、かなりしっかり認識してくれます。

まとめ

 Unityでディープラーニングしてみました。久しぶりのAI関係のネタでしたね。

 単純な課題だったので、あっさり成功するかと思いきや、生成した画像の回転が一切されていなかったり、単純なモデルと小さい画像サイズでは認識率上がらなかったりと結構試行錯誤しました。何事も実際にやってみることが大切ですね。

 Unity使って教師データを生成することで、一番良いと思ったのは手軽に条件を変えてやり直したり、いくらでも水増しできることですね。ディープラーニングってデータが重要と言われつつも、実際問題なかなかアノテーションを全部やり直したり、1万とか水増しすることはできないので、教師データの条件を変えてたくさん実験できるのはとても良いなと思います。

 一方で、Unityの使い方を覚えたり、モデル作ったり、画像生成したり、学習に必要な形式に変換するプログラムを組むより、実際に写真とってアノテーションする方が断然簡単という現実もあります。特に、今回は単純な例でしたが、複雑な例になるほどUnityでうまく学習できるか分からないので、実際にビジネス等で使うには大きなリスクになりそうですね(これは趣味なので、別に良いのですが)。

 そして、研究の最先端は既に教師データ無しで高度な学習を実現してる…全然ついていけません

 まあよそはよそですね(笑)というわけで、これを使って作りたいものがあるので、完成したらまた紹介したいと思います。

関連記事