arutema47's blog

書いたり書かなかったり。

物体検出ライブラリの紹介と所感

記事について

画像はDetectron2より

物体検出をほとんど使っていない方を対象として、2021年末の物体検出ライブラリを俯瞰することが本記事の目的。

ある程度物体検出の経験ある方は学ぶことは少ないと思う。またあくまで書いてあるのは筆者の感想であるので人によっては全く違う意見になることもあるかと。また本記事ではモデルの技術的な説明はありません。それらについて理解を深める際は参考ページや元論文を当ってみると良いかと思います。

また大変遅くなりましたが、本記事はKaggleアドベントカレンダー(裏)の24日目でもあります(年明けちゃってすみません)。

qiita.com

紹介するライブラリ一覧

Library mAP range Architecture Instance segmentation License Repo Stars
yolov5 37-50 Single-stage GPL-3.0 Here 34.1k
YOLOX 40-51 Single-stage Apache-2.0 Here 7.7k
efficientdet 33-53 Single-stage Apache-2.0 Here 1.4k
Detectron2 35-48 FRCNN Apache-2.0 Here 23.2k
mmdetection 35-50 Single, FRCNN Apache-2.0 Here 22.5k

(Star数2023/1/4更新. Yolov5がInstance segmentationにも対応しました。)

FRCNNって何?って方は以下記事もどうぞ。

qiita.com

所感

  • yolov5がstar一番多い

  • yolov5以外はオープン(Apache-2.0)ライセンス。GPL-3.0は仕事で使うには注意が必要。

  • どのライブラリも達成可能な精度レンジは似ている。

  • yolov5,YOLOX,efficientdet, Detectron2はあるアーキテクチャに特化したライブラリに対し、 mmdetectionは様々な物体検出モデルの再現用ライブラリとなっている。

  • Instance segmentationにはMask-RCNNアーキテクチャが必要。サポートしているのはDetectron2とmmdetection。 yolov5でもInstance segmentationに対応しました。

アンサンブルについて

  • 実際にkaggle等で使う時はyolo+effdetなどをアンサンブルすることが多い。カツオコンペやvinbigなど複数ライブラリのアンサンブルでスコアが一気に伸びる例が多かった

  • Signateカツオコンペ yu4uさんカツオコンペ解法

  • Kaggle Vinbig 1st place solution

Yolov5+effdetのアンサンブル

VinBigData Chest X-ray Abnormalities Detection | Kaggle

  • Kaggle Satorius 2nd place solution

Cellの物体認識はyolov5+effdet+MaskRCNNのアンサンブルで実施している。

インスタンスセグメンテーションをせずに、認識したBoxから更にU-netでセマンティックセグメンテーションを実施している。

精度vs速度トレードオフ

ブログ執筆にあたりA6000 GPUを使い学習済みモデルの推論速度を計測してみた。

グラフにまとめたのが上図。

所感:

  • 思ったよりもyolov5の性能が良い

  • YOLOXページ上ではV100でベンチマークしており、YOLOXの方が早いという結果。これはGPUによって前後しそう

  • YOLOX, yolov5はTensorRTに対応しており、適応すれば推論は数倍早くなると思われる。

  • YOLO系がefficientdet系より大幅に早いという事はどのGPUでも成り立つ。

  • Detectron2, mmdetectionの速度は未測定。学習時の感覚では大体efficientdetくらいの速度ー精度トレードオフ。

ライブラリ紹介

yolov5

ライセンス以外文句なしのライブラリ。

とにかく学習と推論が早いので実験しやすく、精度も高い。またs,m,l,xと4サイズ揃っており精度と速度トレードオフを作りやすい。

ドキュメントも豊富でissue検索すると大体のやりたいことはカバーできるかと思われる。Issueを立てても開発者の返事も早くバグfix速度が凄い。

欠点はライセンスがGPLである点とモデル、データ周りの改造が難しい点でしょうか。

Wandb連携しておりログも自動化してくれてるのが地味にありがたい。

学習について

学習時にはデータを独自フォーマットに変換する必要あり。COCO形式からの変換についてはkaggle notebookをみるのが良いと思う。

公式より:

github.com

小麦コンペのNotebookより:

www.kaggle.com

Vinbigコンペより:

www.kaggle.com

推論について

公式ページにあるtorchhubのモデル推論がお手頃(以下抜粋)。 Kaggle環境ではこのコードではエラー出るため、detect.pyを使うことが多い。 Kaggle環境でも問題なく回ります。

