このシリーズでは物体検出でお馴染みのYOLOシリーズの最新版「YOLOX」について、導入から学習の方法までまとめます。YOLOXは2021年8月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。YOLOv5を超える性能で、使いやすいApache Licenseとなっています。
第1回目である今回は、公式のチュートリアルに沿って推論デモとcocoデータセットの学習を紹介します。Google colabを使用して簡単に物体検出のモデルを実装することができますので、ぜひ最後までご覧ください。
Google Colabの使い方はこちら
今回の内容
・YOLOXの概要
・YOLOXの導入
・チュートリアルの推論とサンプルデータセットによる学習
YOLOXとは
YOLOXは2021年8月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。前作のYOLOv5を超える性能で、使いやすいApache Licenseとなっています。YOLOXのベンチマーク結果は以下となっています。
URL:https://arxiv.org/abs/2107.08430
出典:Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, Jian Sun; arXiv:2107.08430 [cs.CV]
コード:https://github.com/Megvii-BaseDetection/YOLOX
YOLOXには高精度向けのStandard Modelsと、エッジデバイス用のLight Modelsの二種類が存在します。Standard Modelsは左上の表からわかる通り、速度、精度ともにYOLOv5より向上していることがわかります。それぞれのベンチマークは以下の通りです。
Standard Models
Light Models
YOLOXのアーキテクチャ
YOLOXは従来のYOLOをアンカーフリーに変更し、Decoupled HeadとSimOTAを導入した物体検出モデルです。CVPR2021の「Automous Driving WorkshopのStreaming Perception Challenge」で優勝しています。従来のYOLOv4およびYOLOv5はアンカーを使用することを前提としており、過度に最適化されたパイプラインとなってしました。一方で、YOLOXはYOLOv3-SPPをベースラインとして改良しています。また、YOLOv3-SPPに対してYOLOv5で導入された、CSPNetのバックボーンとPAN headを導入しています。
物体検出においては、regression(バウンディングボックスの位置の計算)とclassification(クラス分類)を同時に行っており、Decoupled headを使用する方法が提案されています。これまでのYOLOシリーズのbackboneとfeature pyramidsにはCoupled headが使用されてましが、YOLOXではCoupled headをDecoupled headに置き換えることで精度の向上を図っています。
学習においては、MosaicやMixupによるData Augmentationを適用しています。OTA(Optimal Transport Assignment)を計算量の少ない形で簡易的に模擬して改良を図ったSimOTAを使用しています。
YOLOXの特徴
従来のYOLOをアンカーフリーに変更し、Decoupled HeadとSimOTAを導入した物体検出モデル
YOLOXの導入
早速YOLOXを使用していきましょう。
ここからはGoogle colabを使用して実装していきます。
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
公式よりcloneしてきます。
!git clone https://github.com/Megvii-BaseDetection/YOLOX
次に必要なライブラリをインポートします。
%cd YOLOX
!pip install -U pip && pip install -r requirements.txt
!pip install -v -e .
こちらも合わせて準備します。
!pip install cython
!pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
以上で準備完了です。
YOLOXを使えるようになりました。
学習済みモデルを使った推論デモ
サンプル画像で試してみる
ここからは公式のチュートリアルに沿って、推論デモを試してみましょう。
まずは学習済みモデルを取得します。
冒頭紹介した通り、いくつかの学習済みモデルがあります。
ここでは、Standard Modelsの中で最も高性能である「yolox_x」を使うことにします。
!wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_x.pth
YOLOXではデモ用のコードが用意されいています。
これをそのまま実行することで簡単に物体検出デモを試すことができます。
画像はデフォルトのassets/dog.jpg
を指定しています。
!python tools/demo.py image -n yolox-x -c yolox_x.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
実行するとに「YOLOX/YOLOX_outputs/yolox_x/vis_res/~」結果が保存されます。
中身を確認してみると、無事に犬や自転車が検出できていることがわかります。
YOLOシリーズではおなじみの画像ですね。
任意の画像で試してみる
次に推論デモを任意の画像でも試してみましょう。
画像を用意したら先ほどの「dog.jpg」がある「YOLOX/assets/」に画像を保存しましょう。
保存したら先ほど同様に推論デモを実行します。
「–path assets/dog.jpg」で画像の場所を設定していますので、dog.jpgの部分をアップした画像のファイル名に変更しましょう。
!python tools/demo.py image -n yolox-x -c yolox_x.pth --path assets/test.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
実行するとに「YOLOX/YOLOX_outputs/yolox_x/vis_res/~」結果が保存されます。
任意の画像で推論デモを簡単に実行することができました。
任意の動画で試してみる
動画でも試してみましょう。
「YOLOX/assets/」に動画を保存して、同様に推論デモを実行します。
先ほどの「image」の部分を「video」に変更しています。
!python tools/demo.py video -n yolox-x -c yolox_x.pth --path assets/sample_yolox.mp4 --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
任意の動画で推論デモを簡単に実行することができました。
学習
サンプルデータセット
ここから学習の方法を紹介していきます。
データセットは公式で推奨されている通り「mini-coco128」のデータセットを使用します。
早速データを取得します。
https://drive.google.com/file/d/16N3u36ycNd70m23IM7vMuRQXejAJY9Fs
データのダウンロードが完了したら「coco128」のフォルダごと「YOLOX/datasets」移動させます。
YOLOV5
├── datasets
│ ├── coco128
フォルダの中を見ると、YOLOXではcoco形式のデータセットとなっていることがわかります。
次に学習済モデルを取得します。
今回はチュートリアルに従って「yolox_s.pth」を使用します。
先ほどと同様の方法で学習済モデルを取得しましょう。
!wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth
以上で学習に必要なデータがそろいました。
サンプルデータセットで学習する
いよいよ学習を開始します。
以下の通り実行します。
!python tools/train.py -f exps/example/custom/yolox_s.py -d 1 -b 8 --fp16 -o -c yolox_s.pth
#-d:GPUデバイスの数
#-b:バッチの合計サイズ
「mini-coco128」は比較的小規模データセットのため、すぐに学習が終わります。
結果は「YOLOX/datasetsYOLOX_outputs/yolox_s/」に保存されます。
評価
このあとは作成したモデルでテスト…となるころですが、データセットのラベル名を設定する必要があります。
この設定をしないと、テスト結果を表示しても正しいラベルが表示されないため、ここでは割愛します。
具体的な評価方法は次回の記事を参照してください。
まとめ
最後までお読みいただきありがとうございました。
YOLOX本家のチュートリアルに沿って推論デモとcocoデータセットを用いた学習を紹介しました。
今回のシリーズも推論から学習まで、非常に使いやすいものになっています。
Light Modelsの精度がさらに向上すればエッジAI(物体検出)がさらに身近なものになりそうですね。
次回はYOLOXでカスタムデータセットの学習及び推論の方法をまとめます。
実際にデータセットを作成して学習していきます。
ぜひ合わせてご覧ください。