Windows10でYOLOXの学習

Windows10でYOLOXの学習

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
2
conda create -n yolox python=3.6 -y
conda activate yolox
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TODO: Update with exact module version
numpy
#torch>=1.7
opencv_python
loguru
scikit-image
tqdm
#torchvision
Pillow
thop
ninja
tabulate
tensorboard

# verified versions
onnx==1.8.1
onnxruntime==1.8.0
onnx-simplifier==0.3.5

「requirements.txt」のあるディレクトリに移動してpip install
cythonpycocotoolspipで入れる。

1
2
3
cd YOLOX(さっきダウンロードしてきたファイルのルートディレクトリ)
pip install -r requirements.txt
pip install cython pycocotools

重みファイルのダウンロード

重みファイルをGithubからダウンロード。
モデルの比較表の右端にある「github」から対応したファイルをダウンロードできる。



「YOLOX」に「weights」フォルダを作成、ダウンロードしたファイル(今回は「yolox_s.pth」)を置く。

動作テスト

あらかじめ用意されているテスト用画像を使って動くか実験。

以下のコマンドで実行。
GPUが無い場合は最後の--device gpucpuにする。

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
2
import sys
sys.path.append(os.getcwd())
  • エラー例2
1
AssertionError: Torch not compiled with CUDA enabled

pytorchを単純にpipで入れるとCUDAと接続できずにこのエラーが起きる。

学習

YOLOXによる学習を行う。
今回はもともと学習されているのと同じCOCOデータセットを使用して学習。

ダウンロード

以下のサイトからCOCOデータセットダウンロード
https://cocodataset.org/#download

しようとしたら重すぎてブラウザからのダウンロードが失敗する。

なのでコマンドプロンプトから下記のコマンドでダウンロード

1
2
3
bitsadmin /transfer download http://images.cocodataset.org/zips/train2017.zip %CD%\train2017.zip
bitsadmin /transfer download http://images.cocodataset.org/zips/val2017.zip %CD%\val2017.zip
bitsadmin /transfer download http://images.cocodataset.org/annotations/annotations_trainval2017.zip %CD%\annotations_trainval2017.zip

丸一日かかったがダウンロード成功。
その後zip展開する。

ディレクトリ設定

もともとある「YOLOX\datasets」の中に新たなフォルダ「COCO」を作成。
以下のようにダウンロードしてきたCOCOデータセットのファイルを配置。

1
2
3
4
5
6
7
8
9
10
COCO/
annotations/
instances_train2017.json
instances_val2017.json
train2017/
~~.jpg
~~.jpg
val2017/
~~.jpg
~~.jpg

学習プログラム実行

  • 学習回数修正

デフォルトの学習回数が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
2
3
import os
import sys
sys.path.append(os.getcwd())
  • エラー例2
1
2
    assert img is not None
AssertionError

が出たらファイルのpathがおかしい。
「data/datasets/coco.py」のassert img is not Noneの前あたりでimg_fileprintしたらどこを参照してるかわかる。

私の場合は

1
COCO/datasets/tarain2017/train2017/~~.jpg

のようにtrain2017が2重になっていた。

学習結果確認

学習された重みファイルが「YOLOX_outputs」内に作られる。

ちゃんと学習できているか実験して確認。
作成されたbest_ckpt.pthweightsに移動。

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

  • 入力画像


  • 自作学習モデルによる出力画像


  • 既存学習モデルによる出力画像


犬、自転車、車はバウンディングボックスが大きかったり値が低かったりするが正しく認識できている。
裏の柱がテレビなのは明らかな間違いだがバイクに関しては自作の方が正しいようにも思える。

なんにせよ学習できていることは伝わってくるので良し。
これを応用して今後は自作データセットの学習も行える。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×