私的AI研究会 > YOLOv7_Colab2

YOLO V7 on Google Colaboratory2

 「じゃんけん(グー・チョキ・パー)」のカスタム・データセットを作成し、Google Colaboratory 上の「YOLO V7」を使用して学習モデルを作成、じゃんけんの「グー・チョキ・パー」をリアルタイム検出する。

 

▼ 目 次
※ 最終更新:2024/01/14 

カスタムデータによる学習2「じゃんけんの判定1」

プロジェクトの目標

開発環境・使用ツール

学習データの収集<ローカルマシン>

ラベリング<ローカルマシン>

ラベリング(アノテーション)結果<ローカルマシン>

データセットの作成<ローカルマシン>

学習 Training<クラウド・サービス>

  1. GoogleColab を起動する
    前回セクション「Google Colaboratory に「YOLO V7」を実装」を未実行の場合は → ここのページを実行

  2. ノートブック「物体検出_yolov7.ipynb」を選択する

  3. 左サイドバーの「ファイル」を選択することで Googleドライブをマウントする

  4. データ・セット「janken_dataset」をフォルダごとGoogleドライブの「yolov7/data」にアップする
    yolov7 
      ┗ data
         ┗ janken_dataset

  5. 学習するのに必要な情報を記述したyamlファイル「janken_dataset.yaml」を「yolov7」の直下にアップする
    yolov7 
      ┠ data
      ┃  ┗ janken_dataset
      ┗ janken_dataset.yaml

  6. カレントディレクトリを Googleドライブ「yolov7」へ移動する
    cd /content/drive/MyDrive/yolov7
    ・結果表示
    /content/drive/MyDrive/yolov7

  7. 下記のコマンドで学習を実行する
    !python train.py --workers 8 --batch-size 16 --data janken_dataset.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x_custom --hyp data/hyp.scratch.p5.yaml --epochs 300 --device 0
    ▼ - log - GoogleColab Tesla T4

  8. 「Google colab」の接続が切れる
    ・90分ルールというのがあり何も操作せずに90分経つとリセットされる(この学習はおよそ120分かかる)
    ・無料版で GPUを使いすぎると強制的に切断される。再接続するには数時間から12時間以上の待つ必要がある
     遮断中は「GPUバックエンドに接続できません」のメッセージが表示され時間が経過する場で GPUを使うことができない

    ・接続が切れた場合、再度接続しカレントディレクトリを再設定する
    cd /content/drive/MyDrive/yolov7
    ・引数に「–resume」を追加することで、前回の途中から学習をする(正常に終了せるまで何度か繰り返す)
    !python train.py --workers 8 --batch-size 16 --data janken_dataset.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x_custom --hyp data/hyp.scratch.p5.yaml --epochs 300 --device 0  --resume
    ▼ - log - GoogleColab Tesla T4

  9. 正常に終了すると、学習結果は「yolov7/runs/train/yolov7x_custom/」に保存される
    ・学習結果モデルは「yolov7x_custom/weights」評価指標は「yolov7x_custom」
    F1 curveP curvePR curveR curve

学習結果で推論を実行する 画像編<クラウド・サービス>

  1. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を使用する
    ・テスト画像「janken.jpg」を「yolov7/」直下にアップしておく

  2. 検出コマンドを実行する
    !python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source janken.jpg
    ▼ - log - GoogleColab Tesla T4

    ・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)

学習結果で推論を実行する 画像編<ローカルマシン>

  1. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を使用する
    ・テスト画像は「/Images/janken.jpg」を使用する
    ローカルマシン上の「yolov7/」フォルダの場所は「/work/yolov7-main/」

  2. 検出コマンドを実行する
    (py38a) PS > cd /anaconda_win/work/yolov7-main
    (py38a) PS > python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source ../../Images/janken.jpg
    ▼ - log - NVIDIA GeForce GTX 1050 Ti

    ・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)

学習結果で推論を実行する 動画編<クラウド・サービス>

  1. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を使用する
    ・テスト画像「janken.mov」を「yolov7/」直下にアップしておく

  2. 検出コマンドを実行する
    !python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source janken.mov
    ▼ - log - GoogleColab Tesla T4

    ・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)
    うまく識別できていない ‼

