WebクローラーでAIの学習データ収集


車載カメラによる動画からYOLOで石造物検出をするようになると、検出対象の石造物の種類を増やしたくなり、より多くの学習データが必要になりました。そこで、もともとは月待塔というマイナーな石造物の情報収集用に作ったScrapyとYOLOによるWebクローリングと物体検出の仕組みを利用して、AIの学習用データを収集することにしました。

Webクローリングから学習データ作成までの流れは以下の通りです。

  1. まずは、少ない学習データで構わないので、検出対象の種類を増やす
  2. 新たに検出対象とした物体の画像がありそうなサイトをクローリングし、AIにより物体検出された画像を保存する
  3. 収集した画像から、正解とも不正解とも判断できない画像は除外する
  4. darknet.exeでラベルデータを出力する
  5. LabelImgでラベルデータを修正する

手順1では手元にあった画像を使用しました。学習データが少ないので、当然のことながら検出精度は高くありません。
手順2ではScrapyとYOLOによるWebクローリングと物体検出の仕組みを利用しました。Darknetから返された検出結果のリストを参照し、必要な物体が検出された場合のみ画像を保存します。ただし、検出結果は必ずしも正しいとは限りません。
手順3は人力による作業です。明らかな正解・不正解の場合は学習データに使用しますが、人間でもどちらとも判断できないような画像は除外します。
手順4では、学習対象とする画像に対して -save_labels オプションを付けて darknet detector test コマンドを実行します。出力されたラベルデータには、明らかに誤ったラベル付けや、Bouning Boxの範囲が適切でないことがあります。そこで、
手順5で、LabelImg を使用して修正します。
これまで、ラベル付けの作業にはマイクロソフトの VoTT(Visual Object Tagging Tool)を使用していました。しかし、darknet.exeが出力するYOLO形式のラベルデータをそのまま VoTT で扱うことはできません。そこで今回からは LabelImg を使用することにしました。

LabelImgのウィンドウの右側にある Box Labels のリストからラベルを選択すると、そのラベルの付けられた範囲が画像上でハイライト表示されます。上の例では、koshin のラベルを選択しており、画像上の「庚申」を囲む Bounding Box がハイライト表示されています。
ラベルを順次選択しながらその領域を確認することができるので、自動生成されたラベルデータの確認と修正には便利な仕様になっています。
もしも間違ったラベルが付けられていた場合は、Box Labels のリストでラベルを右クリックして「Edit Label」を選択するとラベル選択ダイアログが表示されるので、正しいラベルを選択して[OK]ボタンをクリックします。

収集したすべての画像のラベルの確認と修正が済んだら、学習用データセットに追加して再度学習を実行します。一連の流れを繰り返すことにより、次第に検出精度が高まっていくことが実感できました。


2020年11月28日 追記

darknet.exeが生成したラベルデータには1.0を超える座標値が含まれる場合があり、そのままYOLOv5で学習に使用すると警告が出力されます。