改进YOLOv5——魔改YOLOv5提升检测精度


 魔改YOLOv5目标检测算法结合各种新颖且有效的网络结构,效果俱佳!!!


其中,包括注意力SE/CBAM/ECA/CA/PSA,BiFPN,Transformer、BotNet、DIOU NMS、EIOU Loss以及其他Tricks等),在自身数据集上进行训练,发现平均精度均值mAP涨点明显。近期较忙,代码咨询的小伙伴请私聊!!!

Transformer是一种主要基于自注意力机制的深度神经网络,最初是在自然语言处理领域中应用的。受到Transformer强大的表示能力的启发,研究人员提议将Transformer扩展到计算机视觉任务。与其他网络类型(例如卷积网络和循环网络)相比,基于Transformer的模型在各种视觉基准上显示出竞争性的甚至更好的性能。

卷积神经网络(CNN)引入了卷积层和池化层以处理图像等位移不变性的数据。递归神经网络(RNN)利用循环单元来处理顺序数据或时间序列数据。Transformer是一种新提出的神经网络,主要利用自我注意机制提取内在特征。在这些网络中,Transformer是最近发明的神经网络(2017年),对于广泛的人工智能应用具有巨大的潜力。

Transformer最初应用于自然语言处理(NLP)任务,并带来了显着的改进。例如,Vaswani等人首先提出了一种仅基于注意力机制来实现机器翻译和英语选区解析任务的Transformer。Devlin等人引入了一种称为BERT的新语言表示模型,该模型通过共同限制左右上下文来预训练未标记文本的翻译器。BERT在当时的11个NLP任务上获得了SOTA结果。Brown等人在45TB压缩明文数据上预训练了基于巨型Transformer的GPT-3模型,该模型具有1,750亿个参数,并且无需微调即可在不同类型的下游自然语言任务上实现出色的性能。这些基于Transformer的模型显示了强大的表示能力,并在NLP领域取得了突破。

 受NLP中Transformer功能的启发,最近的研究人员将Transformer扩展到计算机视觉(CV)任务。CNN曾经是视觉应用中的基本组件,但是Transformer显示出了其作为CNN替代品的能力。Chen等人训练一个sequence Transformer去自动回归预测像素并在图像分类任务上与CNN取得竞争性结果。ViT是Dosovitskiy等人最近提出的Visual Transformer模型。ViT将一个纯粹的transformer直接用于图像块序列,并在多个图像识别基准上获得SOTA性能。除了基本的图像分类,transformer还用于解决更多计算机视觉问题,例如目标检测,语义分割,图像处理和视频理解。由于其出色的性能,提出了越来越多基于transformer的模型来改善各种视觉任务。

1.视觉Transformer结构图:

2. 部分代码:

class TransformerLayer(nn.Module):
    # Transformer layer https://arxiv.org/abs/2010.11929 (LayerNorm layers removed for better performance)
    def __init__(self, c, num_heads):
        super().__init__()
        self.q = nn.Linear(c, c, bias=False)
        self.k = nn.Linear(c, c, bias=False)
        self.v = nn.Linear(c, c, bias=False)
        self.ma = nn.MultiheadAttention(embed_dim=c, num_heads=num_heads)
        self.fc1 = nn.Linear(c, c, bias=False)
        self.fc2 = nn.Linear(c, c, bias=False)
 
    def forward(self, x):
        x = self.ma(self.q(x), self.k(x), self.v(x))[0] + x
        x = self.fc2(self.fc1(x)) + x
        return x
 
 
class TransformerBlock(nn.Module):
    # Vision Transformer https://arxiv.org/abs/2010.11929
    def __init__(self, c1, c2, num_heads, num_layers):
        super().__init__()
        self.conv = None
        if c1 != c2:
            self.conv = Conv(c1, c2)
        self.linear = nn.Linear(c2, c2)  # learnable position embedding
        self.tr = nn.Sequential(*[TransformerLayer(c2, num_heads) for _ in range(num_layers)])
        self.c2 = c2
 
    def forward(self, x):
        if self.conv is not None:
            x = self.conv(x)
        b, _, w, h = x.shape
        p = x.flatten(2)
        p = p.unsqueeze(0)
        p = p.transpose(0, 3)
        p = p.squeeze(3)
        e = self.linear(p)
        x = p + e
 
        x = self.tr(x)
        x = x.unsqueeze(3)
        x = x.transpose(0, 3)
        x = x.reshape(b, self.c2, w, h)
        return x
 
 
class SwinTransformerBlock(nn.Module):
    def __init__(self, c1, c2, num_heads, num_layers, window_size=8):
        super().__init__()
        if c1 = c2:
            self.conv = Conv(c1, c2)
 
        # remove input_resolution
        self.blocks = nn.Sequential(*[SwinTransformerLayer(dim=c2, num_heads=num_heads, window_size=window_size,
                                 shift_size=0 if (i % 2 == 0) else window_size // 2) for i in range(num)])
 
    def forward(self, x):
        if self.conv is not None:
            x = self.conv(x)
        x = self.blocks(x)
        return x

物联沃分享整理
物联沃-IOTWORD物联网 » 改进YOLOv5——魔改YOLOv5提升检测精度

发表评论