YOLOXをWindows10で使いたい
YOLOXという物体検出モデルがある。
これをWindows10の環境に導入して学習を行いたい。
公式のGitHubリポジトリはおそらくUnix系を前提としているのか「ReadMe」に素直に従うとエラーが起こる。
ここで、Windows10によるYOLOXの環境構築からCOCOデータセットを利用した学習までの実現方法を記載する。
環境構築
はじめにYOLOXの環境構築を行う。
基本的に公式の「ReadMe」の通りだが主にpytorchのインストール方法が異なる。
ダウンロード
GitHubからリポジトリ取得。
gitが入っていれば
1 | git clone https://github.com/Megvii-BaseDetection/YOLOX.git |
入ってなければ「Download ZIP」をクリックしてダウンロード後に展開。
Anaconda 環境構築
Anacondaがインストールされている前提。
入ってなければ以下を参考にして入れる。
- 仮想環境構築
yoloxという名前で環境構築。
pythonは3.6にする。
1 | conda create -n yolox python=3.6 -y |
- pytorchインストール
続いてpytorchのインストール。
https://pytorch.org/get-started/locally/
を見てコマンドを確認する。
以下のコマンドは一例。
1 | conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch -y |
- pytorch以外インストール
ダウンロードしてきた「requirments.txt」を修正。
以下のようにtorch、torchvisionをコメントアウト。
1 | # TODO: Update with exact module version |
「requirements.txt」のあるディレクトリに移動してpip install
。cython
とpycocotools
もpip
で入れる。
1 | cd YOLOX(さっきダウンロードしてきたファイルのルートディレクトリ) |
重みファイルのダウンロード
重みファイルをGithubからダウンロード。
モデルの比較表の右端にある「github」から対応したファイルをダウンロードできる。
「YOLOX」に「weights」フォルダを作成、ダウンロードしたファイル(今回は「yolox_s.pth」)を置く。
動作テスト
あらかじめ用意されているテスト用画像を使って動くか実験。
以下のコマンドで実行。
GPUが無い場合は最後の--device gpu
をcpu
にする。
1 | python tools/demo.py image -n yolox-s -c weights/yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu |
うまくいくと、
1 | YOLOX_outputs\yolox_s\vis_res\2021_〇〇_〇〇_〇〇_〇〇_〇〇 |
のような名前のフォルダが作られて中に実行結果が置かれている。
- 入力画像
- 出力画像
犬や自転車が正しく検出できていることが分かる。
エラー例
- エラー例1
1 | ModuleNotFoundError: No module named 'yolox' |
とエラーが出た場合は「yolox」フォルダにpathが通っていない。
下記のコードを「demo.py」のimport os
の後に追加したら動いた。
1 | import sys |
- エラー例2
1 | AssertionError: Torch not compiled with CUDA enabled |
pytorchを単純にpipで入れるとCUDAと接続できずにこのエラーが起きる。
学習
YOLOXによる学習を行う。
今回はもともと学習されているのと同じCOCOデータセットを使用して学習。
ダウンロード
以下のサイトからCOCOデータセットダウンロード
https://cocodataset.org/#download
しようとしたら重すぎてブラウザからのダウンロードが失敗する。
なのでコマンドプロンプトから下記のコマンドでダウンロード
1 | bitsadmin /transfer download http://images.cocodataset.org/zips/train2017.zip %CD%\train2017.zip |
丸一日かかったがダウンロード成功。
その後zip展開する。
ディレクトリ設定
もともとある「YOLOX\datasets」の中に新たなフォルダ「COCO」を作成。
以下のようにダウンロードしてきたCOCOデータセットのファイルを配置。
1 | COCO/ |
学習プログラム実行
- 学習回数修正
デフォルトの学習回数が300epochsと長い、あまり待ちたくないので100にした。
変更したい場合は、yolox/exp/yolox_base.pyを修正。
1 | self.max_epoch = 300 |
の300を好きな値に変える。
- 学習開始
以下のコマンドで学習が始まる。-d
はGPUの数、-b
はバッチサイズ。
1 | python tools/train.py -n yolox-s -d 1 -b 8 |
エラーがでなければうまくいっている、学習が終わるのを待つ。
あまりに長そうなら強制終了して学習回数を減らして再度挑戦。
エラー例
- エラー例1
1 | ModuleNotFoundError: No module named 'yolox' |
とエラーが出た場合は「yolox」フォルダにpathが通っていない。
下記のコードを「train.py」のfrom yolox.core ~~
の前に追加したら動いた。
1 | import os |
- エラー例2
1 | assert img is not None |
が出たらファイルのpathがおかしい。
「data/datasets/coco.py」のassert img is not None
の前あたりでimg_file
をprint
したらどこを参照してるかわかる。
私の場合は
1 | COCO/datasets/tarain2017/train2017/~~.jpg |
のようにtrain2017が2重になっていた。
学習結果確認
学習された重みファイルが「YOLOX_outputs」内に作られる。
ちゃんと学習できているか実験して確認。
作成されたbest_ckpt.pth
をweights
に移動。
best_ckpt.pth
を指定してデモアプリを実行。
1 | python tools/demo.py image -n yolox-s -c weights/best_ckpt.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu |
- 入力画像
- 自作学習モデルによる出力画像
- 既存学習モデルによる出力画像
犬、自転車、車はバウンディングボックスが大きかったり値が低かったりするが正しく認識できている。
裏の柱がテレビなのは明らかな間違いだがバイクに関しては自作の方が正しいようにも思える。
なんにせよ学習できていることは伝わってくるので良し。
これを応用して今後は自作データセットの学習も行える。