#author("2023-09-11T02:15:47+00:00","default:mizutu","mizutu")
#author("2023-09-11T05:44:48+00:00","default:mizutu","mizutu")
[[私的AI研究会]] > Colab
* Google Colaboratory で機械学習 [#z1fcd891]
#ref(colab_s.jpg,right,around,40%,colab_s.jpg)
 機械学習や Deep Learning の実行環境に「Google Colaboratory」を使ってみる~
 YOLO V7 を使ってカスタムデータによる学習を実行する~
#contents
#clear
RIGHT:&size(12){※ 最終更新:2023/09/11 };

** Google Colaboratory 動作確認 [#f1005ae5]
*** Google Colaboratory を使ってみる [#q2d16be2]
+ Google の[[「Colaboratory へようこそ」>+https://colab.research.google.com//?hl=ja]] ページを開く~
#ref(20230910_000000_001m.jpg,right,around,15%,20230910_000000_001m.jpg)
~
+ Googleアカウントにログインしていなければログインする~
~
+「ファイル」メニューまたはダイアログのボタンから「ノートブックを新規作成」を選択~
#ref(20230910_000005_001m.jpg,left,around,15%,20230910_000005_001m.jpg)
#ref(20230910_000006_001m.jpg,left,around,15%,20230910_000006_001m.jpg)
#clear
~
+ ''左上のタイトル(Untitled*)を「yolov7_custom」に変更する''~
~
+ セルにコードを入力し、左側の三角ボタンをクリックするか「Ctrl」+「Enter」を押して実行する~
#ref(20230910_000011_001m.jpg,right,around,20%,20230910_000011_001m.jpg)
#codeprettify(){{
print("hello colaboratory!")
}}
入力欄(セル)の下に結果が表示され簡単に Python の実行環境が手に入る~
~
&color(green){''※「ノートブック」でのコマンド実行手順''};
++ セルが表示されていない場合は「+コード」メニューを押しセルを表示する~
++ セルにコマンドを入力し、三角ボタンをクリックするか「Ctrl」+「Enter」を押す~
++ ''先頭に「!」をつけることで、PythonではなくOSのコマンドラインに命令を送ることができる''~
#clear

*** Google Colaboratory の実行環境を設定(確認)する [#yabd4487]
#ref(20230910_000012_001m.jpg,right,around,20%,20230910_000012_001m.jpg)
+ メニューから「ランタイム」→「ランタイムのタイプを変更」を選ぶ~
#ref(20230910_000014_001m.jpg,right,around,20%,20230910_000014_001m.jpg)
~
+ 表示されたダイアログから「GPU」を選ぶ~
&color(red){GPU を設定する};~
~
+ スペックを確認する~
~
++「lshw」をインストールする~
#codeprettify(){{
!apt install lshw
}}
++ハードウェア情報を収集するために「lshw」を実行する~
#codeprettify(){{
!lshw

    :
     *-memory
          description: System memory
          physical id: 0
          size: 12GiB
     *-cpu
          product: Intel(R) Xeon(R) CPU @ 2.20GHz
          vendor: Intel Corp.
          physical id: 1
          bus info: cpu@0
          width: 64 bits
    :
        *-display
             description: 3D controller
             product: TU104GL [Tesla T4]
             vendor: NVIDIA Corporation
             physical id: 4
             bus info: pci@0000:00:04.0
             version: a1
             width: 64 bits
             clock: 33MHz
    :
}}
※「CPU Intel(R) Xeon(R) 2.20GHz」「メモリ 12GB」「GPU Tesla T4」の実行環境が確認できる~
#clear

