【物体検出】OIDv4-ToolKit から作成したデータセットでお手軽に RetinaNet を実装

YOLOv3 論文の性能比較で目立っていた RetinaNet に興味がわきました。

深層学習による物体検出は、物体候補領域提案と、回帰分類を分けて行う two-stage 型と、候補領域提案を行わない one-statge 型があり、one-stage は、two-stage よりも高速な推論ができる反面、精度が劣る傾向にあるとのこと。(最近は BoundingBoxを各隅4点でなく、中心座標やコーナーの2点等で予測する Keypoint系もあるようです)

RetinaNet は 損失関数を工夫すること(Focal Loss)で、one-stage で精度向上を図ったモデルだそう。

YOLOv3 論文より)

今回は、だいぶラップされてとても実装が簡単なレポジトリを発見したので、こちらで Dolphin & Shark 検出器を作りたいと思います!

https://github.com/Tessellate-Imaging/Monk_Object_Detection

データは OIDv4-Tookkit でダウンロードしたものを加工して COCO フォーマットに変換する必要があるようです。

レポジトリにあるコードがそのままでは動かなかった+ちょっと読みづらかったので、少しだけデータセット作成のところは自分なりにアレンジしてやってみました。

 

 

データセット作成

 

まずは環境合わせです。Google Colab バージョンとそうでないもので 2種類 requirements.txt が用意されています。

 

OIDv4-TookKit でデータを収集しておきます。そちらに関してこちらで。

【YOLOv3 データセット作成の旅①】Open Images Dataset の特定クラスの画像のみダウンロード

 

 

OIDv4-ToolKit という名前のフォルダをそのまま使ってデータ作成をします。ぱっとやれるように関数にまとめました。

 

RetinaNet の学習

 

データセットが作成できたため、学習に取り掛かります。ここからはこのレポジトリは、少ないコードで進められて便利。

まずは import できるようにパスを通してあげます。

訓練、検証DataLoader を作成します。

バックボーンには ResNet18 / 34/ 50/ 101 が選べます。

 

最適化手法は Adam となっているため、train_detector.py の中身を変更して SGD 等にしても良いと思います。

 

ログはこんな形で出てきます。

 

推論

学習が終わると、pt ファイルが出来上がるので、それを読み込みます。

いくつか推論してみます。

 

最後まで目を通していただきありがとうございました!