简介

本文主要对yolov5-7.0版本的实例分割和目标检测两个功能进行对比,以帮助大家理解和使用。对比部分主要包括onnx可视化图、配置参数、输出头的模块、train.py、loss.py等主要内容。

代码部分对比

配置参数对比

对比展示

在这里插入图片描述
Segment模块代码:

class Segment(Detect):
    # YOLOv5 Segment head for segmentation models
    def __init__(self, nc=80, anchors=(), nm=32, npr=256, ch=(), inplace=True):
        super().__init__(nc, anchors, ch, inplace)
        self.nm = nm  # number of masks
        self.npr = npr  # number of protos
        self.no = 5 + nc + self.nm  # number of outputs per anchor
        self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv
        self.proto = Proto(ch[0], self.npr, self.nm)  # protos
        self.detect = Detect.forward

    def forward(self, x):
        p = self.proto(x[0])
        x = self.detect(self, x)
        return (x, p) if self.training else (x[0], p) if self.export else (x[0], p, x[1])

Proto模块代码:

class Proto(nn.Module):
    # YOLOv5 mask Proto module for segmentation models
    def __init__(self, c1, c_=256, c2=32):  # ch_in, number of protos, number of masks
        super().__init__()
        self.cv1 = Conv(c1, c_, k=3)
        self.upsample = nn.Upsample(scale_factor=2, mode='nearest')
        self.cv2 = Conv(c_, c_, k=3)
        self.cv3 = Conv(c_, c2)

    def forward(self, x):
        return self.cv3(self.cv2(self.upsample(self.cv1(x))))

对比结果

由上述对比,实例分割部分的输出头用的是Segment模块,而检测用的是Detect模块。通过查看Segment模块模块代码可知,此模块由两部分构成,一部分是检测用的Detect,另外一部分是用于分割的Proto模块。可以看出,实例分割包含了目标检测部分。

train.py部分代码对比

对比展示

下图为实例分割训练部分
在这里插入图片描述
下图为仅有目标检测训练部分
在这里插入图片描述

对比结果

对比上面可知,在对输入的图像进行预测后,带有实例分割功能的算法计算损失时输入多了mask=mask.to(device).float()。
可知,输出的pred不仅包含坐标框、置信度、类别信息,还包含了mask信息,在计算损失时也将计算mask的损失。此部分与onnx可视化的输出参数相对应。

loss.py代码部分对比

对比展示

左边为带有实例分割算法的计算损失部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对比结果

通过上述部分对比可知,带有实例分割功能的算法在计算损失时,根据mask信息单独构建了一个模块用于计算mask损失,并在总体损失上加上了mask的损失,用于后面的参数更新。

onnx可视化图对比

由上面的配置文件和网络结构可知,实例分割和检测的区别在于输出部分,特征提取和特征融合部分是相同的,因此,下面将将截取输出部分的onnx可视化进行对比。

对比展示

下面的是检测模型的输出头部分。
在这里插入图片描述
下面是实例分割输出头部分。

在这里插入图片描述

对比结果

经过对比可知,实例分割的输出时多了一个分支,输出结果多了mask部分,相当于一个框多了32个数据,即由原来的85变为117。

总结

以上部分从配置文件开始,到torch中的部分代码,以至于最后的onnx可视化部分。通过简单明了的方式对检测和实例分割功能的实现进行了对比。所对比内容虽然不全,但基本包含很大部分,对理解好应用感觉还是可以的。

欢迎大家补充和沟通。

GitHub 加速计划 / yo / yolov7
13.13 K
4.14 K
下载
YOLOv7 - 实现了一种新的实时目标检测算法,用于图像识别和处理。
最近提交(Master分支:3 个月前 )
a207844b - 1 年前
2c612d33 - 1 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