*** Google Drive に作業領域を確保する [#t6834b14]
*** Google Drive に作業領域を確保する [#y04956a5]
+ [[Googleドライブ>+https://drive.google.com/drive/my-drive]]を起動する~
Googleアカウントにログインしていなければログインする~
~
+ マイドライブ直下に新しく「try」フォルダを作成する~
マイドライブ表示エリアでマウス右クリック、「新しいフォルダ」を選択する~
~
#ref(20230910_000001_001m.jpg,left,around,15%,20230910_000001_001m.jpg)
#ref(20230910_000002_001m.jpg,left,around,15%,20230910_000002_001m.jpg)
#ref(20230910_000003_001m.jpg,left,around,15%,20230910_000003_001m.jpg)
#clear

*** Google Colaboratory に Googleドライブをマウントする [#z2e1a8c0]
*** Google Colaboratory に Googleドライブをマウントする [#y62289ec]
#ref(20230910_000020_001m.jpg,right,around,20%,20230910_000020_001m.jpg)
+ [[「Google Colaboratory>+https://colab.research.google.com//?hl=ja]] ページの右「ファイル」①を押す~
~
+ 左上の「ドライブをマウント」②を押す~
~
+ ダイアログが表示された場合「Googleドライブに接続」を押す~
#ref(20230910_000021_001m.jpg,right,around,20%,20230910_000021_001m.jpg)
~
+ マウントが完了すると「drive」フォルダ③が表示される~
前項で作成した「try」フォルダが表示されることを確認する~
~
参考 → [[GoogleColabでGoogleドライブをマウント>+https://kenko-keep.com/google-colab-mount/]]~
#clear

** Google Colaboratory に「YOLO V7」を実装 [#h467958f]
*** 物体検出 AI「YOLO V7」をインストール [#f7e04f3c]
** Google Colaboratory に「YOLO V7」を実装 [#i1de0b06]
*** 物体検出 AI「YOLO V7」をインストール [#t585dfbc]
+ カレントディレクトリを「MyDrive/try7」へ移動する~
#codeprettify(){{
cd /content/drive/MyDrive/try
}}
・結果表示
 /content/drive/MyDrive/try
※ カレントディレクトリを確認するコマンド~
#codeprettify(){{
!pwd
}}
~
+ [[YOLO v7 オフィシャルサイト>+https://github.com/WongKinYiu/yolov7]] から下記コマンドでプロジェクトをクローン~
#codeprettify(){{
!git clone https://github.com/WongKinYiu/yolov7
}}
#divregion( - log -)
#codeprettify(){{
Cloning into 'yolov7'...
remote: Enumerating objects: 1154, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 1154 (delta 8), reused 13 (delta 7), pack-reused 1139
Receiving objects: 100% (1154/1154), 70.42 MiB | 17.19 MiB/s, done.
Resolving deltas: 100% (494/494), done.
Updating files: 100% (104/104), done.
}}
#enddivregion
~
・成功するとGoogleドライブ「/MyDrive/try」に「yolov7」というディレクトリが作成される~
~
+ カレントディレクトリを「yolov7」へ移動する~
#codeprettify(){{
cd yolov7
}}
~
#ref(20230911_000001_001m.jpg,right,around,20%,20230911_000001_001m.jpg)
+ 必要なライブラリをインストール~
#codeprettify(){{
!pip install -r requirements.txt
}}
#divregion( - log -)
#codeprettify(){{
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: matplotlib>=3.2.2 in /usr/local/lib/python3.10/dist-packages (from -r requirements.txt (line 4)) (3.7.1)
Requirement already satisfied: numpy<1.24.0,>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from -r requirements.txt (line 5)) (1.22.4)
Requirement already satisfied: opencv-python>=4.1.1 in /usr/local/lib/python3.10/dist-packages (from -r requirements.txt (line 6)) (4.7.0.72)
Requirement already satisfied: Pillow>=7.1.2 in /usr/local/lib/python3.10/dist-packages (from -r requirements.txt (line 7)) (8.4.0)
    :
    :
Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch!=1.12.0,>=1.7.0->-r requirements.txt (line 11)) (1.3.0)
Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.4.1->-r requirements.txt (line 17)) (0.5.0)
Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard>=2.4.1->-r requirements.txt (line 17)) (3.2.2)
Installing collected packages: jedi, thop
Successfully installed jedi-0.18.2 thop-0.1.1.post2209072238
}}
#enddivregion
~
+ 学習済みモデルをダウンロード~
・YOLOv7 には学習済みモデルがいくつも用意されているが今回は「yolov7-tiny.pt」を使用する~
#codeprettify(){{
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
}}
#divregion( - log -)
#codeprettify(){{
--2023-09-11 00:32:33--  https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
Resolving github.com (github.com)... 140.82.113.3
Connecting to github.com (github.com)|140.82.113.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/511187726/ba7d01ee-125a-4134-8864-fa1abcbf94d5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230911%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230911T003233Z&X-Amz-Expires=300&X-Amz-Signature=e69beb9fd21b30dd684c024a58df89cf2d7402d3d85998f3cee7397cd2680e1b&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=511187726&response-content-disposition=attachment%3B%20filename%3Dyolov7-tiny.pt&response-content-type=application%2Foctet-stream [following]
--2023-09-11 00:32:33--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/511187726/ba7d01ee-125a-4134-8864-fa1abcbf94d5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230911%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230911T003233Z&X-Amz-Expires=300&X-Amz-Signature=e69beb9fd21b30dd684c024a58df89cf2d7402d3d85998f3cee7397cd2680e1b&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=511187726&response-content-disposition=attachment%3B%20filename%3Dyolov7-tiny.pt&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12639769 (12M) [application/octet-stream]
Saving to: ‘yolov7-tiny.pt’

