首页 > 其他分享 >YOLOv8改进 | Neck篇 | YOLOv8引入BiFPN双向特征金字塔网络

YOLOv8改进 | Neck篇 | YOLOv8引入BiFPN双向特征金字塔网络

时间:2024-08-29 22:53:48浏览次数:11  
标签:__ Conv Neck nn self YOLOv8 C2f BiFPN

1.BiFPN介绍

摘要:模型效率在计算机视觉中变得越来越重要。 在本文中,我们系统地研究了用于目标检测的神经网络架构设计选择,并提出了几个提高效率的关键优化。 首先,我们提出了一种加权双向特征金字塔网络(BiFPN),它可以轻松快速地进行多尺度特征融合; 其次,我们提出了一种复合缩放方法,可以同时统一缩放所有主干网络、特征网络和框/类预测网络的分辨率、深度和宽度。 基于这些优化和更好的主干,我们开发了一个新的目标检测器系列,称为EfficientDet,它在各种资源限制下始终实现比现有技术更高的效率。 特别是,通过单模型和单尺度,我们的EfficientDet-D7 在 COCO 测试开发上实现了最先进的 55.1AP,具有77M参数和410B FLOPs1,比以前的检测器小4至9倍,使用的FLOP数减少13至42倍。

官方论文地址:https://arxiv.org/pdf/1911.09070

官方代码地址:https://github.com/google/automl/tree/

简单介绍: 本文给大家带来的改进机制是BiFPN双向特征金字塔网络,是一种特征融合层的结构,改进YOLOv10模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。

BiFPN模块结构图:

2.核心代码

import torch
import torch.nn as nn


class Concat_BiFPN(nn.Module):
    def __init__(self, dimension=1):
        super(Concat_BiFPN, self).__init__()
        self.d = dimension
        self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)
        self.epsilon = 0.0001

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)  # 将权重进行归一化
        # Fast normalized fusion
        x = [weight[0] * x[0], weight[1] * x[1]]
        return torch.cat(x, self.d)

3.YOLOv8中添加BiFPN方式  

3.1 在ultralytics/nn下新建Extramodule

3.2 在Extramodule里创建BiFPN

在BiFPN.py文件里添加给出的BiFPN代码

添加完BiFPN代码后,在ultralytics/nn/Extramodule/__init__.py文件中引用

3.3 在task.py里引用

在ultralytics/nn/tasks.py文件里引用Extramodule

在task.py找到parse_model(ctrl+f可以直接搜索parse_model位置)

添加如下代码:

        elif m is Concat_BiFPN:
            c2 = sum(ch[x] for x in f)

4.新建一个yolov8BiFPN.yaml文件

# Ultralytics YOLO 

标签:__,Conv,Neck,nn,self,YOLOv8,C2f,BiFPN
From: https://blog.csdn.net/tsg6698/article/details/141690300

相关文章