yolov5-7.0检测和实例分割的对比分析,yolov7与此类似
简介
本文主要对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可视化部分。通过简单明了的方式对检测和实例分割功能的实现进行了对比。所对比内容虽然不全,但基本包含很大部分,对理解好应用感觉还是可以的。
欢迎大家补充和沟通。
更多推荐
所有评论(0)