本项目是基于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四种模型类型,适合部署在多种多样的硬件上,在手机上部署,推理速度也是极快的。
这个表是官方的测试表格。
模型类型 | 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设备上进行预测。
使用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预测接口执行预测,使用这种方式的话需要额外安装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上面使用的话,需要导出Paddle Lite模型,通过上面命令可以导出Paddle Lite模型。需要根据自己的实际情况修改模型的路径,以及是否需要进行量化量化,量化可以减少1/2的模型大小,但预测速度上不会有太大变化,一般不会降低模型的准确率。导出的Paddle Lite模型会保存到output_inference/detect_model.nb
,建议在导出模型export_model.py
的时候,在指定image_shape
最好是选择3,320,320
,这样推理速度会快一些。
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
。
打开相册识别的演示界面: