零、写在最前面:

2023.01.11 更新:

新增加onnxruntime的1.13.x版本支持。

由于onnxruntime从1.12升级到1.13之后,GetOutputName()这个API变成了GetOutputNameAllocated(),坑就出现在这里,新版api的返回值是一个unique_ptr指针,这就意味着他使用一次时候就失效了,所以在循环跑模型的时候基本的第二次都报错了。目前能想到的解决方法就是将其使用std::move()转成shared_ptr,这样可以在类生命周期之内都能存在,不会出现跑第一次就挂掉的情况。

2022.12.19更新:

新增onnxruntime推理实例分割模型,支持动态推理和批次推理,避免opencv不支持动态推理的尴尬境地。

2022.11.10更新:

上次的版本更新中,抠图是在最后的mask中抠图,而如果目标多并且目标小的话,特征图中的大部分区域都是无效数据,但是却参与了特征掩码与特征图计算mask图像的过程,在最后的步骤中才抠图去掉多余的无效数据。所以新版本我做了改变,直接从特征图中抠出有效区域进行计算,可以节省一大部分的时间,特别是检测框多,并且检测框都比较小的情况下效果更明显。

2022.10.13更新:

yolov5的实例分割结果mask从原来的整张图片的mask改成检测结果框内mask,节省内存空间和计算的速度,特别是计算crop区域和分割结果大于阈值的速度,这里用整张图的话,图片越大,检测结果越多,速度下降的厉害,也就是作者讲的计算分割结果需要的资源昂贵。贴个领带的mask结果示意图就明显看出来改动了:左边是整张图的mask,可以看到大部分黑色区域都是无效区域。

yolov8实例分割输出分割坐标_人工智能

yolov5-seg分割模型目前已经发布了,而yolov7-mask目前由于opencv无法正确的读取问题,加上这个分支本身需要facebook的第三方库(这个库win下不好弄),所以一直没搞,opencv或者onnxruntime部署还在研究中,先开个贴占坑。

详细信息请移步:

yolov5-seg:https://github.com/ultralytics/yolov5

yolov7-mask:GitHub - WongKinYiu/yolov7 at mask

一、yolov5-seg

需要注意的是,有些人使用的是最新的torch1.12.x版本,在导出onnx的时候需要将do_constant_folding=True,这句换成false,否者dnn读取不了onnx文件,而onnxrutime可以,具体原因未知。

torch.onnx.export(
    model.cpu() if dynamic else model,  # --dynamic only compatible with cpu
    im.cpu() if dynamic else im,
    f,
    verbose=False,
    opset_version=opset,
    do_constant_folding=False,
    input_names=['images'],
    output_names=output_names,
    dynamic_axes=dynamic or None)

需要运行自己模型的小伙伴,需要跟你你自己的onnx导出情况,修改一些参数,包括,其中_segWidth和_segWidth和_segChannels可以通过https://netron.app/

const int _netWidth = 640;   //ONNX图片输入宽度
	const int _netHeight = 640;  //ONNX图片输入高度
	const int _segWidth = 160;
	const int _segHeight = 160;
	const int _segChannels = 32;
	const int _strideSize = 3;   //stride size

其中,output0为目标检测的输出口+32通道mask的候选特征,与ouput1的mask图像proto叉乘之后得到缩小的mask图,再根据缩放情况进行缩放得到最终的mask图。

yolov8实例分割输出分割坐标_yolov8实例分割输出分割坐标_02

最后贴一张结果图:

yolov8实例分割输出分割坐标_计算机视觉_03

 yolov5的实例分割模型目前已经更新,详细地址在:GitHub - UNeedCryDear/yolov5-seg-opencv-dnn-cpp: 使用opencv-dnn部署yolov5实例分割模型

测试模型可以自己导出或者用我导出的测试,建议跑自己模型的小伙伴先将demo跑通再去修改成自己的模型。

测试模型: