YOLOv8 上升点技巧:适用于小型目标探测的新型多尺度特征融合 iAFF
????????????本文全网独家改进:1)引入了一种新颖的多尺度特征融合iAFF;2)为了轻量级部署,和GhostConv有效结合在边缘端具有竞争力的准确性
????????????在YOLOv8中如何使用
1)iAFF加入Neck替代Concat;2)Conv替换为GhostConv;3)加入C3Ghost;
1。原理介绍
摘要:提出了一种基于深度学习的轻量级对象检测模型,可以在低端边缘设备上运行,同时仍然具有竞争力的准确性。由一个两阶段的特征学习管道和一个便宜的线性变换组成,它只使用传统卷积神经网络所需的一半卷积滤波器来学习特征映射。此外,它使用注意机制在颈部进行多尺度特征融合,而不是传统检测器使用的单纯连接。可以很容易地按几个数量级放大或缩小,以适应广泛的硬件限制。我们在COCO-val和COCO-testdev数据集上与其他10多个最先进的目标检测器一起评估。结果表明,在模型大小和精度之间取得了最佳平衡(AP增加22%,参数和flop减少23-34%),使其成为在低端边缘设备上部署的理想选择。我们在NVIDIA Jetson Nano上的硬件实现和评估进一步肯定了这一点
综上所述,本文的贡献有:
•我们提出了一种新的目标检测模型,它使用更轻的模型(通过群卷积减少近一半的卷积滤波器)学习更丰富的表示(通过基于注意力的多尺度特征融合)。
•通过数学分析当使用标签平滑时,损失梯度向量如何参与递归反向传播算法,我们提供了标签平滑如何促进训练期间反向传播的理论解释。我们还使用基于遗传算法的超参数调谐方法克服了GhostNet过拟合问题。
•我们将与各种(超过10种)最先进的深度学习对象检测器进行比较(可以很容易地放大或缩小,所以我们可以与不同级别的模型进行公平的比较)。结果表明,在模型尺寸和精度的联合性能上具有优势。
•我们还迁移到实际硬件,以评估其在野外的可用性。我们的实验表明,甚至非常适合最低端的深度学习边缘设备。
其 neck 部分使用注意机制进行多尺度特征融合,而不是传统检测器中的简单级联操作。
2.如何加入YOLOv8
2.1 新建ultralytics/nn/block/iAFF.py
核心代码:
class iAFF(nn.Module):
"""
implimenting iAFF module
"""
def __init__(self, channels=64, r=4):
super(iAFF, self).__init__()
inter_channels = int(channels // r)
self.local_attention1 = nn.Sequential(
nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(inter_channels),
# nn.ReLU(inplace=True),
nn.SiLU(),
nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(channels),
)
self.global_attention1 = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(inter_channels),
# nn.ReLU(inplace=True),
nn.SiLU(),
nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(channels),
)
self.local_attention2 = nn.Sequential(
nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(inter_channels),
# nn.ReLU(inplace=True),
nn.SiLU(),
nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(channels),
)
self.global_attention2 = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(inter_channels),
# nn.ReLU(inplace=True),
nn.SiLU(),
nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(channels),
)
self.sigmoid = nn.Sigmoid()
def forward(self, input):
"""
Implimenting the iAFF forward step
"""
x = input[0]
y = input[1]
xa = x+y
xl = self.local_attention1(xa)
xg = self.global_attention1(xa)
xlg = xl+xg
m1 = self.sigmoid(xlg)
xuniony = x * m1 + y * (1-m1)
xl2 = self.local_attention2(xuniony)
xg2 = self.global_attention2(xuniony)
xlg2 = xl2 + xg2
m2 = self.sigmoid(xlg2)
z = x * m2 + y * (1-m2)
return z
by AI小怪兽
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!