import torch

# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # or yolov5m, yolov5l, yolov5x, custom

# Images
img = 'https://ultralytics.com/images/zidane.jpg'  # or file, Path, PIL, OpenCV, numpy, list

# Inference
results = model(img)

# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

www.kaggle.com

Yolox

出た当初は学習コードが分かりづらかったがかなり整備されてきた。

ライセンスがオープンなyolov5と言えるかも。仕事で手軽な物体検出を使うとしたら自分もコレを使う気がする。

中国のトラッキングライブラリなどでyoloxが使われることが多く、採用は増えている。

学習について

公式readmeより:

github.com

サンゴコンペよりnotebook:

www.kaggle.com

Efficientdet

Yoloxが来る前はライセンスフリーで最高精度が出るライブラリだった。ただ学習速度は4〜8倍ほど遅い。あとd7といった巨大モデルではよく学習が落ちるのに苦労した。

精度、速度共にyolo系に劣るがyolo系とは抽出する特徴が違うのか、アンサンブルに加えると精度向上に寄与するため様々なコンペで使われている。

学習コード

小麦コンペのnotebookがわかりやすい。ただこれは最新repoには対応していない方式である点に注意。 使う場合はdatasetにあるeffdetのバージョンを使おう。

www.kaggle.com

torchvision

なんだかんだ言って使いやすいライブラリ。精度はそこそこだがPytorchに付属しているのでインストール不要なのがありがたい。

pytorch.org

Detectron2

MaskRCNNの公開レポだったものが包括的な物体検出ライブラリに進化した。

昔は物体検出ライブラリ自体が使いやすいものがなかったが、最近はyolov5を始めとして高精度・使いやすいものが出てきており役割が変わろうとしている気も。開発は止まり気味で最新モデルのインプリは少ない。

一方で今でもインスタンスセグメンテーションを扱えるのは強み。

ちなみにDetectron2の解説についてはHiroto Hondaさんの一連の記事がとても詳しいです。

medium.com

学習コード

このcolabがデータセット準備から学習までカバーしている。癖が強いのでなれるまでは苦労するかも

colab.research.google.com

mmdetection

学会で発表された物体検出技術をかなり広範囲に渡り実装、モデル公開しているライブラリ。model zooを見て通り対応モデル数が凄まじい。

github.com

  • サポートも手厚く、issue上げるとすぐに返事をもらえるのがありがたい

  • またフレームワークも独自形式のため最初は苦労するかもしれないが、モデル定義もデータセット形式も慣れると使いやすく改造もしやすい。

  • Kaggleのようにひたすら性能を出したいというよりかは研究で様々な手法を検証したい、新たにbqckboneやheadを置き換えたい時に便利だと思う。

  • YOLO系と抽出する特徴が違うためかアンサンブルに加えると精度向上に寄与するため、様々なコンペで使われている

学習コード

github.com

Sartorius: MMDetection [Train] | Kaggle

ゼロから実装する物体検出モデル

こんな記事書いておいてなんだけど、物体検出ライブラリを使っているだけでは物体検出について理解を深めることはできない。

自分でネットワークを実装しないと応用性のある知識や技術は身につかないと思う。

また既存物体検出ライブラリは改造が難しく、仕事や特定コンペの飛び道具として使う時に対応が難しくイチからネットワークを書けると対応の幅が広がる。

SSD

物体検出モデルの基本のsingle-stage-detector。まずはこのモデルから実装することで物体検出モデルに対する理解を深められると思う。

例えばamdegrootのssd repoは非常に読みやすい実装である。

github.com

発展Pytorchに詳しい解説があるため、よみながらイチから実装すると良い。

CenterNet

個人的には物体検出モデルをとことんシンプルにした革命的な実装。

誤解を恐れずに言うとu-netで物体検出しているため、ネットワークが非常にシンプルになる。自分でイチからモデルを書くのも簡単(精度出すのは色々作ろこみが必要だが)で応用も効きやすいと思う。

github.com

github.com

小麦コンペの筆者の実装

www.kaggle.com

公式実装はわかりづらいため、上のような実装が良い参考になると思う。

コンペ使用例

例えばPKUコンペではCenterNetのheadを拡張し、画像から3D位置を認識するネットワークがベースラインとなった。

www.kaggle.com

またNFLコンペでは上位者の解放でヘルメット位置と角度を検出するネットワークにCenterNetが使われた。

www.kaggle.com