Unity を検索

Unity Perception ツールを使って合成データによる高パフォーマンスな物体検出 ML モデルの学習を行う

取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

教師付き機械学習(ML)は人工知能に革命を起こし、数々の革新的な製品を生み出してきました。しかし、教師付き機械学習では、大規模で複雑なデータセットが常に必要であり、これらのデータセットを収集するにはコストがかかります。ラベルの品質をどのようにして保証するのでしょうか。また、そのデータが本番環境のデータを代表するものであることをどのようにして保証するのでしょうか。この問題の、特に物体検出タスクに関する場合の新しくて面白い解決策は、大規模な合成データセットを生成することです。合成データは、機械学習モデルを訓練するために必要な大規模なラベル付きデータセットを取得する困難さを軽減するものです。

このブログ記事は、Unity による合成データ生成について解説するシリーズの第 3 回目です。最初のブログ記事では、コンピュータビジョンタスクのための機械学習モデルを訓練するために、大量のラベル付き画像を収集するという課題について説明しました。その次の記事では、Unity の Perception ツールを使ってラベル付きデータフレームを生成する方法を紹介しました。

ここで簡単に振り返ってみましょう。

  1. Unity Simulation を使用して、新しい環境で目的のオブジェクトの大規模なデータセットを生成する
  2. 合成データセットを用いて物体検出モデル(Faster R-CNN)を学習する
  3. 少数の実世界サンプルを使って、このモデルを微調整する

その結果、この投稿で公開している新しい実世界のデータセットで良いパフォーマンスを発揮し、また実データだけを使って学習したモデルよりも良いパフォーマンスを発揮するモデルが出来上がりました。また、datasetinsights で環境を作成し、データを生成し、カスタマイズしたアセットやデータを使ってモデルを学習するためのパイプラインや手順も提供します。

Unity Simulation を使用した大規模な合成データセットの生成

私たちは、63 種類の日常的な食料品のオブジェクトを検出するために、Faster R-CNN を使用することを選択しました。このモデルの学習には、対象物の 3D アセットの作成、シーンの自動生成、画像データのレンダリング、バウンディングボックスのラベルの生成が必要です。

このプロジェクトでは、63 種類のオブジェクトすべてについて 3D アセットスキャンを作成し、Unity Perception パッケージを使用してラベル付きデータを自動生成しました。以前のブログ記事で説明したように、各レンダリングでは、対象となるオブジェクトの配置と向き、背景オブジェクトの配置、形状、テクスチャを制御しました。さらに、レンダリングされたすべての画像に対して、ライティング、オブジェクトの色相、ぼかし、ノイズをランダムに選択しました。Perception パッケージを使用して、RGB 画像と対応するバウンディングボックスの情報を含む JSON ファイルをキャプチャしました。

図 1:バウンディングボックスとそれに紐づいたメタデータ JSON を伴う合成データの例。

環境を作成するために、前景アセットと背景アセットの 2 種類のアセットを用意しました。前景アセットは、検出したオブジェクトをスキャンしたものです。対照的に、背景アセットのオブジェクトは、文字通り背景を構成する物体や、対象のオブジェクトの遮蔽物です。

これらのアセットの作成には、特有の課題がありました。第 1 に、背景と遮蔽物のオブジェクトについては、そのテクスチャと色相を露出し、変化させる必要がありました。第 2 に、前景アセットはリアルな作りでなければなりませんでした。そのため、前景アセットとなるオブジェクトをスキャンする際には、より注意を払い、また、スキャン後にある程度手直しを行う必要がありました。

実世界のデータセットを作成する

実世界のデータセットを作成するために、実際に商品を購入し、それをベルビューのオフィス内のいくつかの異なる場所に配置し、写真も数枚撮りました。これは、実世界のデータセットにある程度のばらつきを持たせるために、ライティングや背景の条件を変えてオブジェクトを配置したということです。また、写っているオブジェクトの組み合わせが各写真で異なるようにし、オブジェクトの位置、向き、構成もすべての写真で変化するようにしました。

これらの画像にアノテーションを付けるために、VGG Image Annotator ツールを使用し、品質保証やデータの正確性の問題への対応など、200 人時間以上の労力を費やしました。アノテーション工程の終了時には、バウンディングボックスとクラスのラベルが付いた使用可能な画像が 1,267 枚できました。このデータを、学習用の 760 枚の画像、検証用の 253 枚の画像、テスト用の 254 枚の画像に分割しました。トレーニングに実世界の画像を使用したモデルはすべて、このトレーニングセットを使用しました。最も性能の良いモデルを選択し、過学習を防ぐために、検証セットを使用しました。最後に、モデルの性能を評価するために、ホールドアウトのテストセットを使いました。モデルにとってこのホールドアウトセットは未知のもので、また、モデルの選択やモデルのハイパーパラメータの設定に、暗黙的にも明示的にもホールドアウトされたデータを使用しませんでした。

