###### 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

### (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
```