(ML)YOLOv7 : Evaluating YOLOv7 for Mobile Deployment — Performance and Inference on iPhone

YEN HUNG CHENG
10 min readSep 3, 2023

--

環境: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

P Curve

隨著 confidence 閾值設置得越高,模型檢測各個類別的 精確率 也越高。

這很容易理解,因為只有當模型非常確信時,才會判斷一個檢測結果屬於某個類別。

R Curve

當 Confidence = 0.83 時,Recall 皆為 0

R Curve

當置信度(confidence)閾值升高時,模型要求更高的置信度才能確認對象的存在,因此檢測的真正陽性(True Positives,TP)數量通常減少。與此同時,由於較高的置信度要求導致模型較少地進行正類別的預測,假陽性(False Positives,FP)數量可能會增加,因為模型有可能錯過一些真正的對象,從而產生了FP。

PR Curve

當 IoU = 0.5 時,mAP = 0.545

PR Curve

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 進行可視化

YOLOv7 without NMS

為 CoreML 模型添加 Decoder 與 NMS

使用上一篇文章進行修改時,要注意的地方:

  1. YOLOv5 的 Anchors 要修改為 YOLOv7 的 Anchors
  2. YOLOv7-tiny 的 Anchors 必須填入 YOLOv7 的
  3. 最終模型的輸出維度也必須做修改
  4. 不能使用非對稱的輸入 ex: 320 x 192
YOLOv7 with NMS

yolov7 (image size = 640 x 640) iou = 0.45 confidence = 0.25

fps = 3

yolov7 fp16 (image size = 640 x 640) iou = 0.45 confidence = 0.25

fps = 3

yolov7 fp8 (image size = 640 x 640) iou = 0.45 confidence = 0.25

fps = 4

yolov7 (image size = 320 x 320) iou = 0.45 confidence = 0.25

fps = 14

yolov7 fp16 (image size = 320 x 320) iou = 0.45 confidence = 0.25

fps = 14

yolov7 fp8 (image size = 320 x 320) iou = 0.45 confidence = 0.25

fps = 14

yolov7-tiny(image size = 640 x 640) iou = 0.45 confidence = 0.25

fps = 14

yolov7-tiny(image size = 320 x 320) iou = 0.45 confidence = 0.25

fps = 30

從上面的實驗可以發現,將原本的 yolov7 模型透過量化後,在 inference 的時間是不會降低的,但是整體模型的大小可以從 147.6 MB 降低到 37.1 MB

fp = 32
fp = 8

如果要提升模型的推理速度,最簡單的方法是降低圖片的輸入大小,例如將640 x 640調整為320 x 320,甚至可以進一步縮小至320 x 192(如iDetection的輸入大小)。然而,需要注意的是,降低輸入圖片大小的同時,也會使mAP(平均精度均值)降低,這是其中一個缺點。

Youtube

--

--