2022.09.29更新 c++下面使用opencv部署yolov5和yolov7实例分割模型(六)

零、写在最前面:

2022.10.13更新:

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

2022.09.29更新 c++下面使用opencv部署yolov5和yolov7实例分割模型(六)_第1张图片

yolov5-seg分割模型目前已经发布了,加上yolov7-mask,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图。

2022.09.29更新 c++下面使用opencv部署yolov5和yolov7实例分割模型(六)_第2张图片

最后贴一张结果图:

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

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

测试模型:https://download.csdn.net/download/qq_34124780/86745135

你可能感兴趣的:(渣渣的yolo踩坑记录,opencv,计算机视觉,人工智能)