tensorrtx icon indicating copy to clipboard operation
tensorrtx copied to clipboard

batch 为2时,第一张图,识别是不对的,第二张识别对的,什么问题?

Open xinsuinizhuan opened this issue 3 years ago • 48 comments

Env

  • GPU, e.g. V100, RTX2080, TX2, Xavier NX, Nano, etc.
  • OS, e.g. Ubuntu16.04, Win10, etc.
  • Cuda version
  • TensorRT version

About this repo

  • which branch/tag/commit are you using?
  • which model? yolov5, retinaface?

Your problem

  • what is your command? e.g. sudo ./yolov5 -s
  • what's your output?
  • what output do you expect?

xinsuinizhuan avatar Jan 05 '22 08:01 xinsuinizhuan

did you rebuild and re-serialize engine?

wang-xinyu avatar Jan 05 '22 10:01 wang-xinyu

我的步骤: 1、官网的yolov5s.pt模型,生成wts文件 2、修改batch为2,使用wts,生成engine文件 3、使用生成的engine文件,同时输出2张图像推理。 训练生成yolov5s.pt时,也需要设置batch为2吗?我直接使用的官网的

xinsuinizhuan avatar Jan 06 '22 00:01 xinsuinizhuan

重新生成engine的是,设置了batch后,我看只有这里:builder->setMaxBatchSize(maxBatchSize); 推理的时候,感觉是这里,第一张图像被压缩和覆盖了: float* buffer_idx = (float*)buffers[inputIndex]; for (int b = 0; b < fcount; b++) { cv::Mat img = cv::imread(img_dir + "/" + file_names[f - fcount + 1 + b]); if (img.empty()) continue; imgs_buffer[b] = img; size_t size_image = img.cols * img.rows * 3; size_t size_image_dst = INPUT_H * INPUT_W * 3; //copy data to pinned memory memcpy(img_host,img.data,size_image); //copy data to device memory CUDA_CHECK(cudaMemcpyAsync(img_device,img_host,size_image,cudaMemcpyHostToDevice,stream)); preprocess_kernel_img(img_device, img.cols, img.rows, buffer_idx, INPUT_W, INPUT_H, stream);
buffer_idx += size_image_dst; }

xinsuinizhuan avatar Jan 06 '22 01:01 xinsuinizhuan

我试了batchsize为2,没出现什么问题。你试试当batchsize=4,8时有没问题

liuqi123123 avatar Jan 06 '22 02:01 liuqi123123

图片 这是识别的2张图,第一张有问题,第二张正常

xinsuinizhuan avatar Jan 06 '22 02:01 xinsuinizhuan

我截你的第一张图,复制4份,然后设置batchsize=2,跑出来是正常的。 你首先确定图像是小于3000*3000的,然后换个batchsize(3,4,8等等)试试,看有没问题

liuqi123123 avatar Jan 06 '22 02:01 liuqi123123

我截你的第一张图,复制4份,然后设置batchsize=2,跑出来是正常的。 你首先确定图像是小于3000*3000的,然后换个batchsize(3,4,8等等)试试,看有没问题

我发现,当我图像尺寸一样大小时是正常的,但是,当我2张图像尺寸大小不一样时,是不对的

xinsuinizhuan avatar Jan 06 '22 02:01 xinsuinizhuan

batch = 4: 我同一张图像4次放入识别,正常: 图片 不同四张图像放入,就最后一张正常,前面三张都是乱的: 图片

xinsuinizhuan avatar Jan 06 '22 02:01 xinsuinizhuan

我截你的第一张图,复制4份,然后设置batchsize=2,跑出来是正常的。 你首先确定图像是小于3000*3000的,然后换个batchsize(3,4,8等等)试试,看有没问题

您这边试的是,4张同样的,还是不同的图?

xinsuinizhuan avatar Jan 06 '22 02:01 xinsuinizhuan

我这边不同的图片也是正确的。你重新生成引擎了吧?

liuqi123123 avatar Jan 06 '22 02:01 liuqi123123

您指定重新生成引擎是指什么? batch=4后,我重新生成了engine了

xinsuinizhuan avatar Jan 06 '22 02:01 xinsuinizhuan

总结一下,你的情况是: 只有batchsize=1的时候,输出才是正确的,试过的其他batchszie都是错的?

liuqi123123 avatar Jan 06 '22 03:01 liuqi123123

3000*3000

MAX_IMAGE_INPUT_SIZE_THRESH 我设置的是8000*8000,四张图总大小加起来,都小于这个尺寸

xinsuinizhuan avatar Jan 06 '22 03:01 xinsuinizhuan

总结一下,你的情况是: 只有batchsize=1的时候,输出才是正确的,试过的其他batchszie都是错的?

我现在的情况是: batchsize=1的时候,输出是正常的; batchsize=2的时候,2张同样图,识别正常,2张不同尺寸图,就最后一张正常,第一张识别不正常; batchsize=4的时候,4张同样图,识别正常,4张不同尺寸图,就最后一张正常,前三张都识别不正常;

xinsuinizhuan avatar Jan 06 '22 03:01 xinsuinizhuan

总结一下,你的情况是: 只有batchsize=1的时候,输出才是正确的,试过的其他batchszie都是错的?

