(ML)YOLOv7 : Evaluating YOLOv7 for Mobile Deployment — Performance and Inference on iPhone
環境:Macbook Air M1 = 13.2 , Pytorch = 2.1, Coremltools=6.2.0
目的:評估 YOLOv7 的模型,並在 iphone 上完成推理
YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
GitHub
YOLOv7 Usage
git clone https://github.com/WongKinYiu/yolov7
cd yolov7
pip install -r requirements.txt
⭐️ 執行 pip install -r requirements.txt 前,先修改 requirements.txt
# Export --------------------------------------
coremltools==6.2.0 # CoreML export
onnx>=1.9.0 # ONNX export
onnx-simplifier>=0.3.6 # ONNX simplifier
scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TFLite export
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev # OpenVINO export
進行推理
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
下載 yolov7-tiny 權重檔
# Download trained weights
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
評估 mAP
# Data preparation
bash scripts/get_coco.sh
Testing
python test.py --data data/coco.yaml --img 640 --batch 32 --conf 0.001 --iou 0.65 --device 0 --weights yolov7-tiny.pt --name yolov7_640_val
Confusion Matrix
Recall & Precision
Precision
Precision(精確率)是評估分類模型效果的另一個重要指標,它反映模型正樣本檢測的準確性。
精確率的計算公式是:
精確率 = 模型正確檢測出的正樣本數 / 模型檢測出的全部樣本數
Precision 值越高,表示模型檢測為正樣本的準確性越高,錯誤檢測的樣本越少。
Recall
Recall(召回率)是評估分類模型效果的一種重要指標,它反映模型檢測正樣本的能力。
召回率的計算公式是:
召回率 = 模型正確檢測出的正樣本數 / 全部正樣本的數量
Recall 越高表示模型把正樣本檢測得越全面,遺漏的正樣本越少。
IOU & Confidence
IOU
IOU = Ground Truth 與 Prediction 的交集 / Ground Truth 與 Prediction 的聯集
Confidence
Confidence = Pr(object) x IoU truth pred
- Pr(object) 代表 Bbox 是否包含物體,若有包含物體則為 1,沒有包含物體則為 0
- IoU truth pred 代表 Bbox 與 Ground truth 的 IoU
P Curve
當 Confidence = 0.961 時,Precision = 1
隨著 confidence 閾值設置得越高,模型檢測各個類別的 精確率 也越高。
這很容易理解,因為只有當模型非常確信時,才會判斷一個檢測結果屬於某個類別。
R Curve
當 Confidence = 0.83 時,Recall 皆為 0
當置信度(confidence)閾值升高時,模型要求更高的置信度才能確認對象的存在,因此檢測的真正陽性(True Positives,TP)數量通常減少。與此同時,由於較高的置信度要求導致模型較少地進行正類別的預測,假陽性(False Positives,FP)數量可能會增加,因為模型有可能錯過一些真正的對象,從而產生了FP。
PR Curve
當 IoU = 0.5 時,mAP = 0.545
mAP(Mean Average Precision)的縮寫表示均值平均精度,通常用來評估目標檢測模型的性能。在這個指標中,精確度(Precision)與召回率(Recall)之間存在權衡關係,即精度越高,召回率越低。然而,在實際應用中,我們通常希望模型在高精度的同時,盡可能地檢測到所有類別的目標,使得模型表現接近於 (1,1) 點,即mAP曲線下的面積接近1。
F1-Confidence Curve
當 Confidence = 0.265 時,最能優化 F1-Score ,此時 F1-Score = 0.56
F1-score 是用於衡量分類問題性能的重要指標。在許多機器學習競賽中,特別是多類別分類問題,F1分數常被用作最終評估的標準。它是精確率(Precision)和召回率(Recall)的調和平均值,取值範圍從 0 到 1,1 表示最佳性能,0 表示最差性能。
F1-Score綜合了Precision和Recall兩個關鍵指標,用於評估模型在某個類別上的性能。其值越接近1,表示模型在該類別上的性能越好;而值越接近0,則表示模型性能較差。
將模型轉換成 CoreML
python export.py --weights ./yolov7.pt --img-size 640 640
使用 Netron 進行可視化
為 CoreML 模型添加 Decoder 與 NMS
使用上一篇文章進行修改時,要注意的地方:
- YOLOv5 的 Anchors 要修改為 YOLOv7 的 Anchors
- YOLOv7-tiny 的 Anchors 必須填入 YOLOv7 的
- 最終模型的輸出維度也必須做修改
- 不能使用非對稱的輸入 ex: 320 x 192
yolov7 (image size = 640 x 640) iou = 0.45 confidence = 0.25
yolov7 fp16 (image size = 640 x 640) iou = 0.45 confidence = 0.25
yolov7 fp8 (image size = 640 x 640) iou = 0.45 confidence = 0.25
yolov7 (image size = 320 x 320) iou = 0.45 confidence = 0.25
yolov7 fp16 (image size = 320 x 320) iou = 0.45 confidence = 0.25
yolov7 fp8 (image size = 320 x 320) iou = 0.45 confidence = 0.25
yolov7-tiny(image size = 640 x 640) iou = 0.45 confidence = 0.25
yolov7-tiny(image size = 320 x 320) iou = 0.45 confidence = 0.25
從上面的實驗可以發現,將原本的 yolov7 模型透過量化後,在 inference 的時間是不會降低的,但是整體模型的大小可以從 147.6 MB 降低到 37.1 MB
如果要提升模型的推理速度,最簡單的方法是降低圖片的輸入大小,例如將640 x 640調整為320 x 320,甚至可以進一步縮小至320 x 192(如iDetection的輸入大小)。然而,需要注意的是,降低輸入圖片大小的同時,也會使mAP(平均精度均值)降低,這是其中一個缺點。