Last updated on

MMDetectionで物体検出を独自モデルで学習する! という試行錯誤


物体検出を独自モデルで学習したい!

まずMMDetectionってなんぞ?っていう話なんですが。

画像を渡すと、「あ、ベンチがありますね」みたいに、どこにどんな物が映っているか認識することを画像認識AIでの物体検出モデルと言われています。
物体検出モデル(プログラム)はいろんなものがあるのですが、最近ではYOLOv8だとかが人気でメジャーなモデルで検索すると事例もたくさんでてきます。

画像認識AIによる物体検出の応用例として、下のような「畑の動画からすいかを探す」というのがわかりやすいと思います。

畑の中にできているスイカは、ぱっと見ではよくわかりませんが、すいかの特徴をAIに学習させることで畑の中からスイカを認識できるようになっている、という事例です。すごいですね!

同じような感じで、わたしも物体検出をAIに学習させたい!と思ってYOLOを調べたりしたのですがYOLOv8はライセンスがなんだか複雑で、ちょっとめんどくさそうな印象を受けました。
個人開発ではありますが、あまりにライセンスを無視したような対応はしたくないので、できるだけライセンス条件の緩いものを探してみたところ、YOLOXというものがApacheライセンスで使いやすそうかな?と。
ただモデルとしてちょっと古くて、性能も最近のYOLOv8とかに比べると微妙な面もあるみたいですが・・・まぁYOLOXでやってみようと。

で、早速YOLOXを使ってみようとセットアップしてみたのですが、どうも古すぎて他のライブラリとうまく整合がとれないのか、なんか思ったように動いてくれず・・・

YOLOXがよかったのに、困ったなー
と思っていたところに見つけたのがMMDetection。

MMDetectionは、いろんな物体検出モデルを使ったり、学習させたりできるライブラリで、使えるモデルの中にはYOLOXも入っていました。
何でも使える必要はなかったけど、まずは物体検出が動かないと始まらないので、MMDetectionを試してみることに。

 

MMDetectionをインスコして、デモプログラムを実行してみる!

うごいた!うごいたー!
学習済みのモデルをダウンロードして、サンプルとしてついてる画像から物体検出させてみると、benchとかcarとか、認識して動いているじゃないですかー
デモだから動いて当たり前なんだけど、なんかかっこいい・・!

デモは違うモデルを使ったけど、使えるモデルにYOLOXもあったから、これならちゃんと動きそう!
というわけでMMDetectionで進めてみることに。

なお、この前までに、pytorch+cudaを入れたりとかもしてます。
Qiitaに投稿した時はPreviewを入れてますが、今はpytorch 2.4安定版を入れました。

 

次は独自モデルで学習だ!の前に学習のためのアノテーション作り!

学習させるには、”この絵には、ここに、ベンチがあるよ”を指示してあげる必要があって、これをアノテーションというのですが、まぁこれが大変で。

MMDetectionは、COCO形式というアノテーションが推奨のようで、アノテーションツールは、CVATというものを利用しました。
セットアップには、下のQiitaの記事を参考にしました。

CVATはDockerでポンとローカルサーバーができて、ローカルサーバーにブラウザーでアクセスしてアノテーションがつけられる感じで、かなり使いやすかったです!個人でローカルサーバーで使う分には無償ぽい感じなのかな?たぶん。
アノテーションのコピー、貼り付けや、フレーム間にコピーとか、操作感も直感的で、いろいろ気が利いてる!たぶん知らない便利機能もきっとある!(マニュアル読めという・・・)

ツールはすごい便利で使いやすくていいのですが、アノテーションの作業はひたすらめんどくさい!
学習する画像は700枚ほど準備して、画像から検出対象となる4~30個の物体をマウスでマークする作業・・・。
たくさんあるわー、と言ってもやらないと終わらないので、少しずつコツコツやりました。
AIって、AIがやってくれるフェーズに入るといいんですが、その前の人手でのコツコツがほんと大変よね・・・
今は華やかなAIサービスの裏には、こんなコツコツがたくさんあるんだろうなー、と想像しつつも、あまりに単調ですぐ飽きます。
でもやらないと終わらないので、少しずつやりましたアノテーション。最初に決めたセットで3~4日はかかったんじゃないかなー?

 

じゃあ早速、学習だ!

アノテーションがやっと終わって、coco形式で出力できて、準備ができたので、いよいよ学習に!
参考にしたのは、Qiitaの次の記事。

考えていたYOLOXで、参考記事を見ながら、ごそごそ設定をして・・・

やったー!(なんかよぉわからんけど)動いたー!
なんとなくエポックも進んでて学習している風に見える!!

よっしゃよっしゃー、あとはパソコンにお任せやー
あ、10回ごとに自動保存される重みを試しに使ってみてどんな感じに画像処理されるか、見てみよ!

・・・使ってみたけど、なんか全然画像処理されてませんが??あれ??

bboxっていうのが今回つけたアノテーションだと思うけど、loss_bboxが最初から0.00なのが気になるなー?最初からエラーなしなんてことないような・・・?
あと処理ごとに、エラーが出てて、

- compute_metrics - 465 - the testing results of the whole dataset is empty.

ってなんぞ?ちゃんと設定してるんだが・・・?

YOLOXだからうまく行かないのかな?
YOLOXよりRTMdetの方が新しくて、出力も良さそうだからRTMdetっていうのを使ってみようかな?
ほい、学習スタート!・・・しない!
エラーが出て、

valueerror: need at least one array to concatenate

んー、さっきYOLOXでもなんか変だったのと同じところが原因なのかも?

で、ググって、見つけたのが、こちら。

metainfo を指定してあげると、うまく行ったよ、ということらしい。
ほむほむ、とwork_dirsに自動生成される学習の設定コードに指摘されている内容を記載して、RTMdetで学習を実行してみると・・・

動いたぽいー!
loss_bboxもよくわからんけどそれらしい値が入ってるし、ETA(たぶん終了予定時間)も現実的な値になってる!
もしかすると、検出する要素を設定する時に、

[ 'youso' ]

としたけど、もしかすると、

[ 'youso' , ]

としないといけなかったのかな?そうなんかも?
ま、動いたっぽいし、今度試してみよう

学習はgoogle colaboで動かさないといけないかなー?と思ってたけど、これならローカルでもできそうかな?

もう一度、自動保存された重みを使って、画像を処理してみると・・・・
ちゃんとできてたー!やったー!!

また学習途中で、すべてが思ったようにはなってない気もするけど、方向的にはかなり良さげ!
よーし、パパ、もっと学習させちゃうぞー
パソコンさん、この調子でもうちょっとがんばって!!