yolov7-tiny.pt      100%[===================>]  12.05M  34.6MB/s    in 0.3s    

2023-09-11 00:32:33 (34.6 MB/s) - ‘yolov7-tiny.pt’ saved [12639769/12639769]
}}
#enddivregion


*** サンプル画像の物体検出 [#e76fd520]
*** サンプル画像の物体検出 [#rc31552a]
+ サンプル画像の物体検出を実行する~
#codeprettify(){{
!python detect.py --source inference/images/ --weights yolov7-tiny.pt --conf 0.25 --img-size 1280 --device 0
}}
#divregion( - log -)
#codeprettify(){{
Namespace(weights=['yolov7-tiny.pt'], source='inference/images/', img_size=1280, conf_thres=0.25, iou_thres=0.45, device='0', view_img=False, save_txt=False, save_conf=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='exp', exist_ok=False, no_trace=False)
YOLOR 🚀 v0.1-126-g84932d7 torch 2.0.1+cu118 CUDA:0 (Tesla T4, 15101.8125MB)

Fusing layers... 
Model Summary: 200 layers, 6219709 parameters, 229245 gradients
 Convert model to Traced-model... 
 traced_script_module saved! 
 model is traced! 

/usr/local/lib/python3.10/dist-packages/torch/functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:3483.)
  return _VF.meshgrid(tensors, **kwargs)  # type: ignore[attr-defined]
4 persons, 1 bus, Done. (13.4ms) Inference, (31.8ms) NMS
 The image with the result is saved in: runs/detect/exp/bus.jpg
5 horses, Done. (12.3ms) Inference, (1.8ms) NMS
 The image with the result is saved in: runs/detect/exp/horses.jpg
3 persons, Done. (15.3ms) Inference, (1.9ms) NMS
 The image with the result is saved in: runs/detect/exp/image1.jpg
2 persons, Done. (12.9ms) Inference, (1.2ms) NMS
 The image with the result is saved in: runs/detect/exp/image2.jpg
1 dog, 1 horse, Done. (12.6ms) Inference, (1.3ms) NMS
 The image with the result is saved in: runs/detect/exp/image3.jpg
2 persons, 2 ties, Done. (10.9ms) Inference, (1.5ms) NMS
 The image with the result is saved in: runs/detect/exp/zidane.jpg
