YOLOv7で水中物体検出してみた
はじめに
はじめまして、初めてzennで記事を投稿します。
普段は、アンドロイドアプリの開発をしたり、AI(特に画像系)の研究をしています。
本日はインターン先でYOLOv7を使ったので、水中の魚を検出するまでの過程を紹介していきたいと思います。
YOLOv7
まずYOLOとは、物体検出技術の1つで、自動運転車やセキュリティ、製造ラインなどの異常検知などに活用することができます。これまでにYOLOは、YOLOv1から現時点(2023年2月1日)でYOLOv8までのバージョンが出ています。
今回はその中でも、2番目に新しいYOLOv7を用いて水中の魚を物体検出した事例を紹介します。
学習に関して
水中の魚の泳いでいる動画から、画像を抜き出しそれをデータセットとして用いました。
アノテーションの際に、初めはlabelmeというツールを使おうとしたのですが、YOLOv7に必要なYOLO形式での出力ができなかったため、labelimgというアノテーションツールを使いました。
実際のデータセットの詳細は以下の表にまとめます。
DataSet | 画像枚数 | 物体数 |
---|---|---|
train | 80 | 801 |
valid | 20 | 251 |
学習は300エポックほど回し、学習時間がColabのGPU環境で1時間20分ほどでした。
学習に使った画像の例
学習結果
学習後の検出画像として、以下に示すような出力が得られました。
しかし、まだまだ精度が足りておらず、魚群を検出しきれなかったり、水中内の小さなごみに反応してしまうと言う事例も発生しました。
他の記事において、YOLOv7とYOLOv5の精度を比較したデータがあり、YOLOv7では検出漏れが少ないかわりに、間違えた検出が多くなる傾向があるとありました。そのため、今回のように、小さなごみに反応してしまうということが発生したとも考えられます。
この問題を解決するためには
- 学習画像の質を上げる。アノテーションする魚の種類を増やしたり、しっかりと写っている魚だけにアノテーションを行う
- 学習時のパラメータの調整
- モデルの改良
などの対処法が挙げられます。これらの対処法を、今後試していきたいと思います。
Discussion