学習結果で推論を実行する 動画編<ローカルマシン>

  1. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を使用する
    ・テスト画像は「/Videos/janken.mov」を使用する
    ローカルマシン上の「yolov7/」フォルダの場所は「/work/yolov7-main/」

  2. 検出コマンドを実行する
    (py38a) PS > cd /anaconda_win/work/yolov7-main
    (py38a) PS > python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source ../../Videos/janken.mov
    ▼ - log - NVIDIA GeForce GTX 1050 Ti

    ・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)
    うまく識別できていない ‼

学習結果で推論を実行する カメラ編<ローカルマシン>(参考)

  1. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を使用する
    ローカルマシン上の「yolov7/」フォルダの場所は「/work/yolov7-main/」

  2. 検出コマンドを実行する
    (py38a) PS > cd /anaconda_win/work/yolov7-main
    (py38a) PS > python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source 0
    ▼ - log - NVIDIA GeForce GTX 1050 Ti

    ・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)
    うまく識別できていない ‼
     強制終了なのでファイルは生成されているが読めない!

学習済みモデルを ONNX 形式にコンバートする<クラウド・サービス>

  1. onnx パッケージをインストールする
    !pip install onnx
    ▼ - log - GoogleColab Tesla T4

  2. 学習結果モデル「runs/train/yolov7x_custom/weights/best.pt」を onnx 形式に変換する
    !python export.py --weights runs/train/yolov7x_custom/weights/best.pt
    ▼ - log - GoogleColab Tesla T4

  3. 変換結果「runs/train/yolov7x_custom/weights/best.onnx」をローカルマシンにダウンロードする

OpenVINO™ で実行する<ローカルマシン>

  1. 学習済みモデル「best.onnx」を「/work/yolov7/」ディレクトリに「janken_best.onnx」の名前でコピーする
  2. ラベルファイルを「/work/yolov7/」ディレクトリに用意する
    ・janken.nams
    gook
    choki
    par
    ・janken.nams_jp
    グー
    チョキ
    パー
  3. ローカルマシンのターミナルで実行する
    (py38a) PS > cd /anaconda_win/work/yolov7
    (py38a) PS > python object_detect_yolo7.py -m janken_best.onnx -l janken.names_jp -i ../../Images/janken.jpg -o out_janken.jpg
    Starting..
     - Program title  : Object detection YOLO V7
     - OpenCV version : 4.5.5
     - OpenVINO engine: 2022.1.0-7019-cdb9bec7210-releases/2022/1
     - Input image    : ../../Images/janken.jpg
     - Model          : janken_best.onnx
     - Device         : CPU
     - Label          : janken.names_jp
     - Log level      : 3
     - Title flag     : y
     - Speed flag     : y
     - Processed out  : out_janken.jpg
     - Preprocessing  : False
     - Batch size     : 1
     - number of inf  : 1
     - With grid      : False
    FPS average:       0.90
    Finished.
  4. カメラ画像の入力(参考)
    うまく識別できていない ‼
    (py38a) PS > python object_detect_yolo7.py -m janken_best.onnx -l janken.names_jp -i cam
    Starting..
     - Program title  : Object detection YOLO V7
     - OpenCV version : 4.5.5
     - OpenVINO engine: 2022.1.0-7019-cdb9bec7210-releases/2022/1
     - Input image    : cam
     - Model          : janken_best.onnx
     - Device         : CPU
     - Label          : janken.names_jp
     - Log level      : 3
     - Title flag     : y
     - Speed flag     : y
     - Processed out  : non
     - Preprocessing  : False
     - Batch size     : 1
     - number of inf  : 1
     - With grid      : False
    FPS average:       0.90
    Finished.

ここまでのまとめと今後の課題

わかったこと

これからの課題

クラウドサービス「Google Colaboratory」について

ローカルマシンで学習(Training)

 クラウドサービスを使わずにローカルマシン上で学習できる環境を手持ちのハードウェア上に構築してみる

NVIDIAのGPUアーキテクチャ

アーキテクチャ
(読み方)
プロセスルール販売開始採用シリーズ
Kepler
(ケプラー)
28nm2012年GeForce GTX/GT 600シリーズ
2012年GeForce GTX/GT 700シリーズ
2013年GeForce GTX TITANシリーズ
Maxwell
(マクスウェル)
28nm2014年GeForce GTX 700シリーズ
2015年GeForce GTX 900シリーズ
Pascal
(パスカル)
16nm/14nm2016年GeForce GTX 10シリーズ
Turing
(チューリング)
12nm2018年GeForce RTX 20シリーズ
2019年GeForce GTX 16シリーズ
Ampere
(アンペア)
8nm2020年GeForce RTX 30シリーズ
Ada Lovelace
(エイダ・ラブレス)
5nm2022年GeForce RTX 40シリーズ