図 2: 人手でアノテーションを行ったバウンディングボックスのラベルを伴う実世界のデータの例。

実世界のデータと合成データを併用した物体検出モデルの学習

これらの実験では、ImageNet 上で事前に学習済みの ResNet50 バックボーンを用いた、一般的な Faster R-CNN モデルを使用しました。torchvision で公開されている実装を使用しています。kubeflow パイプラインを含む実際のコードは、私たちがオープンソースで公開している datasetinsights Python パッケージに収録されています。

モデルの性能を測定するために、COCOPASCAL VOCOpenImages の各課題で使用されている 3 つの標準的な指標を使用しました。これらの指標により、モデルの偽陽性率、バウンディングボックスの定位、偽陰性率を定量化することができます。一般的に、予測されたバウンディングボックスと正解のバウンディングボックスの領域の和集合に対する共通部分の割合(IoU)のしきい値を使用して、予測の正否を判断します。0.5 以上の IoU(mAPIoU=0.5)での物体検出の平均精度(mAP)を用いて、偽陽性となる誤検出率を測定します。さらに、しきい値を 0.5~0.95 の範囲で 0.05 刻みで変化させて平均を取った mAP を使って、バウンディングボックスの定位の精度を測定しています。mAP の向上はバウンディングボックスの定位精度が向上したことを示し、一方、mAPIoU=0.5 は検出精度の向上、すなわち偽陽性となる誤検出率の低下を示すより一般的な指標です。最後に、最大 100 個の検出候補を与えた時のモデルの平均再現率(mAR100)を測定します。mAR100 の改善は、偽陰性率が低下していることを示します。これらの指標の算出方法の詳細については、PASCAL VOC 開発キットと COCO の検出率評価を参照してください。

すべてのモデルは、初期学習率 2×10-4、バッチサイズ 4 で学習を行いました。学習前に、学習データを学習用のセットと検証用のセットに分割し、検証用のセットに対して、mAPIoU=0.5 と mAR100 が最も高くなったモデルを選択しました。

実世界のデータのみで学習する場合は、760 枚の画像を用いて学習を行いました。検証用の実世界データのセットについて、mAPIoU=0.5 と mAR100 で評価して最も性能の良いモデルを選択しました。合成データでの学習では、40 万枚の画像を用いて学習を行いました。ここでも検証用の合成データのセットについて、同じ指標で評価して、最も性能の良いモデルを選択しました。最後に、最も性能の良い合成データで学習したモデルを、実世界の画像を使って微調整しました。この場合、検証用の実世界データのセットで評価して、最高の性能を持つモデルを選択したということになります。

合成データで学習したモデルと実世界のデータで学習したモデルの性能比較

254 件の実世界の画像からなるホールドアウトセットを用いて測定した、IoU のしきい値を [0.5:0.95] の範囲で変化させた場合の平均適合率(mAP)、IoU のしきい値を 0.5 で固定した場合の平均適合率(mAPIoU=0.5)、および最大検出数を 100 としたときの平均再現率(mAR)の値は下表のようになりました。

学習データ(学習サンプル数)mAPmAPIoU=0.5mAR100
1.1 実世界データ (760)0.480.730.59
1.2 合成データ (400,000)0.400.620.52
1.3 合成データ (400,000) + 実世界データ (76)0.600.830.67
1.4 合成データ (400,000) + 実世界データ (380)0.680.890.74
1.5 合成データ (400,000) + 実世界データ (760)0.700.920.75
図 3:各モデルから得られた画像例。緑のバウンディングボックスは正しく予測できている箇所、赤のバウンディングボックスは偽陽性の検出となった箇所を示す。合成データを使用することで、対象物の向きや配置、照明条件が複雑な場合にモデルの性能が向上している。

Faster R-CNN のような出来合いのモデルを使用して、小さな実世界のデータセットで学習を行うことは、多くの機械学習の実務家にとって標準的なワークフローです。私たちの GroceriesReal データセットについて、Faster R-CNN が一定水準の結果(mAP が 0.48、mAPIoU=0.5 が 0.73、mAR100 が 0.59)を達成していることがわかりました。上の画像を見ると、オクルージョンがなく、商品名が正面にある場合には、このモデルの性能が高いことがわかります。しかし、遮蔽物やオクルージョンがある場合には、偽陽性となる予測が多いことがわかります。逆にライティングが複雑な場合には、偽陰性となる誤検出が多く見られます。これらの結果は、Faster R-CNN がこのタスクを実行できることを示しているものの、バウンディングボックスの定位(mAP)、偽陽性率(mAPIoU=0.5)、偽陰性率(mAR100)に大きな改善の余地が残されていることを示しています。私たちは、性能を押し上げるために実世界のデータをさらに大量に収集するのではなく、大量のランダム化データを合成するアプローチを取りました。

