Yolov5による物体検出 (2): 環境構築と訓練済みモデルを使った動作確認

Yolov5による物体検出 記事一覧

  • (1): 概要
  • (2): 環境構築と訓練済みモデルを使った動作確認 ← イマココ
  • (3): 少量のデータによる訓練と動作確認 ← 後で書く

環境を構築したらまずは訓練済みのデータで動作を確認します。いきなり自前のデータで訓練すると、うまく動かなかったときの原因究明が面倒だからです。それができたら自前のデータで訓練するわけですが、まずは少量のデータ(ある程度は検出可能になるくらい)で訓練してみます。今回はCOCOというパブリックなデータをダウンロードして、その一部を使います。ラベルデータもすでにあるわけですが、ラベルファイルや訓練データのディレクトリ構造など、COCOとYolov5ではいくつか異なるところがあるため、Yolov5が想定している構成になるよう変換するスクリプトを用意してやる必要があります。そのスクリプトに間違いがあると当然うまく動かないので、「スクリプト作成」→「訓練」→「結果確認」→「スクリプト修正」...というループを何度か回すことになります。最初から大量のデータを入れると1ループに時間がかかるので、まずは少量のデータでやる方が良いです。

動作環境

以下の2つで動作を確認しています。

  • Ubuntu-20.04 (WSL2)
    • CPUのみ
    • Python-3.9.4をpyenvで入れる。
    • 必要なパッケージはpipで入れる。virtualenvも使用。
  • Google Colaboratory (ハードウェアアクセラレータ: GPU)
    • Python-3.7.10 (現在のColaboratoryのデフォルト環境)
    • 必要なパッケージはpipで入れる

環境構築 - Ubuntu

Pythonはpyenvでインストールしたものを使います。バージョンは手元に入っていた3.9.4。Pythonのバージョンについてはそれほど強いバージョン制約はなさそう。Colaboratoryの方では3.7.10で動いているのでその辺りのバージョンなら多分動くでしょう。

パッケージはpipで入れますが、virtualenvも使うことにします。ディープラーニングでよく使われるtensorflow, pytorchはバージョンの制約がそれなりあるので環境を分けておいた方が無難です。

Pythonインストール

# Python本体インストール
$ sudo apt install liblzma-dev
$ pyenv install 3.9.4

注意点としてはliblzma-devパッケージをPython本体ビルド前にインストールしておきます。lzmaというモジュールがPython本体に同梱されていますが、liblzma-devパッケージが入っていないとそれが有効化されずエラーになってしまいます。手元にすでにビルド済みのPythonがあり、かつまだliblzma-devをインストールしていないなら、そのPythonは多分使えません。一度アンインストールして再ビルドしましょう。

Yolov5ダウンロード

ディレクトリ構成は以下のような感じにします。

$HOME/yolov5/
        +- dataset/ # 学習用のデータセットを置く(後で作る)
        +- yolov5/  # Yolov5スクリプト

virtualenvの設定とパッケージインストール

$ $HOME/yolov5
$ pyenv virtualenv 3.9.4 yolov5
$ echo "yolov5" > .python-version
$ cd yolov5
$ pip install -r requirements.txt

環境構築 - Colaboratory編

あとで書く。

訓練済みモデルによる検出

まずは訓練済みのモデルを使って動くかどうか確かめてみます。単にpython detect.pyを実行すれば自動的にモデルのダウンロードを行うのですが、そういうのにあまり頼るとブラックボックスになってしまうので、ここでは手動でダウンロードします。モデルはgithubのリリースページからダウンロードできるので、とりあえずyolov5s.ptをダウンロードします。置き場所はどこでもよいですが、yolov5の直下に置きました。

あとは検出を試す画像ですが、data/images以下にbus.jpgzidane.jpgが含まれているのでこれを使います。

モデルと画像が準備できたら、以下のコマンドで実行します。

$ python detect.py --weights yolov5s.pt --source data/images --device cpu

検出結果はruns/detect/exp以下にできるので、確認してみましょう。なお、以下の例外が出た場合はlzmaモジュールができていないので、上の説明を参考にしてPythonをビルドし直して再度試してください。

    from _lzma import *
ModuleNotFoundError: No module named '_lzma'

train.pyのオプション

train.pyのオプションのうちよく使いそうなものを以下に挙げます。

オプション 意味
--weights PATH モデル (ptファイル)
--source PATH 検出する画像を含むディレクト
--conf-thres THRESH 検出する閾値。デフォルトは0.25
--device DEVICE CUDAデバイス0, 0,1,2,3など。CPUの場合はcpu
--save-txt 検出結果のbboxなどをテキストファイルとして保存する
--save-conf 上記テキストファイルに検出結果のconfidenceも出力する
--project PROJECT 出力結果の保存先。PROJECT/NAMEに保存される
--name NAME 出力結果の保存先。PROJECT/NAMEに保存される

次回以降に続く。