前言

本項目是基於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

安裝環境

  1. 安裝PaddlePaddle GPU版本
conda install paddlepaddle-gpu==2.3.1 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
  1. 其他依賴庫
python -m pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple

快速使用

通過以下方式可以快速使用本項目導出COCO訓練的預測模型,使用該預測模型快速推理圖片。

  1. 首先導出COCO的預測模型,執行export_model.py時,當--resume_model參數爲None時,會自動加載官方的COCO預訓練模型,使用這個預訓練模型導出預測模型。
python export_model.py --resume_model=None
  1. 然後執行infer.py指定圖像路徑執行推理。
python infer.py --image_path=dataset/test.jpg

識別結果:

訓練模型

準備數據

準備訓練數據train.json和評估數據eval.json,本項目只支持使用COCO格式的數據集,如果你使用的是VOC格式數據集,可以使用項目自帶的工具進行轉換,使用方式如下。如果你的數據本身就是COCO格式的,可以直接忽略這個步驟

  1. 首先生成VOC數據列表和標籤列表,執行下面命令就可以生成訓練數據列表train.txt和評估數據列表eval.txt,以及列表文件label_list.txt,它們都存放在dataset目錄下。
python create_voc_list.py
  1. 然後執行voc2coco.py即可生成COCO格式的數據集,訓練數據和評估數據分別對應train.jsoneval.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打開使用,該演示應用有兩個功能,第一是打開相機識別,第二是打開相冊識別。如果要替換自己訓練的模型,只需要操作這兩個文件即可:

  1. Android/ai/src/main/assets/detect_model.nb模型文件替換成你導出的detect_model.nb
  2. Android/ai/src/main/assets/label_list.txt標籤列表文件替換成你的列表文件,這列表文件在dataset/label_list.txt

打開相冊識別的演示界面:

參考

  1. https://github.com/PaddlePaddle/PaddleDetection
  2. https://github.com/PaddlePaddle/Paddle-Lite
小夜