自作データセットを用いてYOLOv8で分類を行った

自作データセットを用いてYOLOv8で分類を行いました。
今回は、mnist160データセットを用いて学習を行い、自作データセットを用いて分類を行いました。
[mnist](https://docs.ultralytics.com/datasets/classify/mnist/)は、手書き数字の画像データベースです。
YOLOの最新版であるYOLOv8には日本語のドキュメントもあります。

https://docs.ultralytics.com/ja/

https://github.com/ultralytics/ultralytics

ドキュメントと[Google Colaboratoryのノートブック](https://colab.research.google.com/github/ultralytics/ultralytics/blob/main/examples/tutorial.ipynb)を読みながらYOLOv8を実行してみました。

# YOLOv8
Google Colaboratoryにて実行しました。
ランタイム->ランタイムのタイプを変更->T4 GPUを選択
```Python
from google.colab import drive
drive.mount('/content/drive')
```
```Python
!mkdir "/content/drive/MyDrive/yolov8"
```
```Python
%pip install ultralytics
import ultralytics
ultralytics.checks()
```

# 学習
mnist160データセットを用いて、ゼロから学習を行いました。
mnist160データセットは160枚の画像から成るデータセットです。

学習（結果はyolov8/runs/classifyに保存される）
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo train data=mnist160 model=yolov8n-cls.yaml epochs=100 imgsz=64
```

mnistは以下のサイトから入手することもできます。

https://github.com/ultralytics/yolov5/releases

mnistの画像の大きさは28 × 28 pxです。

# 分類
学習結果を用いて、分類を行います。
分類に用いる自作データセット（手書き数字の画像）を、yolov8/testディレクトリに移動しました。
自作データセットは、28 × 28 pxと140 × 140 pxの2種類作成しました。

## 28 × 28 pxの画像
分類（結果はyolov8/runs/classifyに保存される）
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model="/content/drive/MyDrive/yolov8/runs/classify/train/weights/best.pt" source="/content/drive/MyDrive/yolov8/test"
```

![IMG_0017.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/f043f900-52d0-097f-c963-760f92ce41fa.png)![IMG_0018.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/5237a8ec-769d-c499-5de0-d19a50265f1f.png)![IMG_0019.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/4ed14ae1-5eff-b9d2-22c2-8cf81c8902fa.png)![IMG_0020.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/f7bc8ad5-5747-d69b-aaf4-0891063c2b7b.png)![IMG_0021.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/fa999945-5c60-bc15-9830-ebf5efbb3182.png)![IMG_0022.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/b4691b71-faa0-66e2-61c9-44e60762dbb5.png)![IMG_0023.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/fcd35ed0-f8d3-371b-b71f-7a150d9bcfb9.png)![IMG_0024.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/4b369756-4834-d03a-091b-fb673a9df8c3.png)![IMG_0025.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/62446e97-0f37-f994-3fdb-05a0a0d48164.png)![IMG_0026.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/adffa87d-8d26-3bbf-c436-4637b67e1815.png)

これらの画像が出力されました。
画像が小さく、結果が画像に入りきっていません。
結果を以下に示します。
```
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に保存される）
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model="/content/drive/MyDrive/yolov8/runs/classify/train/weights/best.pt" source="/content/drive/MyDrive/yolov8/test"
```

![IMG_0028.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/3030199d-e70c-141d-1f56-e8ced4b35ac9.png)![IMG_0029.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/91d95d7d-b6e1-a569-0458-900a36188fbc.png)![IMG_0030.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/3a3891c0-7a75-a024-7bc0-6be604851094.png)![IMG_0031.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/be2e81e1-0d53-9dc5-eed7-77623e18ab09.png)![IMG_0032.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/d9fe5415-00a4-9e7b-280d-f6f86fe5cef6.png)
![IMG_0033.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/8201b987-2bda-c712-7eae-3d3d19b3dab6.png)![IMG_0034.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/1482474b-e19a-fe72-c9a7-de2a27d0987b.png)![IMG_0035.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/249b1686-205b-c57d-5c74-4e7a0d2cfa32.png)![IMG_0036.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/852821d8-7e9f-982b-ecd1-87d4b7e3a7f7.png)![IMG_0037.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/a965474f-199a-08de-e8a9-0313c7c1e85c.png)

これらの画像が出力されました。
結果を以下に示します。
```
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でセグメンテーションを行ってみた記事も、よければご覧ください。

https://qiita.com/wawana12/items/fde830c0b04567c4d68a

https://qiita.com/wawana12/items/b8bae36500ad188ae41b