改进YOLOv7系列:结合丰富的梯度流信息模块,来自YOLOv8的核心模块

news2024/5/18 18:59:13
  • 💡统一使用 YOLOv7 代码框架,结合不同模块来构建不同的YOLO目标检测模型。
  • 🌟本项目包含大量的改进方式,降低改进难度,改进点包含【Backbone特征主干】【Neck特征融合】【Head检测头】【注意力机制】【IoU损失函数】【NMS】【Loss计算方式】【自注意力机制】、【数据增强部分】【标签分配策略】、【激活函数】等各个部分

文章目录

    • 一、理论部分
    • 二、将其应用到YOLOv7中
      • 配置文件
      • 核心代码
      • 其他配置
      • 运行配置

一、理论部分

这个模块比较简单,就直接上代码了.

C2f模块来自YOLOv8系列,本质上改进借鉴了YOLOv7核心模块的思想,所以这个严格来说不算改进。

YOLOv5作者YOLOv8作者 是用一个作者,所以没必要基于YOLOv5加这个了…作者本身就是基于 YOLOv5 改进得到的 YOLOv8

在这里插入图片描述

就简单试一下效果吧

这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好

图中C2f模块就是ultralytics改进的模块

C2f模块结合了C3模块以及ELAN模块的思想设计
在这里插入图片描述
图源:https://github.com/ultralytics/ultralytics/issues/189

二、将其应用到YOLOv7中

配置文件

增加以下yolov7_c2f.yaml文件
代码演示

# YOLOv5 🚀 by YOLOAir, GPL-3.0 license
# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel iscyy multiple

# anchors
anchors:
  - [12,16, 19,36, 40,28]  # P3/8
  - [36,75, 76,55, 72,146]  # P4/16
  - [142,110, 192,243, 459,401]  # P5/32

# yolov7 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [32, 3, 1]],  # 0
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2
   [-1, 1, Conv, [64, 3, 1]],
   [-1, 1, Conv, [128, 3, 2]],  # 3-P2/4 
   [-1, 1, C2f, [128]], 
   [-1, 1, Conv, [256, 3, 2]], 
   [-1, 1, MP, []],
   [-1, 1, Conv, [128, 1, 1]],
   [-3, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 2]],
   [[-1, -3], 1, Concat, [1]],  # 16-P3/8
   [-1, 1, Conv, [128, 1, 1]],

   [-2, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],
   [-1, 1, Conv, [128, 3, 1]],

   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [512, 1, 1]],
   
   [-1, 1, MP, []],
   [-1, 1, Conv, [256, 1, 1]],
   [-3, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, -3], 1, Concat, [1]],
   [-1, 1, Conv, [256, 1, 1]],

   [-2, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],

   [-1, 1, Conv, [256, 3, 1]],
   [-1, 1, Conv, [256, 3, 1]],

   [[-1, -3, -5, -6], 1, Concat, [1]],
   [-1, 1, Conv, [1024, 1, 1]],          
   [-1, 1, MP, []],
   [-1, 1, Conv, [512, 1, 1]],
   [-3, 1, Conv, [512, 1, 1]],
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, -3], 1, Concat, [1]],
   [-1, 1, C2f, [1024]],
   [-1, 1, Conv, [256, 3, 1]],
  ]

