Blog

3DCG × AI による物体検出の実験

はじめに

こんにちは。3D エンジニアの中川です。最近 Rist の本 Web サイトがリニューアルしました。いろんなコンテンツがバージョンアップしていますので、是非隅々までご覧ください。新しく作られたページもいくつかあるのですが、その中に『学習用データセット生成』というページがあります。こちらのページの作成には我々 3D エンジニアも関わりました!新しく 3DCG の動画も作成し、なかなか見応えのあるものができたのではないかと自負しておりますので、ご覧いただけると幸いです。

さてさて。

そのページには CG を使って学習用データセットを生成するとありますが、本当にそれで学習できるのか?汗水垂らしてアノテーションしなければいけないんじゃないのか?とお思いの方もいらっしゃるかもしれません。そこで、せっかく専用のページができたことですので、3DCG を使った簡単な物体検出の実験を行い、紹介してみたいと思います。「最先端の技術を!」とか「世界最高クラスのエンジニアが!」とかそんな大層な実験ではなく、簡単に「やってみた」程度のものですので、お気軽にお付き合いいただけたら幸いです。

目標

こちらはモノタロウで買った部品(六角ボルトと袋ナット)です。緑のプラスチックケースに入れて、iPhone で写真を撮りました。この写真から部品の検出をやってみましょう。ただし、学習には実写画像は全く使わず、3DCG だけで学習するのが条件です!

学習用データ

こちらが学習用に作った 3DCG データセットの一部です。

3Dモデルは 3D Warehouse というサイトより似たものを探してお借りし [1][2]、テーブルのテクスチャと照明用の HDRI は ambientCG というサイトからお借りしました[3][4]。これらを使って 2 つの 3D モデルそれぞれで配置パターンを 10 個作成し、配置パターン毎に 100 枚、合計 2000 枚の画像を作成しています。カメラやマテリアル(材質)等はなんとなく似た感じになるように設定しつつ、バリエーションを増やすため、画像ごとにランダムなバラツキを与えて変化させました。二種類の配置は混ぜずに、各画像に映る部品は一種類のみの単独です(理由はなく、手抜きです💦)。ちょっと袋ナットのハイライトがカクカクしてしまいましたが……まあ良いでしょう!

[1] https://3dwarehouse.sketchup.com/model/375b51a8-8dd6-4ae6-b7e7-cd364fb00e31/M8-Bolts-Hex-Allen-Nuts-Washer-Metric
[2] https://3dwarehouse.sketchup.com/model/a61dcf28-e4cb-49e9-b162-74ef7bae82ab/Cap-Nut
[3] https://ambientcg.com/view?id=Plastic017A
[4] https://ambientcg.com/view?id=IndoorEnvironmentHDRI003

使用したモデル

今回の物体検出にはフレームワークとして Mask R-CNNを用い、バックボーンには ResNet50-FPN を使いました。このモデルを使って、実際の写真は一切使わず、前述の 3DCG のみで六角ボルトと袋ナットが検出できるよう AI に学習させます。

検出結果

さあ、学習した AI モデルで写真から部品を検出してみましょう!

まずは部品を分類させず、全て同じ「部品」として学習させた AI で推論した結果です。見つけた部品毎に領域を青く塗って、更に Bounding Box で囲っています。

はい、ちょっとセグメンテーションが怪しいところもありますが、うまくいっていますね。

次に、AI に部品の分類も学習させ、推論させてみた結果です。袋ナットと判断された領域は青、六角ボルトと判断された領域はオレンジで色を付けています。

うーん、そこに部品があるということは概ね分かってくれているのですが、分類はダメダメですね。分類しない AI ではなかった見落としや、誤検知も少しですが発生しています。この結果から、「今回の 3DCG とモデルでは、部品の検出を行う AI は作れるが、部品の分類まで行う AI を作ることは難しい」と言うことができるでしょう。

実はこれ、 Rist 内でこれまで行われてきた研究でも分かっていたことだったりします。3DCG だけでは部品の傷や汚れ、歪み、etc. を完全に再現することが難しく、分類までできるようにするのはなかなか難しいのです。特に今回は 2 部品とも同じ材質な上に、ボルトとナット両方に六角形の部分があり、アウトラインがよく似た形状であったことも難易度が高くなる要因だったかと思います(もっと区別のつきやすそうな部品にしておけば良かった……!)。

おわりに

ということで、以上 3DCG を用いた物体検出 AI の学習と、実写画像からの物体検出実験でした。「学習用データセット生成」の雰囲気は掴んでいただけたでしょうか。結果としては部品を分類せず数えたりはできそうなものの、ボルトとナットの分類はこの AI では難しそうだという結果となりました。

え、じゃあ 3DCG じゃダメじゃん、となりそうなところですが、そこで Rist の AI エンジニアの出番です。Rist の AI エンジニアはさらに分類まで可能にする経験と技術を持っています!今回の実験は 3D エンジニアだけでやってみたのですが、性能の良い AI を目指すなら「AI に適した 3DCG」と「3DCG に適した AI」の両方ができるように、 3D エンジニアと AI エンジニアが連携して取り組むことが大切なのです。

そう、どちらも在籍する Rist であれば、データセット生成からそれを用いた AI 開発まで一気通貫でおまかせいただけます!今回は雰囲気を掴んでいただけたら十分ということで、具体的な方法はまたの機会にということにしますが、絶対に自力でアノテーションをしたくない皆さんも、ご興味があれば是非お気軽にご相談いただけたらと思います。

それでは!