見出し画像

yolov8にて物体検出のオリジナルモデルを学習及び推論する(Windows11)

Yolo8を使ってみた

とうとうYoloを使ってみたくなったので、メモとして記録します。

仮想環境を作る

.\Scripts\activate で仮想環境を有効化する

cd H:\Family_data\Michi\python\
py -3.11 -m venv yolo311

cd yolo311
.\Scripts\activate

Pythonの仮想環境にultralyticsをインストールする

pip install ultralytics

labelImg(画像データに対して物体の位置や種類をラベル付けするためのオープンソースのツール)をインストールする

pip install labelImg

labelImgが不安定なので以下を修正する

星杜なぎささんページを参考に修正する

H:\Family_data\Michi\python\yolo311\Lib\site-packages\labelImg\labelimg.py
を修正する。971行目、1025行目、1026行目

971行目
1025行目、1026行目

H:\Family_data\Michi\python\yolo311\Lib\site-packages\libs\canvas.py
を修正する。526行目、530行目、531行目

526行目、530行目、531行目

projectフォルダを作る
yolo311以下にprojectフォルダを作る → H:\Family_data\Michi\python\yolo311\project

projectフォルダ下でlabelImgを起動してラベリングする

labelImg

Yoloにしておく

labelImg図

あらかじめ用意した画像フォルダを選択する

フォルダ選択

画像を矩形選択してラベリングする

ラベリングしてOKを押したらNext Imageを押す
pngファイルのところに矩形情報のtxtファイルが保存される(はず)

矩形選択とラベリング

ディレクトリ構造の準備

以下のフォルダを作る
画像ファイルはimagesに入れる(学習用と検証用に分ける)
ラベルファイル(.txt)はlabelsに入れる(学習用と検証用に分ける)

project/
├── images/
│   ├── train/       # 学習用画像
│   ├── val/         # 検証用画像
├── labels/
│   ├── train/       # 学習用ラベル(アノテーションファイル)
│   ├── val/         # 検証用ラベル
├── data.yaml        # データセットの設定ファイル

データセット設定ファイル (data.yaml) の作成

こんな感じで。(例:ドラえもん画像を学習)

train: H:/Family_data/Michi/python/yolo311/project/images/train
val: H:/Family_data/Michi/python/yolo311/project/images/val

nc: 1                        # クラス数(アノテーションで使用するカテゴリ数)
names: ['dora']              # クラス名(アノテーションのラベルと対応)

トレーニングする

(yolo311) PS H:\Family_data\Michi\python\yolo311\project> yolo task=detect mode=train model=yolov8n.pt data=data.yaml epochs=50 imgsz=640

こんな感じになる

 Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      49/50         0G     0.2899      1.494      1.031          4        640: 100%|██████████| 1/1 [00:00<00:00,  1.87it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  6.45it/s]
                   all          3          3    0.00333          1       0.49      0.339

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      50/50         0G     0.3407      1.585     0.9935          4        640: 100%|██████████| 1/1 [00:00<00:00,  1.98it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  6.56it/s]
                   all          3          3    0.00333          1       0.49      0.339

50 epochs completed in 0.016 hours.
Optimizer stripped from runs\detect\train5\weights\last.pt, 6.2MB
Optimizer stripped from runs\detect\train5\weights\best.pt, 6.2MB

Validating runs\detect\train5\weights\best.pt...
Ultralytics 8.3.36 🚀 Python-3.11.3 torch-2.5.1+cpu CPU (12th Gen Intel Core(TM) i5-12400)
Model summary (fused): 168 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  7.13it/s]
                   all          3          3    0.00333          1      0.755      0.638
Speed: 0.7ms preprocess, 37.9ms inference, 0.0ms loss, 4.2ms postprocess per image
Results saved to runs\detect\train5
💡 Learn more at https://docs.ultralytics.com/modes/train

モデルの評価をする

(yolo311) PS H:\Family_data\Michi\python\yolo311\project> yolo task=detect mode=val model=runs/detect/train4/weights/best.pt data=data.yaml
Ultralytics 8.3.36 🚀 Python-3.11.3 torch-2.5.1+cpu CPU (12th Gen Intel Core(TM) i5-12400)
Model summary (fused): 168 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
val: Scanning H:\Family_data\Michi\python\yolo311\project\labels\val.cache... 3 images, 0 backgrounds, 0 corrupt: 100%|██████████| 3/3 [00:00<?, ?it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  6.37it/s]
                   all          3          3    0.00333          1      0.755      0.638
Speed: 1.4ms preprocess, 41.9ms inference, 0.0ms loss, 4.2ms postprocess per image
Results saved to runs\detect\val2
  • Class: クラス(今回は all となっており、1つのクラス dora に対する評価が行われています)。

  • Images: 検証に使用した画像の数(今回は3枚)。

  • Instances: 画像内で検出されたオブジェクトのインスタンス数(今回は3)。

  • Box(P): バウンディングボックスの精度(Precision)を示しています。数値は 0.00333 となっていますが、これはかなり低い精度であることを示しています。

  • R (Recall): 検出率(Recall)は 1.0 で、すべてのオブジェクトを検出できていることを示します。

  • mAP50: 50% IoU(Intersection over Union)での平均精度(mAP)。0.755 という値は良好な結果です。

  • mAP50-95: IoU 50%から95%の範囲での平均精度(mAP)。0.638 という結果も良い評価ですが、改善の余地があります。

推論を実行する

画像(ドラえもんの他の画像:suiron2.png)を用意し、推論させる
結果を見ると、バウンディングボックスの精度が低いせいか、ドラえもんを検出できず。。

(yolo311) PS H:\Family_data\Michi\python\yolo311\project> yolo task=detect mode=predict model=runs/detect/train4/weights/best.pt source=H:\Family_data\Michi\python\yolo311\project\suiron\suiron2.png
Ultralytics 8.3.36 🚀 Python-3.11.3 torch-2.5.1+cpu CPU (12th Gen Intel Core(TM) i5-12400)
Model summary (fused): 168 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs

image 1/1 H:\Family_data\Michi\python\yolo311\project\suiron\suiron2.png: 640x544 (no detections), 48.1ms
Speed: 2.0ms preprocess, 48.1ms inference, 1.0ms postprocess per image at shape (1, 3, 640, 544)
Results saved to runs\detect\predict3

おわりに

ひとまず一連のフローを書き留めておきました。これでYoloを使いこなせることができるでしょう。

備考:リアルタイムで物体検出する

実行すると以下のようになる。ブラウザでhttp://localhost:8501にアクセスする。

(yolo311) PS H:\Family_data\Michi\python\yolo311> yolo streamlit-predict
💡 Loading Ultralytics Live Inference app...

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.


  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501

以下の画面が出るので左部のVideoをVideoにし、Classesを選択しStartを押せばリアルタイムで物体検出を開始する

Ultralytics画面

物体検出結果

NHK WORLDより

いいなと思ったら応援しよう!