0


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

零、写在最前面:

2022.11.10更新:

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

2022.10.13更新:

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

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图。

最后贴一张结果图:

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

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

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


本文转载自: https://blog.csdn.net/qq_34124780/article/details/127104103
版权归原作者 爱晚乏客游 所有, 如有侵权,请联系我们删除。

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

还没有评论