---
# System prepended metadata

title: 2. 官方訓練建議
tags: [yolov5 Doc]

---

###### tags: `yolov5 Doc`
# 2. 官方訓練建議

- [Tips for Best Training Results](https://docs.ultralytics.com/tutorials/training-tips-best-results/)

---

## Dataset

- 圖片數量 : 每個類別的圖片 > 1500 張
- 實例數量 : 每個類別"實例"希望 > 10000 
<font color='blue'>(實例-指的是 label 的物件數，ex 類別車子的物件數)</font>
- 圖片的多樣性 : 圖片可有多樣項 ex : 不同角度、時間、天氣、季節...
- Label 的一致性 : 圖片中所有"實例"必須要被 labeled 到
- Label 的準確性 : bounding box 必須準確 label 在實例上
- Label 的驗證 : 可以查看 runs/train/train_batch*.jpg 來驗證 label 有無問題
- Baclground Images : 推薦要有 0%-10% 的無"實例"圖片，可以減少 FP


<br>

---

## Model Selection

![](https://i.imgur.com/zo9pkeJ.png)

### (1).Model 選擇
- Yolov5x 通常會比其他模型結果好，但運算量大
- 行動裝置部署 : 建議使用 Yolov5s/m
- 雲端部屬 : 建議使用 Yolob5l/x

[詳細比較](https://github.com/ultralytics/yolov5#pretrained-checkpoints)


### (2). Pretrain Weight
-    推薦中小型的資料集可以使用 Pretrain Data
```
python train.py --data custom.yaml --weights yolov5s.pt
                                             yolov5m.pt
                                             yolov5l.pt
                                             yolov5x.pt
                                             *custom_pretrained.pt
```

### (3). 不使用 Pretrain Data
- 推薦大型資料集直接隨機初始化 Weight
```
python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
                                                      yolov5m.yaml
                                                      yolov5l.yaml
                                                      yolov5x.yaml
```

<br>

---

## Training Setting

- **Epochs 設定** : 通常先從 300 次開始訓練，如果 overfitting 就減少 Epochs，
反之增加 Epochs
- **圖片大小設定** : 如果圖片中有一些小物件，圖片解析度越高越好
如果有很多小物件，或許可以另外設定資料集
- **Batch Size** : 越大越好，盡量做到硬體極限，因為太小的 Batch 會造成很差的 Batch Normalization 效果
- **Hyperparameters** : 可以先使用預設的 `hyp.scratch-low.yaml`，雖然可以提升預測效果，但會減慢訓練速度，也可以使用 evolve 自動優化 hyperparameters
[Evolve Tutoral](https://docs.ultralytics.com/tutorials/hyperparameter-evolution/)
[Evolve Tutoral ( github ) ](https://github.com/ultralytics/yolov5/issues/607)

<br>

---

## Multi-GPU Training

[Multi-GPU Training](https://docs.ultralytics.com/tutorials/multi-gpu-training/)
多 GPU 訓練

1. `--device 0,1` : 不建議，速度會很慢
2. 
```
python -m torch.distributed.run --nproc_per_node 2 train.py ... --device 0,1
```

batch 會被分開一半到各自 GPU 計算 (64->32)
`--nproc_per_node 2` : 代表 GPU 數量 (這邊為 2)

<br>

---


## Hyperparameter Evolution 參數自動優化

[Hyperparameter Evolution](https://docs.ultralytics.com/tutorials/hyperparameter-evolution/)


會利用 GA (基因演算法) 找出最好的訓練參數 ( 包括圖片的變形 )

```
train.py --evolve 300 --hyp data/hyps/hyp.scratch-high.yaml
```

如果沒設定初始的 hypeparameter，
會自動使用 `'data/hyps/hyp.scratch-low.yaml'`

! <font color=red>越好的初始參數，會的到越好的結果</font>

```
python train.py \
--workers 0 \
--device 0 \
--batch-size 16 \
--data data/drone.yaml \
--img 1080 1080 \
--cfg cfg/training/yolov7x.yaml \ 
--weights '' \
--hyp data/hyp.scratch.p5.yaml
```

```
python train.py --workers 0 --device 0 --batch-size 16 --data data/drone.yaml --img 1080 1080 --cfg cfg/training/yolov7x.yaml --weights '' --hyp data/hyp.scratch.p5.yaml
```