咋样,大佬,有没有思路?您那都是正常的吗?

xinsuinizhuan avatar Jan 07 '22 00:01 xinsuinizhuan

我这边的输出都是正常的。不过我的代码是刚加cuda预处理后的版本。最新版本的代码我还没尝试。等到下周我忙完了再帮你看看吧

liuqi123123 avatar Jan 07 '22 01:01 liuqi123123

我这边的输出都是正常的。不过我的代码是刚加cuda预处理后的版本。最新版本的代码我还没尝试。等到下周我忙完了再帮你看看吧

好的。感谢大佬,可否加个微信?

xinsuinizhuan avatar Jan 07 '22 01:01 xinsuinizhuan

有啥事就在这上面说吧,或者群里问就行

liuqi123123 avatar Jan 07 '22 05:01 liuqi123123

有啥事就在这上面说吧,或者群里问就行

How about this issues?

xinsuinizhuan avatar Jan 11 '22 00:01 xinsuinizhuan

我试过了最新代码。 batchsize = 3后也没问题。你是否按照以下步骤来的: 1.在yolov5.cpp中 将#define BATCH_SIZE 改为5后,保存文件。 2.重新make 3.执行./yolov5 -s yolov5s.wts yolov5s.engine s 生成新的引擎 4.执行./yolov5 -d yolov5s.engine ../samples 推理图片

liuqi123123 avatar Jan 12 '22 08:01 liuqi123123

我试过了最新代码。 batchsize = 3后也没问题。你是否按照以下步骤来的: 1.在yolov5.cpp中 将#define BATCH_SIZE 改为5后,保存文件。 2.重新make 3.执行./yolov5 -s yolov5s.wts yolov5s.engine s 生成新的引擎 4.执行./yolov5 -d yolov5s.engine ../samples 推理图片

您确认可以吗? 我使用最新的代码,刚刚跑了一遍,使用yolov5s的模型导出的wts,然后导出的batch=4的模型, 都是最新的源码,里面设置的 BATCH_SIZE =4,推理 同一个文件夹下,放同一张图复制4份: 图片 结果是对的: 图片 但是,同一个文件下,放不同的四张图: 图片 推理结果都是乱的: 图片 就最后一张是正确的,前三张都是不对的

xinsuinizhuan avatar Jan 19 '22 10:01 xinsuinizhuan

我试过了最新代码。 batchsize = 3后也没问题。你是否按照以下步骤来的: 1.在yolov5.cpp中 将#define BATCH_SIZE 改为5后,保存文件。 2.重新make 3.执行./yolov5 -s yolov5s.wts yolov5s.engine s 生成新的引擎 4.执行./yolov5 -d yolov5s.engine ../samples 推理图片

tensorrt_yolov5.zip 这是推理代码,您看看

xinsuinizhuan avatar Jan 19 '22 10:01 xinsuinizhuan

最新代码里面,我把数据拷贝换成v5版本里面的Data拷贝模式,可以。所以新版本里面的数据拷贝,从host到device有问题

xinsuinizhuan avatar Jan 19 '22 12:01 xinsuinizhuan

你解决了就好。具体是哪里的代码除了问题,能分享下吗?

liuqi123123 avatar Jan 20 '22 01:01 liuqi123123

你解决了就好。具体是哪里的代码除了问题,能分享下吗?

其实,我没有解决掉问题。现在的图像数据拷贝是直接cuda拷贝,我感觉是高效的,直接再cuda里面,可以减少cpu图像预处理和cpu gpu来回传图,但是感觉这里host到device的数据拷贝有问题,数据排列不对: 图片 具体问题是什么,还不知道,烦请帮忙看一下。

而yolov5v5版本里面数据预处理和拷贝是这样的,都是在cpu内部处理,比较低效: 图片

xinsuinizhuan avatar Jan 20 '22 03:01 xinsuinizhuan

你解决了就好。具体是哪里的代码除了问题,能分享下吗?

原来yolov5v5版本里面的,数据拷贝方式,可以正常batch推理,不论图像大小一样不一样。但是最新版的里面,只有四张图一样的时候,才是对的,四张图不一样和尺寸不一样,推理结果都不对。

xinsuinizhuan avatar Jan 20 '22 03:01 xinsuinizhuan

你是什么硬件平台?我看看此问题会不会和平台相关

liuqi123123 avatar Jan 20 '22 04:01 liuqi123123

你是什么硬件平台?我看看此问题会不会和平台相关

windows10 VS019 nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2020 NVIDIA Corporation Built on Wed_Jul_22_19:09:35_Pacific_Daylight_Time_2020 Cuda compilation tools, release 11.0, V11.0.221 Build cuda_11.0_bu.relgpu_drvr445TC445_37.28845127_0

xinsuinizhuan avatar Jan 20 '22 05:01 xinsuinizhuan

你是什么硬件平台?我看看此问题会不会和平台相关

请问有结果吗?

xinsuinizhuan avatar Jan 24 '22 05:01 xinsuinizhuan

@xinsuinizhuan Cannot reproduce your issue. I tried batch=4, the output images are fine. Please use the default code without any changes to test.

cc: @liuqi123123

wang-xinyu avatar Jan 28 '22 05:01 wang-xinyu