Done. (1.881s)
}}
#enddivregion
~
#ref(20230911_000002_001m.jpg,left,around,12%,20230911_000002_001m.jpg)
~
・サンプル画像は「yolov7/inference/images」を「–source」オプションで指定~
・推論結果の保存先は「yolov7/runs/detect/exp*」( * は自動的に振られる番号)~
・結果の画像は「Google Colab」のファイル、または「Google Drive」で参照(ダウンロード)できる~
#clear
・出力画像(6枚)~
#ref(YOLOv7_Colab/20230510_bus_m.jpg,left,around,18%,20230510_bus_m.jpg)
#ref(YOLOv7_Colab/20230510_horses_m.jpg,left,around,25%,20230510_horses_m.jpg)
#ref(YOLOv7_Colab/20230510_image1_m.jpg,left,around,25%,20230510_image1_m.jpg)
#ref(YOLOv7_Colab/20230510_image2_m.jpg,left,around,25%,20230510_image2_m.jpg)
#ref(YOLOv7_Colab/20230510_image3_m.jpg,left,around,30%,20230510_image3_m.jpg)
#ref(YOLOv7_Colab/20230510_zidane_m.jpg,left,around,20%,20230510_zidane_m.jpg)
#clear

#ref(20230911_000004_001m.jpg,right,around,12%,20230911_000004_001m.jpg)
#ref(20230911_000003_001m.jpg,right,around,12%,20230911_000003_001m.jpg)
*** ランタイム接続を切断する [#t7971ce3]
*** ランタイム接続を切断する [#kb22ee73]
+ メニューバー「ランタイム」→「ランタイムを接続解除して削除」を選択する~
~
+ ダイアログ選択で「はい」を押す~
~
※ ''GPUを選択している場合、実行しない場合は接続解除するほうが望ましい(時間制限がかかるので)''~
#clear

** カスタムデータで学習する [#s4b0f62f]
*** 事前準備(データセットのアップロード) [#vc09bc9c]
** カスタムデータで学習する [#c28d25f4]
*** 事前準備(データセットのアップロード) [#zcab74a9]
+ [[Googleドライブ>+https://drive.google.com/drive/my-drive]]を起動する~
~
#ref(20230911_000005_001m.jpg,right,around,20%,20230911_000005_001m.jpg)
+ データ・セット「yolov7-main/data/janken4_dataset」をフォルダごとGoogleドライブの「MyDrive/try/yolov7/data」にアップする~
#codeprettify(){{
yolov7 
  ┗ data
     ┗ janken4_dataset
}}
~
+ 学習するのに必要な情報を記述したyamlファイル「yolov7-main/janken4_dataset.yaml」を「MyDrive/try/yolov7」の直下にアップする~
#codeprettify(){{
yolov7 
  ┠ data
  ┃  ┗ janken4_dataset
  ┗ janken4_dataset.yaml
}}
~
+ アップロードには数分かかるので、右下の「アップロード完了」の表示を確認してから次に進む~

*** Google Colaboratory で学習を実行する [#aabce0ab]
*** Google Colaboratory で学習を実行する [#bd1a1955]
+ [[GoogleColab>+https://colab.research.google.com/?hl=ja]] を起動し、ノートブック「yolov7_custom.ipynb」を選択する~
~
+ 左サイドバーの「ファイル」を選択することで [[Googleドライブ>+https://drive.google.com/drive/my-drive]]をマウントする~
~
+ カレントディレクトリを「MyDrive/try/yolov7」へ移動する~
#codeprettify(){{
cd /content/drive/MyDrive/yolov7
cd /content/drive/MyDrive/try/yolov7
}}
 /content/drive/MyDrive/yolov7
 /content/drive/MyDrive/try/yolov7
+ ''下記のコマンドで「janken4_dataset」を学習する (yolov7-tiny)''~
#codeprettify(){{
!python train.py --workers 8 --batch-size 32 --data janken4_dataset.yaml --cfg cfg/training/yolov7-tiny.yaml --weights 'yolov7-tiny.pt' --name yolov7-tiny_jk4 --hyp data/hyp.scratch.tiny.yaml --epochs 50 --device 0
}}
#divregion( - log - '''GoogleColab Tesla T4''')
#codeprettify(){{

}}
#enddivregion
~
#ref(20230911_000006_001m.jpg,right,around,15%,20230911_000006_001m.jpg)
+ およそ50分で正常に終了すると、学習結果は「yolov7/runs/train/yolov7-tiny_jk4/」に保存される~
~
+ onnx パッケージをインストールする~
#codeprettify(){{
!pip install onnx
}}
#divregion( - log - '''GoogleColab Tesla T4''')
#codeprettify(){{

}}
#enddivregion
~
+ 学習結果モデル「runs/train/yolov7-tiny_jk4/weights/best.pt」を onnx 形式に変換する~
#codeprettify(){{
!python export.py --weights runs/train/yolov7-tiny_jk4/weights/best.pt
}}
#divregion( - log - '''GoogleColab Tesla T4''')
#codeprettify(){{

}}
#enddivregion
~
+ 学習結果 モデルは「yolov7-tiny_jk4/weights」評価指標は「yolov7-tiny_jk4」フォルダ~
|CENTER:F1 curve|CENTER:P curve|CENTER:PR curve|CENTER:R curve|h
|#ref(jk4_tiny_F1_curve_m.jpg,left,around,15%,F1_curve_m.jpg)|#ref(jk4_tiny_P_curve_m.jpg,left,around,15%,P_curve_m.jpg)|#ref(jk4_tiny_PR_curve_m.jpg,left,around,15%,PR_curve_m.jpg)|#ref(jk4_tiny_R_curve_m.jpg,left,around,15%,R_curve_m.jpg)|
#ref(jk4_tiny_results_m.jpg,left,around,40%,results_m.jpg)
#ref(jk4_tiny_confusion_matrix_m.jpg,left,around,25%,confusion_matrix_m.jpg)
#clear
#ref(jk4_tiny_test_batch0_labels.jpg,left,around,10%,test_batch0_labels.jpg)
#ref(jk4_tiny_test_batch0_pred.jpg,left,around,10%,test_batch0_pred.jpg)
#ref(jk4_tiny_test_batch1_labels.jpg,left,around,10%,test_batch1_labels.jpg)
#ref(jk4_tiny_test_batch1_pred.jpg,left,around,10%,test_batch1_pred.jpg)
#ref(jk4_tiny_test_batch2_labels.jpg,left,around,10%,test_batch2_labels.jpg)
#ref(jk4_tiny_test_batch2_pred.jpg,left,around,10%,test_batch2_pred.jpg)
#clear
~
+ ''GoogleColab を終了し、Googleドライブから学習結果をローカル・マシンにダウンロードする''~
Google Drive 上の「yolov7-tiny_jk4」フォルダをダウンロード(圧縮ファイルを展開)~
「MyDrive/try/yolov7/runs/train/yolov7-tiny_jk4」→「yolov7-main/runs/train/yolov7-tiny_jk4」~

