私的AI研究会 > YOLOv7_Colab2
「じゃんけん(グー・チョキ・パー)」のカスタム・データセットを作成し、Google Colaboratory 上の「YOLO V7」を使用して学習モデルを作成、じゃんけんの「グー・チョキ・パー」をリアルタイム検出する。
▼ 目 次※ 最終更新:2024/01/14
開発環境 | 特記事項 |
Google Colab | 学習(モデル生成)時に使用。GPUを利用できるため学習スピードが早い |
Local PC Webカメラ | 静止画撮影、ラベリング、物体検出時に使用する Windows(Linuxも可) pythonの仮想環境はanacondaを利用 |
種別 | ツール名 | 用途 |
Google Colab | YOLO v7 | 学習(モデル生成) |
Local PC | YOLO v7 | 物体検出 フリーウェア(GNU GPL V3) |
カメラアプリ | 静止画撮影 Windows標準アプリ | |
labelimg | 教師データのラベリング フリーウェア(MIT License) |
janken → 撮影データフォルダ │ ├─ goo → 「グー」の写真フォルダ │ ├─ goo_001.jpg │ ├─ goo_002.jpg │ ︙ ︙ │ └─ goo_200.jpg ├─ choki → 「チョキ」の写真フォルダ │ ├─ choki_001.jpg │ ├─ choki_002.jpg │ ︙ ︙ │ └─ choki_200.jpg └─ par → 「パー」の写真フォルダ ├─ par_001.jpg ├─ par_002.jpg ︙ ︙ └─ par_200.jpg
PS > conda activate py38a (py38a) PS > pip install labelImg
goo choki par・「labelImg」を起動する
(py38a) PS > cd /anaconda_win/work/labelImg/janken/ (py38a) PS > labelImg par predefined_classes.txt par・左サイドバーの「フォーマット」をYOLOに設定する
class x_center y_center width height・先頭列がクラス表す、クラス番号は0から始まる
2 0.458594 0.502083 0.642188 0.812500 ↑ クラス2 が定義されていることを表す
goo ← クラス0が定義されていることを表す choki ← クラス1が定義されていることを表す par ← クラス2が定義されていることを表す
janken_dataset → データセット フォルダ │ ├─ train → トレーニング用データ フォルダ │ ├─ images │ │ ├─ XXXXXXX.jpg → 画像ファイル フォルダ │ ︙ ︙ │ │ │ └─ labels │ ├─ XXXXXXX.txt → ラベルファイル フォルダ │ ︙ │ └─ varid → 学習状況の検証用データフォルダ ├─ images │ ├─ XXXXXXX.jpg → 画像ファイル フォルダ ︙ ︙ │ └─ labels ├─ XXXXXXX.txt → ラベルファイル フォルダ ︙
train: ./data/janken_dataset/train/images val: ./data/janken_dataset/valid/images nc: 3 names: ['goo', 'choki', 'par']
yolov7 ┗ data ┗ janken_dataset
yolov7 ┠ data ┃ ┗ janken_dataset ┗ janken_dataset.yaml
cd /content/drive/MyDrive/yolov7・結果表示
/content/drive/MyDrive/yolov7
!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
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
!python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source janken.jpg
(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
!python detect.py --weights runs/train/yolov7x_custom/weights/best.pt --conf 0.25 --img-size 640 --source janken.mov
(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
(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
!pip install onnx
!python export.py --weights runs/train/yolov7x_custom/weights/best.pt
gook choki par・janken.nams_jp
グー チョキ パー
(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.
(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.
!nvidia-smi
Thu Jun 15 10:41:46 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.85.12 Driver Version: 525.85.12 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 | | N/A 51C P8 12W / 70W | 0MiB / 15360MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
## colab.py (Windows 環境の場合) import time import datetime import webbrowser # 1時間毎に任意のノートブックを開く(90分ルールの対策) for i in range(12): browse = webbrowser.get('windows-default') browse.open('<任意のノートブックのURL>') print(i, datetime.datetime.today()) time.sleep(60*60)
クラウドサービスを使わずにローカルマシン上で学習できる環境を手持ちのハードウェア上に構築してみる
アーキテクチャ (読み方) | プロセスルール | 販売開始 | 採用シリーズ |
Kepler (ケプラー) | 28nm | 2012年 | GeForce GTX/GT 600シリーズ |
2012年 | GeForce GTX/GT 700シリーズ | ||
2013年 | GeForce GTX TITANシリーズ | ||
Maxwell (マクスウェル) | 28nm | 2014年 | GeForce GTX 700シリーズ |
2015年 | GeForce GTX 900シリーズ | ||
Pascal (パスカル) | 16nm/14nm | 2016年 | GeForce GTX 10シリーズ |
Turing (チューリング) | 12nm | 2018年 | GeForce RTX 20シリーズ |
2019年 | GeForce GTX 16シリーズ | ||
Ampere (アンペア) | 8nm | 2020年 | GeForce RTX 30シリーズ |
Ada Lovelace (エイダ・ラブレス) | 5nm | 2022年 | GeForce RTX 40シリーズ |
(py38a) PS > 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.0+cpu >>> import torchvision >>> print(torchvision.__version__) 0.15.0+cpu >>> quit Use quit() or Ctrl-Z plus Return to exit >>> ^Z
(py38a) PS > pip uninstall torch torchvision torchaudio
(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 | +-----------------------------------------------------------------------------+
(py38a) PS > pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
(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 >>>
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
(py38a) PS > pip install tensorboard
(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
: Traceback (most recent call last): File "train.py", line 21, in <module> from torch.utils.tensorboard import SummaryWriter File "C:\Users\XXXXX\anaconda3\envs\py38a\lib\site-packages\torch\utils\tensorboard\__init__.py", line 1, in <module> import tensorboard ModuleNotFoundError: No module named 'tensorboard'
: Traceback (most recent call last): File "train.py", line 595, in <module> device = select_device(opt.device, batch_size=opt.batch_size) File "N:\anaconda_win\work\yolov7-main\utils\torch_utils.py", line 71, in select_device assert torch.cuda.is_available(), f'CUDA unavailable, invalid device {device} requested' # check availability AssertionError: CUDA unavailable, invalid device 0 requested
: Traceback (most recent call last): File "train.py", line 616, in <module> train(hyp, opt, device, tb_writer) File "train.py", line 86, in train attempt_download(weights) # download if not found locally File "N:\anaconda_win\work\yolov7-main\utils\google_utils.py", line 31, in attempt_download tag = subprocess.check_output('git tag', shell=True).decode().split()[-1] File "C:\Users\XXXXX\anaconda3\envs\py38a\lib\subprocess.py", line 415, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "C:\Users\XXXXX\anaconda3\envs\py38a\lib\subprocess.py", line 516, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command 'git tag' returned non-zero exit status 128.