论文
https://arxiv.org/pdf/2301.06719
https://github.com/yh-pengtu/FemtoDet
超轻量级检测模型,非常适合cpu推理
SharedNeck
提出了一种SharedNeck结构融合层特征,SharedNeck 将不同尺度的特征通过上采样或下采样对齐,然后通过元素相加的方式进行合并
IBE
提出了一种IBE模块提升模糊物体边界导致的错误检测问题,是对深度可分离卷积的一种改进,下面的图像中最右边图像是有IBE的效果
IBE(ncnn格式)结构:
其中右分支的1×1卷积是将w、h做层融合达到稀疏化,
# 两次sum代表对两个kernel_size求和
# 变成[C_out, C_in, kernel_size, kernel_size]-》[C_out, C_in, kernel_size]-》[C_out, C_in]
# 混合通道可以评估重要性,并且
kernel_diff = self.conv.weight.sum(2).sum(2)
# 手工构建1x1卷积
kernel_diff = kernel_diff[:, :, None, None]
memorydata是一个theta调节系数,作用于这个1×1卷积上;parameter保证训练时该参数会被不断更新
self.theta = Parameter(torch.zeros([1]))
将融合层1×1卷积的输出与原始卷积融合,并通过两个batchnorm再次融合:
out_diff = F.conv2d(input=x, weight=kernel_diff, stride=self.conv.stride, padding=0, groups=self.conv.groups)
theta = F.sigmoid(self.theta)#[None, :, None, None]
# outs = self.att(out_normal, out_normal - theta * out_diff)
# 将普通卷积和1x1稀疏卷积融合,1x1
outs = self.bn(out_normal) + self.bn2(out_normal - theta * out_diff)
以上代码出自femtodet的ibeconv.py
这里我的模型为了提升性能使用的是SILU,原本是ReLU
使用总结
因为模型尺寸很小(不到70k)相对yolo对数据的尺寸适应是比较差的,建议按照一定范围内resize,并且如果对精度有要求适当的减少一些数据增强预处理更好