欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

YOLOv8 上升点技巧:适用于小型目标探测的新型多尺度特征融合 iAFF

最编程 2024-04-05 16:26:03
...

????????????本文全网独家改进: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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!