# yolov7 head
head:
  [[-1, 1, SPPCSPC, [512]],

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [31, 1, Conv, [256, 1, 1]],
   [[-1, -2], 1, Concat, [1]],
   [-1, 1, C2f, [128]],

   [-1, 1, Conv, [128, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [18, 1, Conv, [128, 1, 1]],
   [[-1, -2], 1, Concat, [1]],

   [-1, 1, C2f, [128]],

   [-1, 1, MP, []],
   [-1, 1, Conv, [128, 1, 1]],
   [-3, 1, Conv, [128, 1, 1]],
   [-1, 1, Conv, [128, 3, 2]],
   [[-1, -3, 44], 1, Concat, [1]],
   [-1, 1, C2f, [256]], 
   [-1, 1, MP, []],
   [-1, 1, Conv, [256, 1, 1]],
   [-3, 1, Conv, [256, 1, 1]],
   [-1, 1, Conv, [256, 3, 2]], 
   [[-1, -3, 39], 1, Concat, [1]],

   [-1, 3, C2f, [512]],

# 检测头 -----------------------------
   [49, 1, RepConv, [256, 3, 1]],
   [55, 1, RepConv, [512, 3, 1]],
   [61, 1, RepConv, [1024, 3, 1]],

   [[62,63,64], 1, IDetect, [nc, anchors]],   # Detect(P3, P4, P5)
  ]

核心代码

./models/common.py文件增加以下模块

class Bottlenecks(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):  # ch_in, ch_out, shortcut, groups, kernels, expand
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, k[0], 1)
        self.cv2 = Conv(c_, c2, k[1], 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

class C2f(nn.Module):
    # CSP Bottleneck with 2 convolutions
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottlenecks(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

    def forward(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

其他配置

找到./models/yolo.py文件下里的parse_model函数,将类名加入进去

for i, (f, n, m, args) in enumerate(d[‘backbone’] + d[‘head’]):`内部
对应位置 下方只需要增加 代码

参考代码

        elif m in [C2f]:
            c1, c2 = ch[f], args[0]
            if c2 != no:  # if not output
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, c2]
            if m in [C2f]:
                args.insert(2, n)  # number of repeats
                n = 1

运行配置

python train.py --cfg yolov7_c2f.yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux操作系统】进程优先级和进程切换

文章目录一.进程优先级1.三段论谈优先级2.PRI和NI二.进程切换1.进程的四个特性2.上下文数据保护和恢复一.进程优先级 1.三段论谈优先级 什么是优先级?它等同于权限吗? 定义: cpu资源分配的先后顺序,就是指进程的优先权(priority…

SpringBoot + MDC 实现全链路调用日志跟踪

写在前面MDC介绍MDC使用MDC 存在的问题解决MDC存在的问题写在前面通过本文将了解到什么是MDC、MDC应用中存在的问题、如何解决存在的问题基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 用户小程序,支持 RBAC 动态权限、多租户、数据权限、…

Shader踩坑笔记UV操作

一、UV坐标范围0-1 // 坐标范围 0-1,原点在画布左下角 vec2 uv FRAGCOORD.xy / iResolution.xy; 有两个变量 1、FRAGCOORD是godot引擎自带的变量表示纹理坐标 2、iResolution我自定义的变量,输入画布尺寸 使用uniform关键词可以创建自定义变量 比…

戴尔电脑怎么录屏?这6个方法教你轻松录屏

无论您是需要录制屏幕活动以创建在线发布的演示文稿、录制网络研讨会的屏幕以供日后参考,还是出于任何其他原因——如果您使用的是戴尔或类似 PC,您有多种选择。那么,让我们来谈谈如何在戴尔笔记本电脑上进行屏幕记录。 在戴尔笔记本电脑上录…

机器人介绍、应用、前景

机器人介绍、应用、前景1 介绍1.1 定义1.2 作用1.3 发展历程1.4 分类1.5 三大顾虑1.6 前景2 种类工业机器臂协作机械臂工业移动机器人复合机器人扫地机器人服务机器人机器狗人形机器人无人机3 技术3.1 机器人学分类3.2 功能分类3.2.1 感知3.2.2 决策3.2.3 执行AGV减震机构减速机…

经典问题:Python实现生产者消费者模式的多线程爬虫

Python实现生产者消费者模式的多线程爬虫1. 多组件的Pipeline技术架构2. 生产者消费者爬虫的架构3.多线程数据通信的queue.Queue4. 代码编写实现生产者消费者爬虫1. 多组件的Pipeline技术架构 复杂的事情一般都不会一下子做完,而是会分很多中间步骤一步步完成。 …

二十七、Kubernetes中DaemonSet(DS)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

LeetCode题目笔记——2293. 极大极小游戏

文章目录题目描述题目难度——简单方法一:模拟代码/Python方法二:优化本地修改代码/python代码/C总结题目描述 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度&#x…

理论——加密法

前言写C写多了,给大伙换换口味,这篇文章将会给大家带来几种加密法,以后写情书有素材了吧?还不快谢谢我~正文凯撒加密法简介在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0…

因果推断6--多任务学习(个人笔记)

目录 1多任务学习 1.1问题描述 1.2数据集 1.3网络结构 1.4结果 2因果推断使用多任务方式 2.1DRNet 2.2Dragonet 2.3Deep counterfactual networks with propensity-dropout 2.4VCNet 3思考 1多任务学习 keras-mmoe/census_income_demo.py at master drawbridge/ke…

一种穷人式的内存泄露检测方式

对于检测程序代码中的资源泄露问题,市面上已经有很多工具了,但是今天我再来介绍一种新的方式,这种方式不需要安装任何工具或者特定的编译器开关,也不需要第三方库。 那就是:一直保持程序运行,直到泄露的原因…

【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数

作者:一个喜欢猫咪的的程序员 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 HJ99 自守数 OR86 返回小于 N 的质数个数 HJ99 自守数 自守数_牛客…

Linux系统之安装Linux管理工具inpanel

Linux系统之安装Linux管理工具inpanel一、inpanel介绍1.inpanel简介2.inpanel特点二、检查本地系统环境1.检查系统版本2.检查系统内核版本三、下载inpanel软件包1.创建下载目录2.下载inpanel软件3.查看源码inpanel文件四、部署inpanel应用1.一键安装inpanel2.查看服务端口五、关…

【双U-Net残差网络:超分】

Dual U-Net residual networks for cardiac magnetic resonance images super-resolution (心脏磁共振图像超分辨率的双U-Net残差网络) 目前,心脏磁共振(CMR)成像能够提供心脏全方位的结构和功能信息,已成…

难道你也不能放烟花嘛?那就来看看这个吧!

又到了一年一度的春节时期啦!昨天呢是北方的小年,今天是南方的小年,看到大家可以愉快的放烟花,过大年很是羡慕呀!辞旧岁,贺新春,今年我呀要放烟花,过春节!🧨。…

农产品商城简单demo-Android

项目概述 随着科学技术的不断提高和社会经济的不断发展,一些农产品的销售逐渐的落后于社会信息化的潮流之中,尤其是一些年龄较大的中老年人来说是极为不便的,国家大力倡导并十分重视三农问题,倡导推动农村农业的发展,为…

第二章 搜索求解

人工智能中的搜索&#xff1a; 搜索算法的形式化描述&#xff1a;<状态、动作、状态转移、路径、测试目标> 状态&#xff1a;从原问题转化出的问题描述。 动作&#xff1a;从当前时刻所处状态转移到下一时刻所处状态。 状态转移&#xff1a;对某一时刻对应状态进行某一…

泛型的学习

这里写目录标题一、泛型的使用自定义泛型类泛型方法说明泛型在继承方面的体现通配符的使用有限制条件的通配符的的使用每日一考一、泛型的使用 1、jdk5.0新增特性 2、在集合中使用泛型 ①集合接口或集合类在jdk5.0时都修改为带泛型的结构 ②实例化集合时&#xff0c;可以指明具…

是Spring啊!

一.概念spring概念一个包含了众多工具方法的 IoC 容器okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么?Ioc2.1解释IoC -> Inversion of Control 控制反转 -> 对象的生命周期 ->…

Git版本控制工具详解

1、版本控制 1.1、认识版本控制&#xff08;版本控制&#xff09; 什么是版本控制&#xff1f; 版本控制的英文是Version control&#xff1b;是维护工程蓝图的标准作法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程&#xff1b;版本控制也是一种软件工程技巧&#xff…