YOLOv5でのアノテーションから学習までの手順を徹底解説 

物体検出の分野で高い性能を発揮するYOLOv5を使って、自分だけのデータセットでモデルを学習させたいと思ったことはありませんか？この記事では、初心者の方でも理解できるように、YOLOv5でのアノテーション方法から学習の実行、そしてよくあるエラーの解決方法までを詳しく解説します。

# はじめに
YOLOv5は、リアルタイム物体検出において高い性能を持つモデルです。
自分のデータセットでモデルを学習させることで、特定のタスクに特化した物体検出器を作成できます。
しかし、初めて取り組む場合、データの準備や学習の設定でつまずくことも多いでしょう。
この記事では、その手順をステップバイステップで説明します。

# アノテーションの準備

## データセットの構造
まず、YOLOv5が期待するデータセットのフォルダ構造を理解しましょう。以下のようにフォルダを整理します。

```bash:フォルダ構造
dataset/
├── images/
│   ├── train/  # 訓練用画像
│   └── val/    # 検証用画像
└── labels/
    ├── train/  # 訓練用アノテーション
    └── val/    # 検証用アノテーション
```

- images/train: モデルの学習に使用する画像を配置します。
- images/val: 学習中のモデルの性能を評価するための画像を配置します。
- labels/train: 訓練用画像に対応するアノテーションファイル（.txt形式）を配置します。
- labels/val: 検証用画像に対応するアノテーションファイルを配置します。

各画像に対して、同じ名前のアノテーションファイルを作成します。
例えば、images/train/cat.jpgに対しては、labels/train/cat.txtを用意します。

## クラスファイルの作成
classes.txtファイルを作成し、各行にクラス名を記述します。
このファイルはクラスIDとクラス名の対応を定義します。

```text:classes.txt
opa
jesus christ
sumaho
moukona
jinnnai
```

クラスIDは0から始まるため、この例では以下のようになります。

- opa → クラスID 0
- jesus christ → クラスID 1
- sumaho → クラスID 2
- moukona → クラスID 3
- jinnnai → クラスID 4

<a id="3"></a>
# 環境構築と必要なライブラリのインストール
Ubuntuなどの環境では、システムPythonへのパッケージインストールが制限されている場合があります。そのため、仮想環境を作成して進めることをおすすめします。

## 仮想環境の作成
```bash:仮想環境の作成
python3 -m venv yolov5_env
```

## 仮想環境のアクティブ化
```bash:仮想環境の有効化
source yolov5_env/bin/activate
```

## Gitからyolov5をClone
```bash:gitからClone
git clone https://github.com/ultralytics/yolov5
cd yolov5
```

## 必要なライブラリのインストール
```bash:ライブラリのインストール
pip install -r requirements.txt
```

## 仮想環境の終了
仮想環境を終了する場合は以下を実行する。
```bash:仮想環境の終了
deactivate
```

<a id="4"></a>
# 学習の実行

<a id="4-1"></a>
## train.pyのパラメータ解説
YOLOv5の学習を行う際、train.pyを以下のように実行します。

```bash:学習コマンド
python train.py --img 640 --batch 4 --epochs 50 --data ./data.yaml --cfg yolov5s.yaml --weights yolov5s.pt --name custom_model
```

各パラメータの説明：
- `--img 640`: 画像サイズを640×640に設定。
- `--batch 4`: バッチサイズを4に設定（GPUメモリに応じて調整）。
- `--epochs 50`: 学習エポック数を50に設定。
- `--data ./data.yaml`: データセットの設定ファイルを指定。
- `--cfg yolov5s.yaml`: モデルの構造を定義するファイルを指定。
- `--weights yolov5s.pt`: 事前学習済みの重みを使用。
- `--name custom_model`: 学習結果の保存先フォルダ名を指定。

## 学習の開始

### data.yamlの作成
data.yamlファイルを作成し、以下の内容を記述します。

```yaml:data.yaml
train: /path/to/dataset/images/train
val: /path/to/dataset/images/val
nc: 5  # クラス数
names: ['opa', 'jesus christ', 'sumaho', 'moukona', 'jinnnai']
```

- trainとvalには、それぞれ訓練用と検証用画像のパスを指定します。
- ncはクラス数を指定します。
- namesにはクラス名のリストを指定します。

### 学習の実行
下記のコマンドを実行して学習を開始します。

```bash:学習の開始
python train.py --img 640 --batch 4 --epochs 50 --data ./data.yaml --cfg yolov5s.yaml --weights yolov5s.pt --name custom_model
```

# よくあるエラーとその解決方法

## Dataset not found エラー

エラーメッセージ
```
Dataset not found ⚠️, missing paths ['/path/to/dataset/images/val']
Exception: Dataset not found ❌
```

解決方法：
1. data.yamlのパスを確認：trainとvalのパスが正しいか確認します。
2. フォルダの存在を確認：指定したパスに画像が存在するか確認します。
3. 絶対パスの使用：相対パスで問題がある場合、絶対パスを使用します。


## Label class exceeds nc エラー

エラーメッセージ
```
AssertionError: Label class 16 exceeds nc=5 in ./data.yaml. Possible class labels are 0-4
```

解決方法
1. アノテーションのクラスIDを確認：クラスIDが0からnc-1の範囲内であることを確認します。
2. data.yamlのncを修正：必要に応じてクラス数を増やします。

例：アノテーションファイルでクラスIDが16となっている場合、ncを17に増やすか、クラスIDを正しい値に修正します。

<a id="6"></a>
# おわりに
これで、YOLOv5を使った物体検出モデルの学習手順を理解できたと思います。初めて取り組むとエラーが発生しがちですが、エラーメッセージを読み解き、適切に対処することで問題を解決できます。自分だけのデータセットでモデルを作成し、さまざまな応用に挑戦してみてください。

## 参考リンク
- [YOLOv5公式リポジトリ](https://github.com/ultralytics/yolov5)
- [Anacondaによる仮想環境の作成方法](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)

## 注意点
- 学習データはJPEGやPNGが混在していても問題ありません。
- 画像とアノテーションファイルの名前は一致させてください。

最後に、この記事が、YOLOv5でのモデル学習に挑戦する皆さんの助けになれば幸いです。分からないことやエラーが出た場合は、公式ドキュメントやコミュニティを活用してみてください。