U^2 Netを使った自動アノテーションの試み 1

3 min read読了の目安(約2700字

自動アノテーションツールozeuの紹介

そこそこ精度の高いInstance Segmentationを作りたい場合に、
結構な数のMaskつきのBoundingBoxの学習データを集める必要があります。
また、同じ物体の様々な方向、サイズ、照明条件化における画像、オクルージョンがあるケース、モーションブレがある場合の学習データを集めることで、様々な条件下において頑健に動作するInstance Segmentationモデルを構築できます。とにかく、多様、かつ、大量のデータが必要です。

私が現在開発中のデータセット構築ツールキットozeuを利用すると、
これらの要求のうち、方向、照明条件、背景を変化させたデータセットを
そこそこ容易に作ることができます。まだまだ、改善の余地はありますが、一旦、開発中版として、公開することとしました。

本記事では、今回私が開発したツールの利用手順とツールの構成を説明します。
まだ少し使いどころが難しいですが、今後、更に自動ラベリングの精度をあげて、
もっと簡単に利用できるようにしたいと思っています。
フィードバック、Issue、PRなどお待ちしております。

利用方法

私が開発したツールozeuを使って、COCOフォーマットのデータセットを構築する手順を説明します。
下記画像は、構築した手のデータセットをCoco Viewerで表示したものです。Coco Viewerはcoco datasetを生成するスクリプトの動作確認に便利で、私はよく使っています。

次のようなフローでこういったマスクとBoundingBoxつきのデータセットを半自動的に構築できます。

  1. 自動ラベル付けしたい物体を撮影する
  2. 対象オブジェクトのラベルを設定ファイルに記述
  3. 自動ラベリングツールを実行する。
  4. (Optional) データセットの修正
  5. (Optional) 背景のData Augmentation

自動ラベル付けしたい物体を撮影する

自動ラベルツールでは、U^2 Netを使い目立つオブジェクトを抽出して、
それを元にラベルを作っています。
なので、目立つオブジェクトの抽出の成功率が、正確なデータの率に直結します。
なので、U^2 Netのモデルの気持ちを想像しながら、撮影物体が目立つように撮影するのが
いいデータセットを作るコツとなります。

画像データを撮影するデバイスがですが、iPhoneで撮影してもいいですし、Webカメラで撮影してもいいです。
カメラの特性や設定でモデルの性能が変わるので、
実際にモデルを動かすカメラ設定やカメラで学習データを作ったほうがいいと思います。

データの撮影の仕方としては画像のように机からものをなくしてもいいですし、
ごちゃごちゃした背景で撮影しても問題ありません。
ただ、きれいな机のほうが誤った物体にラベル付けする率が低くなるので、
後ほど、誤ったラベル付けデータを除外する手間が減るかもしれません。

また物体を手で持っても一応データセットは作れます。ozeuには、この画像のように手と目立つオブジェクトを別々に検出して、手を除外して、ラベル付けする機能があるからです。ただ、何もない机の上に物体だけをおいた場合と比較すると間違いは増えます。

失敗率が増える動画は、暗い動画や物体のサイズが小さい場合で、
暗い動画では、マスク生成の失敗が増えるので多めに動画を取るほうが良いです。
物体のサイズが小さくて背景が複雑な場合も、ラベリングに失敗することが多々あります。
なので、サイズが小さいデータ、暗すぎるデータは程度にもよりますが、
手動アノテーションのほうが効率良い場合もあるかもしれません。
自動ラベリングをする際に、検出に失敗したものはある程度自動検知して、省いていますが、それでもある程度ゴミデータは残ります。

2-5の手順

2-5の手順に関しては、
READMEをご覧ください。

自動ラベリングツールの処理の流れ

ツールの内部処理の流れは単純で、

  1. U^2 NetでSalient Objectを検出する
  2. 検出したSalient Objectから、手のマスクを除去したものをオブジェクトマスクとする
  3. オブジェクトマスクから、BoundingBoxを作る
  4. 前フレームのオブジェクトマスクの面積と比較して、オブジェクトマスクの面積変化が大きいフレームを検出ミスとして除外
  5. 検出ミスがないフレームのみデータセットとして出力する

という流れです。

これのおかげで、ある程度検出ミスや手を除外しつつ、物体のラベルを作ることができます。
シンプルなロジックですが、思ったよりもうまく行きました。

活用事例:手のInstance Segmentationモデル

ozeuを活用して構築したInstance Segmentationモデルがこれになります。
このモデルは、全くデータセットの修正をせずに学習しました。
手が小さい画像があまりないため、手が小さいケースでの性能はそこまで高くありませんが、
結構きれいに手が検知できていることがわかると思います。

ただ、意外にも右手の検出性能が低いです。
左手だけでも、もうちょっと性能が出ると思いましたが、
右手の学習データも必要なのでしょうか。原因はわかりません。

また、2つが近づいた場合に、うまく両方を検出するようなこともできません。
そういったデータセットはいまのozeuでは作れないので、
手動アノテーションに頼る必要があります。