roboflow Workspaceでアノテーションしたデータを Google Colabで使う
ダウンロードして解凍したファイル
anotation_test.v1i.yolov8-obb
を
Google Drive へアップロード
これをGoogleColabで学習する
使用するのはT4GPU
まずは
1 2 | # Install ultralytics !pip install ultralytics |
で
ultralyticsをインストール
1 2 | from google.colab import drive drive. mount ( '/content/drive' ) |
でGoogle Driveのデータを使うためドライブをマウント
次にYamlファイルを探す
1 | /content/drive/MyDrive/InventoryControl/DailyNecessities/anotation_test .v1i.yolov8-obb /data .yaml |
がパスだったので
1 | !yolo obb train data= /content/drive/MyDrive/InventoryControl/DailyNecessities/anotation_test .v1i.yolov8-obb /data .yaml pretrained=yolov8n-obb.pt epochs=100 imgsz=640 exist_ok=True |
で実行
エポック100回で学習
モデルは小型のyolov8n-obb.ptにしましたが、
(n)の部分を(s),(l),(x)など変更可能
なお実行結果は
1 | Runs /obb/train/ |
の中に格納されている
学習したモデルで推論するので
Testフォルダにある画像で推論するので
対象ファイルを右クリックしコピー
best.pt
を右クリックしパスをコピーする
今回なら
/content/runs/obb/train/weights/best.pt
となる
あとは
model= にモデルのパス と source=’ ‘ にテスト画像パス を設定して推論
とりあえず
1 | /content/drive/MyDrive/InventoryControl/DailyNecessities/anotation_test .v1i.yolov8-obb /test/images/Baskulin3_rot270_006_jpg .rf.8e9ca7b3fac80e0bb5b1a45dedae21d1.jpg |
の画像を使うことにする
1 | !yolo obb predict model= /content/runs/obb/train/weights/best .pt source = '/content/drive/MyDrive/InventoryControl/DailyNecessities/anotation_test.v1i.yolov8-obb/test/images/Baskulin3_rot270_006_jpg.rf.8e9ca7b3fac80e0bb5b1a45dedae21d1.jpg' save=True save_txt=True exist_ok=True |
を実行
とりあえず1つだけの画像でテストしたら
1 | /content/runs/obb/predict/labels/Baskulin3_rot270_006_jpg .rf.8e9ca7b3fac80e0bb5b1a45dedae21d1.txt |
にラベルがあり
1 | /content/runs/obb/predict/Baskulin3_rot270_006_jpg .rf.8e9ca7b3fac80e0bb5b1a45dedae21d1.jpg |
に検出がされた画像が出ていた
1 | 0 0.0758179 0.237794 0.0758906 0.693102 0.643104 0.693011 0.643031 0.237704 |
最初の0は
クラスだが
今回は1つしかクラスがないので0になる
アノテーション(ラベル付け)をしていない画像を推論して、推論結果が正しかった場合、検出ラベルを学習用のデータとすることもできます。OBBのアノテーションは多少手間がかかります。そこで、最初に少量のアノテーションを行い、次にアノテーションしていない画像で推論を行い、その後推論に成功したラベルを学習データに加えて画集データを充実していくこともできます。
とのこと
次は対象物のカウント
カウントの仕方は色々ありますが、今回は、クラス設定が1つということもあり、簡単なカウントの1つとしてこのラベルの行数をカウントする方法にしました。検出したクラスのチェックもしていません。
先ほどのノートブックに以下のコードを追加し実行して、検出物のカウントします。テスト画像の変更は、source_file = の設定で変更できます。
せっかくなので
ドラッグストアでバスクリンの種類の確認のため撮影した画像でカウントの実験をする
(以前バスクリンの種類を間違えたら家族に不評だったので)
パスは
1 | /content/drive/MyDrive/PXL_20240529_101238381 .jpg |
なのでこれを指定する
対象の画像を変更するには
source_fileのパスを変更する
以下変更コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import os import subprocess source_file = '/content/drive/MyDrive/PXL_20240529_101238381.jpg' # テキストファイルのパスを構築(画像ファイル名と同じ) file_name, file_extension = os.path.splitext(source_file) label_file_path = '/content/runs/obb/predict/labels/' + os.path. basename (file_name) + '.txt' # ファイルの存在を確認し、存在する場合は削除 if os.path.exists(label_file_path): os.remove(label_file_path) # YOLOを使用して予測を実行 !yolo obb predict model= /content/runs/obb/train/weights/best .pt source = '{source_file}' save=True save_txt=True exist_ok=True # ファイルが存在する場合のみ、テキストファイルの行数を取得して表示 if os.path.exists(label_file_path): num_lines = subprocess.check_output([ "wc" , "-l" , label_file_path]).decode(). split ()[0] print( "バスクリンの数は" , num_lines) else : print( "ファイルが見つかりませんでした。" ) |
これを実行するとバスクリンの数をカウントしているのがわかる
実行結果は
1 2 3 4 5 6 7 8 9 10 11 | Ultralytics YOLOv8.2.25 <img draggable= "false" class= "emoji" alt= " src= "https://s.w.org/images/core/emoji/11/svg/1f680.svg" > Python-3.10.12 torch-2.3.0+cu121 CUDA:0 (Tesla T4, 15102MiB) YOLOv8n-obb summary (fused): 187 layers, 3077414 parameters, 0 gradients, 8.3 GFLOPs /usr/local/lib/python3 .10 /dist-packages/torch/nn/modules/conv .py:456: UserWarning: Plan failed with a cudnnException: CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed cudnn_status: CUDNN_STATUS_NOT_SUPPORTED (Triggered internally at .. /aten/src/ATen/native/cudnn/Conv_v8 .cpp:919.) return F.conv2d(input, weight, bias, self.stride, image 1 /1 /content/drive/MyDrive/PXL_20240529_101238381 .jpg: 640x512 75.5ms Speed: 4.4ms preprocess, 75.5ms inference, 983.9ms postprocess per image at shape (1, 3, 640, 512) Results saved to runs /obb/predict 2 labels saved to runs /obb/predict/labels <img draggable= "false" class= "emoji" alt= " src= "https://s.w.org/images/core/emoji/11/svg/1f4a1.svg" > Learn more at https: //docs .ultralytics.com /modes/predict バスクリンの数は 4 |
となっているので
同じバスクリンでも違う種類は識別できているのがわかる
引き続き
https://axross-recipe.com/recipes/1302#requiredSkills
を参考に学習の後に
PCやラズパイでの推論を試す