合成データを使用する利点の 1 つは、面倒で時間のかかるデータ収集プロセスを経ることなく、データセットに関する反復修正を迅速に行うことができることです。利用するに足る合成データを生成するために、私たちはデータセット生成プロセスの多くの側面について反復修正を行いました。当初、我々は環境のライティング効果やオクルージョン効果を考慮に入れていませんでした。こうしたデータセットで学習を行ったモデルは、実世界のデータに対して、偽陽性、偽陰性ともに非常に多くなるというひどい性能を示しました。これにより、そこそこの結果を得るためには、背景オブジェクトや他の対象のオブジェクトによる環境ライティング効果やオクルージョン効果を考慮することが重要だということがわかりました。ありがたいことに、Unity Simulation と Unity Perception パッケージを使用することで、データセットを簡単かつ迅速にカスタマイズできる十分にパラメータ化された環境を構築することができ、さまざまなドメインランダム化パラメータを持つ新しい大規模なデータセットの生成をものの数分で行うことができました。

次に環境ライティングとオクルージョンを含めた、40 万件の合成データサンプルでモデルを学習しました。このモデルは、実世界の画像に対するパフォーマンスが悪く(上の表を参照)、特にオクルージョンの多い状況やライティングが十分でない状況では失敗しました。しかし、物体の向きが複雑に変わる場合は、モデルはそれなりの性能を示しました(図 3)。これらの結果から、問題はドメインギャップの問題であることが示唆されました。この仮説を検証するために、学習用の実世界データを用いてモデルを微調整することを試みました。

最初に行ったことは、76 件の実世界の画像を用いて合成データで学習したモデルを微調整することでした。その結果、実世界のサンプルのうち 10% を使うだけで、実世界のデータのみで学習を行ったモデルよりも優れた性能を発揮することがわかりました。具体的には、偽陽性と偽陰性の数が大幅に減少することがわかりました。さらに、バウンディングボックスの定位においても顕著な改善が見られました。しかし、複雑なライティング状況(図 3 の 3 行目、3 列目)では、このモデルはまだ十分な性能を達成できていないことがわかります。

380 件の実世界サンプルでこのモデルを微調整したところ、すべての指標で顕著な改善が見られました。実世界データのみのモデルと比較して、mAPIoU=0.5 で約 22% の改善、mAR100 で約 12% の改善が見られます。さらに、mAP は 42% 向上しており、合成データで学習したモデルを実世界データで微調整することで、バウンディングボックスの定位が改善されることが示されています。特に、複雑な環境のサンプルにおいて、微調整されたモデルはわずかに偽陽性の誤検出を示すのみという見事な結果を示しました。さらに、ライティング条件が良くない環境でも、微調整したモデルはほぼすべての物体の検出に成功しました。これらの結果は、ランダム化された大規模な合成データセットがモデルの偽陰性率と偽陽性率を低下させることを示しています。

重要なポイントと結論

合成データを用いて、実世界で十分な性能を示すモデルの学習を行ったことで、有用なデータセットの生成法に関する課題がいくつか明らかになりました。物体検出の場合、主な問題は、対象とするオブジェクトのデジタルツインを作成する方法、合成データセットを多様化する方法、およびこのデータセットを使用してモデルを学習する方法です。アセットスキャンソリューションを使うと、Unity で対象とするアセットの合成データバージョンを作成することができます。その後、Unity Simulation を使用して、アセットと環境の各要素をパラメトリックに変化させ、大規模な合成データを生成することができます。

今すぐ無料で試す

以前のブログ記事で、Unity Simulation 上で生成された合成データセットを解析し、統計を計算し、データセットを理解するためのチャートを生成する Python パッケージのリリースについてお知らせしました。現在このパッケージは、GitHub で完全にオープンソース化し、ユーザーが合成データを使ってモデルを学習して、そのモデルを実世界データで微調整することで私たちの仕事を追試できるように、プロジェクトの機能を拡張してモデル学習のコードと kubeflow パイプラインを含むように作業を進めています。

更新されたパッケージには、データセットの生成から Faster-RCNN モデルの学習、そして新しい jupyter ノートブック上でのモデルの予測の評価と可視化まで、パイプラインを最初から最後まで実行するためのガイドが含まれています。また、このガイドには、一般的に良好なパフォーマンスを発揮する転移学習や、事前に学習したモデルを使用して予測を実行するためのオプションのパスも含まれています。

これらのパイプライン、実世界のデータセット、合成データを生成するために提供されたパラメータを使用して、実世界で物体検出を実行するためのモデルの学習を行うことができます。さらに、ソースコードiOS 向けの AR アプリケーションML モデルをホストする手順を提供しており、皆さんが作ったモデル(あるいは Unity が提供するモデル)を使用して、自然界で物体検出を実行することができます。

Unity Perception パッケージ、Unity Simulationdatasetinsights を使用すると、皆さんのアプリケーションで使える合成データ生成とモデル学習を完全に無料で始めることができます。

機能のリクエストがある場合や、ユースケースについて議論したい場合、または何かしらのフィードバックがある場合は、直接お問い合わせいただくか、Unity フォーラムにご投稿ください。

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック