Yolo-LibTorch icon indicating copy to clipboard operation
Yolo-LibTorch copied to clipboard

关于图片输入模型时的预处理

Open fatejzz opened this issue 2 years ago • 7 comments

你好就是我最近在尝试部署我的yoloV5模型,我阅读你的源码后认为你的letterbox操作跟python源码的好像不太一样。但是我按照官方的思路写letterbox的话输入模型会报错,有时还会产生python端不会预测的框,按照你的思路写的话就不会报那个错误,产生的框也是python端产生的框。

fatejzz avatar Jul 05 '22 09:07 fatejzz

@fatejzz 图片输入模型我自己封装了一下,你可以说说你的思路,我们可以一起研究一下。

ncdhz avatar Jul 05 '22 11:07 ncdhz

就是那个官方的源码中他好像是会根据stride计算两边所需要填充的像素个数,比如输入[1920×1080]的图像,用你的源码会生成[640×640],按照官方的思路会生成[640×384],官方好像采取了一种最小pad(填充)的原理。 类似这样:“设置最多不能pad超过64像素,故对(640-360)采用取模操作,变成280%32=24,然后对15进行/2,然后左右pad即可” 但是我按照官方这样写,就是把图片转换成tensor后

torch::Tensor` in_tensor = torch::from_blob(resized_frame.data, {int(resized_frame.rows),int(resized_frame.cols),3}, torch::kByte) 如果是用当前图片的形状却会报错,[640,640,3]不会报错但效果上来看会生成一些不准确的框(参照python源码的detect) 但是我看大多数人都是这样写的

fatejzz avatar Jul 06 '22 01:07 fatejzz

@fatejzz yolov5在转TorchScript时候会根据输入的尺寸计算出模型输入最合适的尺寸,如 [640x300],stride取32得到的结果是,[640x320],然后通过最小pad填充[640x300]到[640x320](这部分和你说的一样)。但是TorchScript有个特点,当从Torch模型转为TorchScript时他的输入尺寸就固定了(不知道最新版torch是不是这样),也就是说后面的模型只能用[640x320]的输入了。 这个项目可以设置图片的height和width,可以通过设置这两个值来适应yolov5的TorchScript模型 YoloV5(std::string ptFile, bool isCuda = false, bool isHalf = false, int height = 640, int width = 640, float confThres = 0.25, float iouThres = 0.45)。

ncdhz avatar Jul 06 '22 05:07 ncdhz

@ncdhz 我理解的是采用最小pad是为了加快推理速度,然后因为我模型转成torchscript模型的输入尺寸就被限制了(这一点我稍后会去了解),所以只能输入经过未最小pad处理后的[640×640]图像这样吗。

fatejzz avatar Jul 06 '22 05:07 fatejzz

@fatejzz 可以输入最小pad处理后的图像,但是是固定的不能一会儿[640x604],一会儿[640x320],你可以对你的数据集求一个宽高均值,然后再选定合适的输入大小。

ncdhz avatar Jul 06 '22 05:07 ncdhz

那我应该是要使用torchscript转换模型的时候确定图片大小吧

fatejzz avatar Jul 06 '22 05:07 fatejzz

ncdhz avatar Jul 06 '22 05:07 ncdhz