## Objection detection
物件偵測 (objection detection) 分為 One stage 和 Two stage
- One-stage: 物件的位置和辨識同時進行,優點為一步到位,節省時間和運算成本,但準確度稍微差一點
- Two-stage: 先透過演算法生成物件的位置,再透過卷積神經網絡 (Convolutional Neural Network, CNN) 做影像辨識
## Target species of Thrips
- *Thrips palmi* Karny 南黃薊馬
- *Frankliniella intonsa* Trybom 臺灣花薊馬
- *Scirtothrips dorsalis* Hood 小黃薊馬
## Single stage object detector - YOLOv7
由中研院王建堯在2022年7月發表YOLOv7論文,並推出原始碼如下:
https://github.com/WongKinYiu/yolov7
- 修改和新增images跟labels
路徑: **yolov7-main/data/coco.yaml**
建議可以把training/validation/test的資料集都放在當前路徑
本研究修改後之程式碼如下:
```
# 資料集都放在當前路徑
train: ./data/train
val: ./data/val
test: ./data/test
# number of classes
nc: 3
# class names
names: ['Trybom', 'Karny', 'Hood']
```
- 調整requirement.txt
刪除以下兩行:
```
torch>=1.7.0, !=1.12.0
torchvision>=0.8.1, !=0.13.0
```
自行建立對應版本的Torch GPU
```
pip3 install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio===0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
```
- 調整模型參數
路徑: **yolov7-main/cfg/yolov7.yaml**
建議可以複製檔案並改名**yolov7-custom.yaml**進行調參
如果沒有要修改任何參數,只需將```nc: 80 # number of classes```改為正確的classes即可
- 優化模型
到 https://github.com/WongKinYiu/yolov7 的release下載yolov7.pt或yolov7-tiny.pt並放入跟train.py相同路徑下
- 選擇GPU
查看顯卡使用情形: ```nvidia-smi```
終端機: ```CUDA_VISIBLE_DEVICES=數字``` 後面接要跑的程式
程式內部:
```
import os
os.environ['CUDA_VISIBLE_DEVICES']='0,1,2'
```
- 訓練模型(train.py)
大部分的參數都可以在train.py裡面調整(ex:data, hyp, cfg),實際運行的程式碼如下:
```
python train.py --device 0 --batch-size 8 --epochs 100 --weights yolov7.pt
```
- 偵測模型(detect.py)
--weights: 使用訓練好的權重best.pt進行偵測
--iou-thres: 設定IoU門檻值
--conf-thres: 設定信心門檻值
--img-size: 圖片輸入模型的尺寸(640, 1280)
--source: 圖片或資料夾路徑
- 修改colors參數:
```colors=[[255,0,0],[0,255,0],[0,0,255]]```將檢定框固定表示成RGB三種顏色
常用顏色的RGB值參考:
https://microdnd.pixnet.net/blog/post/103334755
- 修改line_thickness參數: 可以指定檢定框的粗細以及字體大小,預設是1
```
python detect.py --weights best.pt --iou-thres 0.5 --conf-thres 0.5 --img-size 640 --source inference/images/
```
- 測試模型(test.py)
丟給模型未知資料,檢驗模型的訓練結果
```
python test.py --weights best.pt --data custom_data.yaml --task test
```
跑完會顯示以下幾張圖片:
1. confusion matrix
2. F1_curve
3. P_curve
4. PR_curve
5. R_curve
confusion matrix的相關設定
路徑: ```./utils/metrics.py```
- 顯示0.00在confusion matrix上
註解掉這行```array[array<0.005]=np.nan```
- 調整字體大小
```sn.heatmap(array, annot_kws={"size": 8}, fmt='.2f', square=True```
size: 方框內數字大小
fmt: 數字位數("d":整數, "f":小數)
square: True表示形狀為正方形
其他像cmap為整體顏色, vmin=0, vmax=1為上下限
- 顯示圖表標題(通常顯示模型整體F1-score)
執行完會顯示整體模型和各類別的Precision和Recall

自行計算並顯示在confusion matrix上
```
fig.axes[0].set_title('Average F1-score: 0.877', fontsize=20)
```

本研究訓練的模型整體和各類別的F1-score計算如下:
1. Average: 0.877
2. Trybom: 0.947
3. Karny: 0.829
4. Hood: 0.851