目录
8.3 paddlepaddle3.0不支持导出预测模型这一步
源码来自作者 夜雨飘零1,我对参考链接的代码略有修改,网盘地址
链接:百度网盘 请输入提取码 提取码:ipl5
1 参考链接
博客地址 基于PaddlePaddle实现的目标检测模型PP-YOLOE_夜雨飘零1的博客-CSDN博客_paddlepaddle目标检测
项目地址 GitHub - yeyupiaoling/PP-YOLOE: PaddlePaddle实现的目标检测模型PP-YOLOE
2 环境
- 系统 Linux
- 显卡 NVIDIA GeForce RTX 3060
- CUDA 11.1
- CUDNN 8.2.1
python版本3.9,环境如下
安装的时候首先使用的是项目中的requirement.txt
- pip install -r requirement.txt
安装的过程中有几个东西没装上,比如paddle,之后用的官方提供的安装paddle的命令,虽然我当前的cuda版本是11.1,但使用下面的命令确实可以安装,并且可以使用
- conda install paddlepaddle-gpu==2.4.1 cudatoolkit=11.2 -c Index of /anaconda/cloud/Paddle/ | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror -c conda-forge
如果没有cudnn安装的时候不会出问题,但使用的时候会出现cudnn的问题,官方的命令上有提示,告诉你选8.2.1这个版本
我们找到cudnn8.2.1 cuDNN Archive | NVIDIA Developer 下载这个tar.gz
解压后放到cuda目录中就可以了
- sudo cp cuda/include/cudnn.h /usr/local/cuda/include
- sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
- sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
训练时默认使用GPU资源进行训练
项目放在home下,项目命名为paddlepaddle_object_detection
3 数据集准备
数据集为877张图像,4分类,其中speedlimit 705个框,crosswalk 174个框,traffclight 154个框,stop 88个框
将标注文件xml放在dataset中,图像文件jpg放在images中
运行create_voc_list.py
运行后会在dataset中得到这三个文件
运行voc2coco.py
在dataset中会得到这两个文件
4 训练 train.py
将这里改为数据集的分类数量
然后直接运行就好了,一些warning可以无视掉
再第一次训练的时候会进行 预训练模型 的下载,预训练模型会下载到这个文件夹中
训练结束后会生成文件夹models
models中还有一个文件夹PPYOLOE_M,其中有一个best_model
5 导出预测模型
修改 export_model.py的类别数量,然后运行
在models/PPYOLOE_M中会得到一个文件夹infer,infer中有导出的模型
6 预测
更改infer.py中需要预测的图片
运行后可以得到预测结果
7 paddle2onnx
7.1 导出
调整了几个版本,最终换为了paddle2onnx-1.3.1
找到项目中的to_onnx_model.py,调整一下代码然后运行。这里model_filename和params_filename是用的导出预测模型的模型和参数
然后就能得到文件model.onnx
7.2 预测
安装对应的onnxruntime
我这里安装onnxruntime=1.17.0
然后打开项目中的infer_onnx.py,在这里找个字体文件
然后调整这里要预测的图像
然后就能预测出来了
7.3 部署到其他设备上
需要这些文件
需要这些库。不需要paddlepaddle,只需要onnxruntime,我安装的是onnxruntime==1.17.0
运行的时候告诉你要小于numpy2,我安装的是1.26.4
剩下就什么报错装什么就行了。一直到不报错之后运行的结果
8 遇到的问题
8.1 paddlepadde2.4.1的bug
将数组转换成tensor的时候结果不对,比如
import paddle
print(paddle.to_tensor([0, 1, 2, 3, 4]))
转换出来的结果是
Tensor(shape=[5], dtype=int64, place=Place(cpu), stop_gradient=True, [4294967296 , 12884901890 , 4541079145142075583, 4535960811137795605, 4498257372009003569])
如果使用GPU转换出来的结果也不对
Tensor(shape=[5], dtype=int64, place=Place(gpu:0), stop_gradient=True, [0,0,0,0,0])
- 正常的结果应该是 Tensor(shape=[5], dtype=int64, place=Place(gpu:0), stop_gradient=True, [0,1,2,3,4])
后面把paddlepaddle的版本改成paddlepaddle2.6.2,python版本改为3.10
后面又看了一下,paddlepaddle2.4.1本身是没有问题的,但是虽然他写的支持高版本的python,但可能会有bug,所以建议是使用paddlepaddle支持的最低python版本,应该就没有问题了
8.2 不同格式不能相加
把相加的前后项打印出来,一个是int64一个是int32
这里我通过paddle.cast()将int64转为了int32
然后就没问题了
8.3 paddlepaddle3.0不支持导出预测模型这一步
原因是 model/layers.py 中 的 return multiclass(bboxes,score,**kwargs) 中的bboxes需要变量类型(paddle2.6运行后)是下面这样的
但在paddle3.0中的变量会变成下面这样的,他们类型不匹配,所以用不了
但也仅仅是导出预测模型这一步做不了,训练、预测都是可以做的,可以用paddle2.6导入后,然后再用paddle3.0预测也是可以的
8.4 paddle2onnx导入有问题
找到于paddle合适版本的paddle2onnx就行了,比如说paddle2onnx匹配的是paddlepaddle2.6.1