## 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 ![](https://hackmd.io/_uploads/rJuw66Sd2.png) 自行計算並顯示在confusion matrix上 ``` fig.axes[0].set_title('Average F1-score: 0.877', fontsize=20) ``` ![](https://hackmd.io/_uploads/H1zd6pHOn.png) 本研究訓練的模型整體和各類別的F1-score計算如下: 1. Average: 0.877 2. Trybom: 0.947 3. Karny: 0.829 4. Hood: 0.851