** 学習済みモデルで推論を実行する [#rcac2151]
*** ローカルマシンで推論実行 [#q0289c3d]
- OpenVINO™ での実行~
・実行ディレクトリへ切り替える~
#codeprettify(){{
(py38a) PS > cd /anaconda_win/work/yolov7
}}
- 推論実行コマンド~
|CENTER:60|LEFT:800|c
|&color(blue){入力ソース};|CENTER:コマンド|h
|カメラ画像|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i cam}; -d GPU|
|janken3.jpg|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i ../../Images/janken3.jpg}; -d GPU|
|janken2.jpg|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i ../../Images/janken2.jpg}; -d GPU|
|janken.jpg|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i ../../Images/janken.jpg}; -d GPU|
|janken_test.mp4|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i ../../Videos/janken_test.mp4};|
|janken_test2.mp4|python object_detect_yolo7.py &color(green){-m ../yolov7-main/runs/train/yolov7-tiny_jk4/weights/best.onnx}; -l janken.names_jp &color(blue){-i ../../Videos/janken_test2.mp4};|

** 更新履歴 [#xb095000]
- 2023/02/22 初版~
- 2023/09/10 全面改訂 YOLOv7 カスタムデータによる学習~~
#br

* 参考資料 [#z668d3a1]
- [[Colaboratory へようこそ>+https://colab.research.google.com/]]~
- [[Google Colaboratoryの無料GPU環境を使ってみた>+https://www.tdi.co.jp/miso/google-colaboratory-gpu]]~

#br