引き続き、MMDetectionでの物体検出を試行錯誤していました。
意外と物体検出してくれない?
物体検出をやろうと思った時に、YOLOという名称を知っていたので、なんとなくYOLOの名が付くYOLOXがいいのだろうと思っていました。
しかしMMDetectionの利用の記事を見ているとRTMDetという手法の採用が多いので、
「よくわからないけど、RTMDetの方が新しそうだし、こっちの方が良いのかな?」
と思い、まずはRTMDetで学習をしてみました。
で、学習した結果を、実際に処理したい画像に適用してみたのですが、いい感じではあるものの、明らかに見えているようなものを検出できていなかったりしていました。
「んー、なんとなくRTMDetでやってみたけど、YOLOXの方がいいのかな?(有名だから)」
幸いMMDetectionはいろんな手法が使えるので、YOLOXのSモデルで学習させてみることに。
学習後、画像に適用してみると、RTMDetよりはちゃんと検出できていて悪くはないのですが、あともう少し頑張って検出して欲しいなー、みたいな。微妙に足りてないというか。
じゃあ、YOLOX-Sより大きなYOLOXのMモデル・・・は事前学習済みモデルが無かったので、もう1つ大きなYOLOXのLモデルで。
早速YOLOX-Lで同様に学習を開始してみたのですが、モデルが大きいためかメモリを使いすぎて学習にかかる時間が途方もない感じに。
もちろん我慢して待てばそのうち学習は完了すると思うのですが、YOLOX-Sの結果がもうちょっとだったので、YOLOX-Lにしてもそこまで処理結果に期待できないのではないか?また仮に結果がよくても、実際に利用しようとするとモデルが大きすぎて処理時間がかかり過ぎてしまうかもしれない、とも思ってました。
RTMDetは、学習configの中にYOLOの文字が見えたので、同じYOLOからの派生なのかな?
RTMDetからYOLOX-Sに変更すると改善したのは、なんでなんかな?
物体検出の手法には、それぞれ得意、不得意がある。
当たり前なのですが、数ある物体検出手法には、それぞれ得意、不得意があるのです。
物体検出と一口に言っても、リアルタイムのカメラ映像動画をリアルタイムに検出するための手法、処理速度は遅くても物体検出の方に力をいれた手法、物体検出までのアプローチの仕方、など、それぞれに特徴や研究の歴史があります。
そしてわたしはそんなことも知らずに物体検出に着手していたのでした。
MMDetectionは、いろいろな物体検出手法が利用できるのが特徴で、1つずつ試していけばそのうち自分の作りたいものに合った良いのが見つかるだろうと思いますが、大ざっぱに特徴を知っておいて取り組んだ方がより効率的にできるだろう。でも、論文を読んだりするのはちょっと・・・
いろいろ調べてみた結果、YOLO系はリアルタイムでの物体検出で定評があり、DETR系は物体検出の精度に定評があるとのこと。
やりたいことはリアルタイムではなく、既に取得済みの画像からの物体検出で、検出精度に力を入れたかったので、私にはDETR系が良さそうだと感じました。
YOLOXも検出精度が従来よりも向上したモデルのようですが、結果がいまいちだったので、次やるならDETR系が合ってそうだなーと。
MMDetectionでのDETR系のconfigファイルの書き方がよくわからないんだけど
MMDetectionで、YOLOXとかRTMDetとかはサンプルのconfigのpyファイルがあったけど、DETR系って無くない?どうやって書いたらええのんー??
って思ってたら、きれいに書いてある記事がありました。ありがたやー
この記事の下の方のアライグマの学習のところに、DETR系の学習のconfig例が記載されてます。
当たり前でありながら気づいてなかったのですが、YOLOXとかRTMDetと同様に、同じような書き方で全部指示するような感じだったようです。(ドキュメント読めと言われるとその通り・・・
こちらの記事のおかげでconfigもかけたので、DAB-DETRというモデルで学習をしてみたところ・・・
モデルが小さいのかGPUのメモリ使用量も少なく学習もサクサクと進み、しかも学習経過の評価値も良さげ!
実際に処理したい画像に学習したモデルを適用してみると、YOLOXに比べかなり正確に物体の検出をすることができました!
多少処理に時間がかかっても正確に検出したかったので、DETR系が私の目的には合っていそうです!
論文を読むところまでしなくても、AIモデルの特徴や生い立ち、ターゲットとした課題なんか調べた方がいいんだなー、と感じた一日でした。
もうちょっと物体検出を微調整して、いつかアプリ化かサービス化まで漕ぎつけたいなー