いつもお世話になりっぱなしのAlexeyAB氏のGithubで、サラッと書かれているものの、実は物凄い可能性を感じるコマンドオプションがあります。
https://github.com/AlexeyAB/darknet
Alexey氏のクールな一文がコレです。
Pseudo-lableing - to process a list of images data/new_train.txt and save results of detection in Yolo training format for each image as label <image_name>.txt (in this way you can increase the amount of training data)
use: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
通常のtestコマンドで-save_labelsと付けるだけで、検出に準備した画像と1対で検出結果のアノテーションデータが出力されます。
出力されるアノテーションデータは、画像と同じディレクトリに出力されます。(画像ファイル名の拡張子が.txtになっている)
上記の通り、画像ファイル名と同じディレクトリにtxtが出力されるので、labelImgで、OpenDIrectoryとSaveDirectoryに同じディレクトリを指定すればそのまま読み込めます。
※注意事項:classes.txtを同じディレクトリに置かないと、アノテーションと検出されたラベルが表示されません。
検出結果のアノテーションを、labelImgで修正した後に、追加学習のためのデータにしましょう。
→参考記事:【物体検出】vol.3 :YOLOv3の独自モデル学習の勘所
学習済の重み(.weight)を指定して、追加データで学習を行います。新たなクラスが含まれる場合は、class.namesとcfgの修正が必要です。
ここで、一つの疑問が生じるかと思います。
「テンプレートモデルから一から学習した場合(一括学習)と、既に学習した重みを使って継ぎ足しで学習した場合(追加学習)では、どのような違いがあり、どちらが良いのか?」
答えは...
一筋縄ではいかない結果が出ました。5分類のうち、4分類で一括学習の方が良く、1分類が追加学習の方が良かったです。
(一括学習はtestコマンド結果のイテレーション5000-20000回を採用し、追加学習は21000-36000回を採用し、それぞれのPrecisionの最大値と中央値の比較)
そのスコアの比較が下記です
モデル | 統計 | 区分1 | 区分2 | 区分3 | 区分4 | 区分5 |
一括 | 中央 | 47.4 | 35.45 | 38.45 | 58.3 | 42.2 |
最大 | 56.3 | 48.6 | 46.3 | 70 | 53.1 | |
追加 | 中央 | 49.85 | 36.6 | 37.7 | 56.3 | 37.7 |
最大 | 56.2 | 44.1 | 39.7 | 64.6 | 42.5 |
原因として、1stデータセットと2ndデータセットの内容に区分ごとの偏りがあった可能性があります。
いずれにせよ、データセットの偏りを無くし、汎化性能を向上させることが必須なので、今回のように検出結果からフィードバックして、追加学習していくプロセスは大変重要です。(汎化性能をどのように計数化して評価するかという別の課題はあります)
※更に検証が必要ですが、少ないデータを継ぎ足し継ぎ足し、追加学習する場合、一括で学習した場合とは異なる結果であることが分かりました。
▼この記事を書いたひと
R&Dセンター 陸 依柳
撮影、お城、戦国、ICT、サブカルチャー...常に面白く、新しいものに惹かれるタイプです。地方の戦国イベントによく参加しています☆
●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337
〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711 地図
交通部 R&Dセンター