使用するハードウェア

現状確認

NVIDIA ドライバーのインストール

  1. Pytorch オフィシャルサイトからインストールコマンドを取得
  2. 公式サイトGEFORCE® ドライバーから最新バージョンのドライバーをダウンロードしてインストール
  3. CUDA 公式サイトCUDA Zoneから「Download」→「Archive of Previous CUDA Releases」とたどり「Pytorch インストールコマンド」に対応した「CUDA Toolkit」のバージョンををインストール

  4. インストール結果の確認
    (py38a) > nvidia-smi
    Fri Jun 16 12:32:27 2023
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 516.01       Driver Version: 516.01       CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0  On |                  N/A |
    | 45%   44C    P8    N/A /  75W |    146MiB /  4096MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |    0   N/A  N/A      9488    C+G   C:\Windows\explorer.exe         N/A      |
    |    0   N/A  N/A      9736    C+G   ...\PowerToys.FancyZones.exe    N/A      |
    |    0   N/A  N/A     11020    C+G   ...5n1h2txyewy\SearchApp.exe    N/A      |
    |    0   N/A  N/A     12460    C+G   ...2txyewy\TextInputHost.exe    N/A      |
    +-----------------------------------------------------------------------------+

「Pytorch」インストール

  1. Pytorch オフィシャルサイト のインストールコマンドを実行
    (py38a) PS > pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
    ▼ - log - NVIDIA GeForce GTX 1050 Ti

  2. インストール結果の確認
    (py38a) PS > pip list
    Package                 Version
    ----------------------- ------------
        :
    torch                   2.0.1+cu117
    torchaudio              2.0.2+cu117
    torchvision             0.15.2+cu117
        :
    (py38a) > python
    Python 3.8.16 (default, Mar  2 2023, 03:18:16) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import torch
    >>> print(torch.__version__)
    2.0.1+cu117
    >>> import torchvision
    >>> print(torchvision.__version__)
    0.15.2+cu117
    >>>
  3. GPU を認識しているかのテストプログラム「workspace_py37/cuda_test.py」
    import torch
    
    print(torch.__version__)
    print(f"cuda, {torch.cuda.is_available()}")
    print(f"compute_{''.join(map(str,(torch.cuda.get_device_capability())))}")
    device_num:int = torch.cuda.device_count()
    print(f"find gpu devices, {device_num}")
    for idx in range(device_num):
        print(f"cuda:{idx}, {torch.cuda.get_device_name(idx)}")
    
    print("end")
    ・実行結果
    (py38a) > python .\cuda_test.py
    2.0.1+cu117
    cuda, True
    compute_61
    find gpu devices, 1
    cuda:0, NVIDIA GeForce GTX 1050 Ti
    end

パッケージの追加

学習 Training を実行

  1. データ・セット「janken_dataset」をフォルダごと「yolov7-main/data」にアップする

  2. 学習するのに必要な情報を記述したyamlファイル「janken_dataset.yaml」を「yolov7-main」の直下にアップする

  3. 下記のコマンドで学習を実行する
    GPU ボードのメモリーサイズが 4GB なのでバッチサイズを 8>4>2 と小さくしていきエラーの出ない 2 を採用する
    (py38a) PS > python train.py --workers 8 --batch-size 2 --data janken_dataset.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x_custom2 --hyp data/hyp.scratch.p5.yaml --epochs 300 --device 0
    ▼ - log - NVIDIA GeForce GTX 1050 Ti

  4. 正常に終了すると、学習結果は「yolov7-main/runs/train/yolov7x_custom2/」に保存される
    ・学習結果モデルは「yolov7x_custom2/weights」評価指標は「yolov7x_custom2」
    この学習にかかった時間 → 21時間10分
    F1 curveP curvePR curveR curve

発生したエラー・メッセージとその原因

学習パラメータ考察

 

更新履歴

 

参考資料

 

Last-modified: 2024-01-15 (月) 11:01:43