YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
介绍
摘要
我们推出 YOGA,这是一种基于深度学习的轻量级目标检测模型,可以在低端边缘设备上运行,同时仍能实现有竞争力的准确性。 YOGA 架构由一个具有廉价线性变换的两阶段特征学习管道组成,它仅使用传统卷积神经网络所需的一半卷积滤波器来学习特征图。此外,它使用注意力机制在颈部执行多尺度特征融合,而不是传统检测器使用的朴素串联。 YOGA 是一种灵活的模型,可以轻松地放大或缩小几个数量级,以适应广泛的硬件限制。我们使用 10 多个最先进的目标检测器在 COCO-val 和 COCO-testdev 数据集上评估 YOGA。结果表明,YOGA 在模型大小和精度之间取得了最佳权衡(AP 提高了 22%,参数和 FLOP 减少了 23-34%),使其成为低端野外部署的理想选择边缘设备。我们在 NVIDIA Jetson Nano 上的硬件实现和评估进一步证实了这一点。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
YOGA是一种基于深度学习的轻量级目标检测模型,旨在在低端边缘设备上运行,同时实现竞争性的准确性。YOGA架构包括一个两阶段特征学习流水线,其中使用廉价的线性转换学习特征图,仅需传统卷积神经网络所需卷积滤波器数量的一半。此外,它在其"neck"部分使用了一种注意力机制进行多尺度特征融合,而不是传统检测器所使用的简单串联。YOGA是一个灵活的模型,可以轻松地按数量级适应各种硬件约束。我们在COCO-val和COCO-testdev数据集上评估了YOGA,并与其他10多种最先进的目标检测器进行了比较。结果显示,YOGA在模型大小和准确性之间取得了最佳平衡(AP提高了高达22%,参数和FLOPs减少了23-34%),使其成为在低端边缘设备上部署的理想选择。
- 轻量级设计:YOGA通过使用廉价的线性转换(group convolution)在整个网络中学习特征图,仅使用传统CNN所需卷积滤波器数量的一半,从而削减模型大小。
- 多尺度特征融合:YOGA在其"neck"部分使用了一种注意力机制进行多尺度特征融合,这种方法相比传统的简单串联更有效,有助于提高准确性。
- 灵活的可扩展性:YOGA可以根据不同的硬件约束轻松地进行扩展或缩减,适用于各种规模的应用场景。
- 实际硬件实现:YOGA已在NVIDIA Jetson Nano等低端深度学习设备上进行了实际实现和评估,证明其适用于边缘部署。
核心代码
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
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/139826529