前言¶
本項目是基於PaddleDetection實現的PP-YOLOE,PP-YOLOE是單階段Anchor-free模型,其精度(COCO數據集mAP)和推理速度均優於YOLOv5模型,PP-YOLOE在COCO test-dev2017數據集上精度達到49.0%,在單卡V100上FP32推理速度爲123.4FPS, V100上開啓TensorRT下FP16推理速度爲208.3FPS。其中還包含了X/L/M/S四種模型類型,適合部署在多種多樣的硬件上,在手機上部署,推理速度也是極快的。
源碼地址:https://github.com/yeyupiaoling/PP-YOLOE
模型表¶
這個表是官方的測試表格。
| 模型類型 | Epoch | 輸入尺寸 | Box APval 0.5:0.95 |
Box APtest 0.5:0.95 |
Params(M) | FLOPs(G) | V100 FP32(FPS) | V100 TensorRT FP16(FPS) |
|---|---|---|---|---|---|---|---|---|
| S | 80 | 640 | 43.7 | 43.9 | 7.93 | 17.36 | 208.3 | 333.3 |
| M | 80 | 640 | 49.8 | 50.0 | 23.43 | 49.91 | 123.4 | 208.3 |
| L | 80 | 640 | 52.9 | 53.3 | 52.20 | 110.07 | 78.1 | 149.2 |
| X | 80 | 640 | 54.7 | 54.9 | 98.42 | 206.59 | 45.0 | 95.2 |
安裝環境¶
- 安裝PaddlePaddle GPU版本
conda install paddlepaddle-gpu==2.3.1 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
- 其他依賴庫
python -m pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
快速使用¶
通過以下方式可以快速使用本項目導出COCO訓練的預測模型,使用該預測模型快速推理圖片。
- 首先導出COCO的預測模型,執行
export_model.py時,當--resume_model參數爲None時,會自動加載官方的COCO預訓練模型,使用這個預訓練模型導出預測模型。
python export_model.py --resume_model=None
- 然後執行
infer.py指定圖像路徑執行推理。
python infer.py --image_path=dataset/test.jpg
識別結果:

訓練模型¶
準備數據¶
準備訓練數據train.json和評估數據eval.json,本項目只支持使用COCO格式的數據集,如果你使用的是VOC格式數據集,可以使用項目自帶的工具進行轉換,使用方式如下。如果你的數據本身就是COCO格式的,可以直接忽略這個步驟
- 首先生成VOC數據列表和標籤列表,執行下面命令就可以生成訓練數據列表
train.txt和評估數據列表eval.txt,以及列表文件label_list.txt,它們都存放在dataset目錄下。
python create_voc_list.py
- 然後執行
voc2coco.py即可生成COCO格式的數據集,訓練數據和評估數據分別對應train.json和eval.json,同樣是存放在dataset目錄下。
python voc2coco.py
訓練模型¶
準備好數據之後就可以開始訓練了,訓練程序要注意以下幾個重要參數,首先是模型類型model_type,一共有X/L/M/S四種模型類型,其次是分類大小num_classes,這兩個參數需要根據自己的實際情況來設置,更多參數可以查看該程序文件或者執行python train.py -h查看。本項目支持多卡訓練,具體看下面命令。
# 單卡訓練
python train.py --model_type=M --num_classes=80
# 單機多卡訓練
python -m paddle.distributed.launch --gpus '0,1' train.py --model_type=M --num_classes=80
評估模型¶
訓練結束之後,如果需要查看模型的準確率,可以執行評估程序eval.py,需要指定模型類型,分類大小以及模型的文件夾路徑。
python eval.py --model_type=M --num_classes=80 --resume_model=output/PPYOLOE_M/best_model
導出預測模型¶
訓練完成之後,可以導出預測模型用於之後的部署,使用及其下面命令,即可完成導出進預測模型。需要指定模型類型,分類大小以及模型的文件夾路徑。image_shape是指定輸入圖片的大小,如果對性能要求比較高的話,可以嘗試設置更小的圖片大小,例如3,416,416,或者3,320,320,默認是3,640,640。
python export_model.py --model_type=M --num_classes=80 --resume_model=output/PPYOLOE_M/best_model
預測¶
本項目提供三種預測方式,第一種是使用PaddlePaddle自身的Inference預測接口進行預測,第二種是使用ONNX預測接口執行預測,第三種是部署在Android設備上進行預測。
Inference¶
使用PaddlePaddle自身的Inference預測接口進行預測,這裏提供了兩種方式,第一種是使用圖片的路徑進行預測並顯示結果,第二種是使用攝像頭或者視頻文件進行預測。
# 使用圖片路徑進行預測並顯示
python infer.py --image_path=dataset/test.jpg --model_dir=output_inference/PPYOLOE_M
# 使用攝像頭進行即時預測
python infer_camera.py --device_id=0 --model_dir=output_inference/PPYOLOE_M
識別結果:

ONNX¶
使用ONNX預測接口執行預測,使用這種方式的話需要額外安裝onnxruntime庫,並且需要找出對應的模型進行下面命令可以導出ONNX模型,需要根據實際情況修改模型的路徑model_dir。
python to_onnx_model.py
導出ONNX模型之後就可以使用onnxruntime來進行推理,命令如下,分別指定預測圖片路徑和ONNX模型路徑。執行推理並顯示結果
python infer_onnx.py --image_path=dataset/test.jpg --onnx_model=output_inference/model.onnx
識別結果:

Android¶
如果要部署在Android上面使用的話,需要導出Paddle Lite模型,通過上面命令可以導出Paddle Lite模型。需要根據自己的實際情況修改模型的路徑,以及是否需要進行量化量化,量化可以減少1/2的模型大小,但預測速度上不會有太大變化,一般不會降低模型的準確率。
python to_lite_model.py
使用Android應用:Android源碼存放在本項目的根目錄中的Android,可以直接用Android Studio打開使用,該演示應用有兩個功能,第一是打開相機識別,第二是打開相冊識別。如果要替換自己訓練的模型,只需要操作這兩個文件即可:
- 把
Android/ai/src/main/assets/detect_model.nb模型文件替換成你導出的detect_model.nb。 - 把
Android/ai/src/main/assets/label_list.txt標籤列表文件替換成你的列表文件,這列表文件在dataset/label_list.txt。
打開相冊識別的演示界面:

參考¶
- https://github.com/PaddlePaddle/PaddleDetection
- https://github.com/PaddlePaddle/Paddle-Lite