当前位置: 首页 > news >正文

爆改YOLOv8|利用yolov9的ADown改进卷积Conv-轻量化

1,本文介绍

本文将利用YOLOv9的ADown模块改进卷积。

关于ADown的详细介绍可以看论文:https://arxiv.org/abs/2402.13616

本文将讲解如何将ADown融合进yolov8

话不多说,上代码!

2, 将ADown融合进yolov8

2.1 步骤一

找到如下的目录'ultralytics/nn/modules',然后在这个目录下创建一个ADown.py文件,文件名字可以根据你自己的习惯起,然后将ADown的核心代码复制进去。


import torch
import torch.nn as nn__all__ = ['ADown']def autopad(k, p=None, d=1):  # kernel, padding, dilation# Pad to 'same' shape outputsif d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn pclass Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act = nn.SiLU()  # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):return self.act(self.conv(x))class ADown(nn.Module):def __init__(self, c1, c2):  # ch_in, ch_out, shortcut, kernels, groups, expandsuper().__init__()self.c = c2 // 2self.cv1 = Conv(c1 // 2, self.c, 3, 2, 1)self.cv2 = Conv(c1 // 2, self.c, 1, 1, 0)def forward(self, x):x = torch.nn.functional.avg_pool2d(x, 2, 1, 0, False, True)x1,x2 = x.chunk(2, 1)x1 = self.cv1(x1)x2 = torch.nn.functional.max_pool2d(x2, 3, 2, 1)x2 = self.cv2(x2)return torch.cat((x1, x2), 1)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-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn pclass Conv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU()  # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):"""Perform transposed convolution of 2D data."""return self.act(self.conv(x))

2.2 步骤二

在task.py导入我们的模块

from .modules.ADown import Adown

2.3 步骤三

在task.py的parse_model方法里面注册我们的模块

到此注册成功,复制后面的yaml文件直接运行即可

yaml文件

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80  # number of classes
scales:  # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2- [-1, 1, ADown, [128]]  # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, ADown, [256]]  # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, ADown, [512]]  # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, ADown, [1024]]  # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]]  # 9# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 6], 1, Concat, [1]]  # cat backbone P4- [-1, 3, C2f, [512]]  # 12- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C2f, [256]]  # 15 (P3/8-small)- [-1, 1, ADown, [256]]- [[-1, 12], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 18 (P4/16-medium)- [-1, 1, ADown, [512]]- [[-1, 9], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

# 关于ADown的位置大家可以自行调换,位置不同结果不同

不知不觉已经看完了哦,动动小手留个点赞收藏吧--_--

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 速盾:高防 cdn 分布式防御攻击?
  • JVM合集
  • 【AI学习】AI科普:专有名词介绍
  • C程序设计(7.0安徽专升本函数)
  • uniapp 小程序样式兼容
  • 小型公司机房运维如何管理
  • 测试人员必备的linux命令(已分组)
  • Windows系统离线安装使用pm2 管理进程
  • Qt5.4.1连接odbc驱动操作达梦数据库
  • 动态规划的解题思想
  • 【C++】vector和list的区别
  • 004——双向链表和循环链表
  • 慎投!又一单位发布2024年高中风险预警期刊名单
  • Python | Leetcode Python题解之第389题找不同
  • Mac快速复制和删除命令
  • Angular 4.x 动态创建组件
  • Git学习与使用心得(1)—— 初始化
  • Javascript弹出层-初探
  • Meteor的表单提交:Form
  • vue-cli3搭建项目
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 从tcpdump抓包看TCP/IP协议
  • 技术胖1-4季视频复习— (看视频笔记)
  • 日剧·日综资源集合(建议收藏)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Apache SeaTunnel 究竟是什么?
  • #pragma预处理命令
  • (13)DroneCAN 适配器节点(一)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (libusb) usb口自动刷新
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (二)Linux——Linux常用指令
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (七)Knockout 创建自定义绑定
  • (三)SvelteKit教程:layout 文件
  • (十八)Flink CEP 详解
  • (一) 初入MySQL 【认识和部署】
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)(官方)UE4--图像编程----着色器开发
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (自用)仿写程序
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *p++,*(p++),*++p,(*p)++区别?
  • .bashrc在哪里,alias妙用
  • .Net Core 中间件验签
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 的字符串暂存池
  • .net下简单快捷的数值高低位切换
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell