作者提出一种SPD组件,提升了yolov5各个模型在小目标上的检测能力,先看一下结论:
该组件作者给出了数学上的解释:
其实解释起来很简单,结合下图:
和yolov5最开始做的focus是类似的,对于输入的特征图(长宽为S),从左到右以及从上到下每scale个像素采样一次,假设scale=2,采样方式就和上图一样,经过这样采样的输出长宽就是S/2,最后将采样后的输出进行concatenate,通道数就是scale的平方,即4。
具体的应用,首先对比下网络架构的配置文件
左侧是yolov5原始模型的网络架构,右图则是增加SPD结构的yolov5网络架构,其中红框部分就是两网络的区别之处 。
代码的实现也比较简单:
class space_to_depth(nn.Module):
# Changing the dimension of the Tensor
def __init__(self, dimension=1):
super().__init__()
self.d = dimension
def forward(self, x):
return torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)
# size_tensor = x.size()
# return torch.cat([x[...,0:size_tensor[2]//2,0:size_tensor[3]//2],
# x[...,0:size_tensor[2]//2,size_tensor[3]//2:],
# x[...,size_tensor[2]//2:,0:size_tensor[3]//2],
# x[...,size_tensor[2]//2:,size_tensor[3]//2:] ],1)
在coco val2017上的效果:
其中红色箭头就是两者的区别。
在原文中作者还将该结构应用在分类模型上,分类性能上也有一定的提升,感兴趣的可以看看原文。
文章出处登录后可见!
已经登录?立即刷新