现在利用YOLOv8作为基础模型并在其上进行改进是比较热门的一个放论文的方向,但随着相关文章数量的增多,期刊对于改进方法的创新度要求也逐渐增高,简单的添加模块发论文也变得比较困难,本文将YOLOv8中的C2f模块与EMA注意力机制结合形成新的模块(本文命名为C2f_EMA,也可用其他名字),可以提高改进的创新度。
下面是EMA注意力机制的论文链接:
https://arxiv.org/abs/2305.13563v1
EMA注意力机制
在各种计算机视觉任务中,通道或空间注意机制对于产生更多可识别的特征表示具有显着的有效性。然而,通过通道降维来建模跨通道关系可能会对提取深度视觉表征带来副作用。
文章提出了一种新型的高效多尺度注意力(EMA)模块。为了保留每个通道上的信息和减少计算开销,将部分通道重构为批处理维度,并将通道维度分组为多个子特征,使空间语义特征在每个特征组内均匀分布。
总结一下相比以前的注意力机制最大的改进就是在将通道分成多个子通道的同时保持张量的大小不变,即将部分通道重构为批处理维度,例如原来的张量维度为[B,C,H,W],其中B为批处理 大小,C为通道数,H为高度,W为宽度,重构之后变为[B*G,C//G,H,W],张量大小均为B*C*H*W,从而减少了信息的丢失。
需要查看代码的朋友可以点击这里:https://github.com/YOLOonMe/EMA-attention-module
结合C2f模块
本文将EMA注意力机制加入到到C2f模块中的第一个卷积层之后,对输入特征权重进行动态分配,根据输入的实际内容来决定关注的重点,在引入少量的计算开销下提高模型的精度和泛化性。
下图分别为改进前后的模块结构:
改进后的代码如下:
import torch
from torch import nn
def autopad(k, p=None, d=1): # kernel, padding, dilation
"""Pad to 'same' shape outputs."""
if d > 1:
k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
return p
class Bottleneck(nn.Module):
"""Standard bottleneck."""
def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
"""Initializes a bottleneck module with given input/output channels, shortcut option, group, kern