海洋目标相关的检测在我之前的文章里面也有过一些实践,大多是针对海洋垃圾、海洋生物等的检测,对于红外场景下的海洋目标检测倒是没有涉及过,上周末正好有时间就想着尝试一下开发一套红外场景下的海洋目标检测系统,另外之前一直看到yolov5项目中集成了ensemble技术,一直想拿来试试,可是一直没有尝试过,正好周末一起做一下看看。
首先看下效果图:
简单看下数据集:
标注文件如下所示:
实例标注内容如下所示:
1 0.155078 0.777832 0.039844 0.022461
1 0.392969 0.773926 0.03125 0.012695
1 0.726562 0.779297 0.064062 0.013672
1 0.761328 0.768555 0.038281 0.009766
这里因为想试用一下Ensemble方法,所以这里的模型开发构建最少也是需要两种模型的,为了节省时间出结果,我选择了最为轻量级的n和s系列来开发模型,以n为例如下:
#Parameters
nc: 7 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
#Backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
#Head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
默认设定的都是100次epoch的迭代计算,结果如下
从效果上来看,两个模型没有太大差距。
可视化推理样例如下:
感兴趣话也可以自己尝试一下
官方Ensemble实现还是很好的,如下:
class Ensemble(nn.ModuleList):
# Ensemble of models
def __init__(self):
super().__init__()
def forward(self, x, augment=False, profile=False, visualize=False):
y = [module(x, augment, profile, visualize)[0] for module in self]
# y = torch.stack(y).max(0)[0] # max ensemble
y = torch.stack(y).mean(0) # mean ensemble
# y = torch.cat(y, 1) # nms ensemble
return y, None # inference, train output
有几种不同的模式可以根据自己的实际需求进行选择。