自作データセットを用いてYOLOv8で分類を行いました。
今回は、mnist160データセットを用いて学習を行い、自作データセットを用いて分類を行いました。
mnistは、手書き数字の画像データベースです。
YOLOの最新版であるYOLOv8には日本語のドキュメントもあります。
ドキュメントとGoogle Colaboratoryのノートブックを読みながらYOLOv8を実行してみました。
YOLOv8
Google Colaboratoryにて実行しました。
ランタイム->ランタイムのタイプを変更->T4 GPUを選択
from google.colab import drive
drive.mount('/content/drive')
!mkdir "/content/drive/MyDrive/yolov8"
%pip install ultralytics
import ultralytics
ultralytics.checks()
学習
mnist160データセットを用いて、ゼロから学習を行いました。
mnist160データセットは160枚の画像から成るデータセットです。
学習(結果はyolov8/runs/classifyに保存される)
%cd "/content/drive/MyDrive/yolov8"
!yolo train data=mnist160 model=yolov8n-cls.yaml epochs=100 imgsz=64
mnistは以下のサイトから入手することもできます。
mnistの画像の大きさは28 × 28 pxです。
分類
学習結果を用いて、分類を行います。
分類に用いる自作データセット(手書き数字の画像)を、yolov8/testディレクトリに移動しました。
自作データセットは、28 × 28 pxと140 × 140 pxの2種類作成しました。
28 × 28 pxの画像
分類(結果はyolov8/runs/classifyに保存される)
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model="/content/drive/MyDrive/yolov8/runs/classify/train/weights/best.pt" source="/content/drive/MyDrive/yolov8/test"
これらの画像が出力されました。
画像が小さく、結果が画像に入りきっていません。
結果を以下に示します。
0 0 0.80, 7 0.13, 5 0.02, 2 0.01, 8 0.01
1 1 0.98, 9 0.01, 7 0.01, 8 0.00, 6 0.00
2 0 0.53, 2 0.22, 3 0.14, 6 0.07, 8 0.01
3 3 0.93, 8 0.05, 5 0.03, 2 0.00, 7 0.00
4 4 0.48, 9 0.46, 8 0.03, 7 0.01, 2 0.01
5 5 0.93, 8 0.04, 7 0.01, 3 0.01, 9 0.01
6 6 0.87, 8 0.07, 3 0.03, 2 0.01, 5 0.01
7 7 1.00, 9 0.00, 5 0.00, 4 0.00, 8 0.00
8 8 0.85, 3 0.13, 5 0.01, 9 0.00, 7 0.00
9 9 0.87, 7 0.08, 8 0.04, 4 0.01, 1 0.00
0、1、3、5、6、7、8、9は正しく分類できており、スコアが0.5以上です。
4は正しく分類できていますが、スコアが0.5未満です。
2は0に分類されてしまいました。
140 × 140 pxの画像
分類(結果はyolov8/runs/classifyに保存される)
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model="/content/drive/MyDrive/yolov8/runs/classify/train/weights/best.pt" source="/content/drive/MyDrive/yolov8/test"
これらの画像が出力されました。
結果を以下に示します。
0 0 0.56, 3 0.26, 5 0.07, 2 0.04, 8 0.03
1 1 0.80, 8 0.05, 6 0.05, 9 0.05, 7 0.02
2 3 0.54, 2 0.34, 0 0.05, 6 0.03, 5 0.03
3 3 0.77, 8 0.18, 5 0.04, 2 0.00, 7 0.00
4 4 0.76, 2 0.08, 9 0.06, 6 0.06, 8 0.03
5 8 0.70, 5 0.22, 3 0.07, 9 0.01, 7 0.00
6 6 0.44, 3 0.41, 8 0.07, 2 0.03, 5 0.02
7 7 0.61, 9 0.33, 8 0.05, 5 0.00, 4 0.00
8 8 0.54, 3 0.36, 5 0.09, 7 0.00, 9 0.00
9 8 0.68, 9 0.27, 7 0.02, 3 0.02, 5 0.02
0、1、3、4、7、8は正しく分類できており、スコアが0.5以上です。
6は正しく分類できていますが、スコアが0.5未満です。
2は3に、5は8に、9は8に分類されてしまいました。
140 × 140 pxでは、28 × 28 pxのときと異なる結果になりました。
きれいに書いたつもりだったのですが、癖があったのかもしれません。
また、mnist160データセットのデータ数が少なかった可能性があるため、次回はmnist2560データセットを用いて学習を行います。
YOLOv8で物体検出を行ってみた記事、YOLOv8でセグメンテーションを行ってみた記事も、よければご覧ください。