Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

自己数据集训练的yolov9模型tensorrt的输出结果与pytorch结果差别很大,精度完全没有对齐 #1535

Open
guanshanjushib opened this issue May 31, 2024 · 10 comments

Comments

@guanshanjushib
Copy link

guanshanjushib commented May 31, 2024

Env

  • GPU, e.g. RTX3060
  • OS, e.g. Ubuntu20.04
  • Cuda version: cuda-11.1
  • TensorRT version: tensorrt-7.2.3

About this repo

  • which branch/tag/commit are you using?
    master-branch
  • which model?
    yolov9

Your problem

我用yolov9算法训练自己的数据集,得到的模型经过yolov9的tensorrtx推理,发现精度对不齐,pytorch输出的结果与tensorrt输出的结果差别很大,有些目标框的位置和精度没对齐。请问当前的yolov9推理对齐了吗?

@guanshanjushib
Copy link
Author

请问有人训练自己的数据集后pytorch和tensorrt的结果对齐了吗

@wang-xinyu
Copy link
Owner

@guanshanjushib 试试用官方的模型
cc @WuxinrongY

@WuxinrongY
Copy link
Contributor

你能发一下模型的结构吗,在pytorch下print打印就可以。如果和官网的一致,可以考虑提高一下tensorrt的版本,采用trt 8.6。

@guanshanjushib
Copy link
Author

guanshanjushib commented Jun 5, 2024

你能发一下模型的结构吗,在pytorch下print打印就可以。如果和官网的一致,可以考虑提高一下tensorrt的版本,采用trt 8.6。

yolov9_uav76_20240521_key.txt
yolov9_uav76_20240521_model.txt
附件里是我生成wts后保存的模型结构和wts每层的key和len,我采用的是yolov9-e模型,用的是yolov9的master分支训练的。
并且我已经修改了最后一层,因为最后从一层采用的是cv4、cv5和dlf2的权重,不过就算我修改了网络代码,还是会有精度不对齐的情况,我训练的是无人机数据,场景比较复杂,目标比较多。
可以分析共同讨论一下 @WuxinrongY ,我觉得预处理、网络结构和后处理都有点小瑕疵,比如maxOutput,pytorch是设置1000,而c++设置的是2000.

@WuxinrongY
Copy link
Contributor

你可以关注一下SyncBatchNorm的实现,是不是和官方模型中的BatchNorm2d不一样,可以直接在代码里面修改。maxOutput这个不要紧的,输出的是最大的置信度,至于预处理、网络结构和后处理方面确实可以讨论一下,hhh
image

@WuxinrongY
Copy link
Contributor

要是有兴趣,我们可以考虑实现一下SyncBatchNorm。email: w845756@qq.com

@guanshanjushib
Copy link
Author

guanshanjushib commented Jun 6, 2024

你可以关注一下SyncBatchNorm的实现,是不是和官方模型中的BatchNorm2d不一样,可以直接在代码里面修改。maxOutput这个不要紧的,输出的是最大的置信度,至于预处理、网络结构和后处理方面确实可以讨论一下,hhh image

多卡训练时,BatchNorm2d会自动变成SyncBatchNorm,那么在生成wts的时候可以直接变成BatchNorm2d嘛,还是说只能单卡训练才能维持成BatchNorm2d层?另外SyncBatchNorm怎么实现?要是在单卡上能直接推理SyncBatchNorm层嘛

@guanshanjushib
Copy link
Author

要是有兴趣,我们可以考虑实现一下SyncBatchNorm。email: w845756@qq.com

可以啊,你们能实现SyncBatchNorm嘛?另外,我要是用onnx转成engine,会不会也会因为SyncBatchNorm出现精度问题?

@WuxinrongY
Copy link
Contributor

要是有兴趣,我们可以考虑实现一下SyncBatchNorm。email: w845756@qq.com

可以啊,你们能实现SyncBatchNorm嘛?另外,我要是用onnx转成engine,会不会也会因为SyncBatchNorm出现精度问题?
我查了一下,syncBN似乎计算上没什么区别。
另外,之前我尝试过训练yolov7的小目标,并转换engine,也有问题,原因是重参数化。

@guanshanjushib
Copy link
Author

要是有兴趣,我们可以考虑实现一下SyncBatchNorm。email: w845756@qq.com

可以啊,你们能实现SyncBatchNorm嘛?另外,我要是用onnx转成engine,会不会也会因为SyncBatchNorm出现精度问题?
我查了一下,syncBN似乎计算上没什么区别。
另外,之前我尝试过训练yolov7的小目标,并转换engine,也有问题,原因是重参数化。

我测试了一下,wts转换出来的engine运行后,精度差异很大,用onnx转engine,运行后精度损失很少

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants