UNeedCryDear / yolov8-opencv-onnxruntime-cpp

yolov8 hub,cpp with onnxruntime and opencv
Apache License 2.0
319 stars 56 forks source link

请问如何支持yolov8中的retina_masks=True设置? #22

Open hwang52 opened 1 year ago

hwang52 commented 1 year ago

大佬您好,在yolov8中进行predict时候可以加上retina_masks=True参数,这样分割出来的图像就会少了很多锯齿,请问大佬您这里边应该怎么设置? 非常感谢!!!

UNeedCryDear commented 1 year ago

我还真没测试过这个参数,不过看实现而言,一个是先缩放获得再原检测图上的bbox框,然后缩放mask,一个是将bbox缩小mask-ratio倍,然后在mask上面获得缩小后检测框的mask,最后将这部分mask缩放回原始图片上的掩膜大小。 image

实际上这两个差距应该不会很大才对,你能否给我个差距的结果图,就是存两张检测结果的图片,最后用下面这种方法获取不同之处。

mask_diff=mask1!=mask2; mask_diff*=255; imwrite("path_to_img.bmp",mask_diff); 另外,你可以看下我这里的getmask和getmask2,前者就是先缩放mask后面获取检测框内的掩膜,后者是缩放bbox,在mask上获取掩膜之后,将掩膜resize回去原始图片大小的。 https://github.com/UNeedCryDear/yolov8-opencv-onnxruntime-cpp/blob/e1befc651c92b618eff87e4d0efbb2ffdc1fa6ad/yolov8_seg_onnx.cpp#L293 https://github.com/UNeedCryDear/yolov8-opencv-onnxruntime-cpp/blob/e1befc651c92b618eff87e4d0efbb2ffdc1fa6ad/yolov8_seg_onnx.cpp#L303

但是我测试了这两张方案差距不会很大,你可以试试看下python下面这两张方案结果差距多少。其实最终如果你真的想要锯齿少的mask,就得修改proto模块,将原本默认的mask-ratio=4换成mask-radio=1,这样你就能得到一张一比一的mask,不需要经过缩放了。代价就是训练的时候显存消耗陡然增大,推理和后处理的速度会比较慢一些。