代码编织梦想

YOLOv5s+解耦合头(Decoupled Head)

最近,在看YOLOv5s的网络结构,看了一段时间感觉还可以,就想着在看看能不能改进一下。现在网上对于YOLOv5的改进可谓是应有尽有,在这里,写一下关于自己加入解耦合头的改进。实验之后,发现map值提升了1.8(基于我自己的数据集),还是不错的🐱‍🏍

第一步

在common.py文件下,加入以下代码,直接复制即可!

#加入解耦头!!!!!!!!!!!!!!!!!
class DecoupledHead(nn.Module):
    def __init__(self, ch=256, nc=80,  anchors=()):
        super().__init__()
        self.nc = nc  # number of classes
        self.nl = len(anchors)  # number of detection layers
        self.na = len(anchors[0]) // 2  # number of anchors
        self.merge = Conv(ch, 256 , 1, 1)
        self.cls_convs1 = Conv(256 , 256 , 3, 1, 1)
        self.cls_convs2 = Conv(256 , 256 , 3, 1, 1)
        self.reg_convs1 = Conv(256 , 256 , 3, 1, 1)
        self.reg_convs2 = Conv(256 , 256 , 3, 1, 1)
        self.cls_preds = nn.Conv2d(256 , self.nc * self.na, 1)
        self.reg_preds = nn.Conv2d(256 , 4 * self.na, 1)
        self.obj_preds = nn.Conv2d(256 , 1 * self.na, 1)
 
    def forward(self, x):
        x = self.merge(x)
        x1 = self.cls_convs1(x)
        x1 = self.cls_convs2(x1)
        x1 = self.cls_preds(x1)
        x2 = self.reg_convs1(x)
        x2 = self.reg_convs2(x2)
        x21 = self.reg_preds(x2)
        x22 = self.obj_preds(x2)
        out = torch.cat([x21, x22, x1], 1)
        return out

第二步

yolo.py文件下,加入以下代码,直接复制即可!

#加入解耦头!!!!!!!!!!!!!!!!!!!!
class Decoupled_Detect(nn.Module):
    stride = None  # strides computed during build
    onnx_dynamic = False  # ONNX export parameter
    export = False  # export mode
 
    def __init__(self, nc=6, anchors=(), ch=(), inplace=True):  # detection layer
        super().__init__()
 
        self.nc = nc  # number of classes
        self.no = nc + 5  # number of outputs per anchor
        self.nl = len(anchors)  # number of detection layers
        self.na = len(anchors[0]) // 2  # number of anchors
        self.grid = [torch.zeros(1)] * self.nl  # init grid
        self.anchor_grid = [torch.zeros(1)] * self.nl  # init anchor grid
        self.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2))  # shape(nl,na,2)
        self.m = nn.ModuleList(DecoupledHead(x, nc, anchors) for x in ch)
        self.inplace = inplace  # use in-place ops (e.g. slice assignment)
 
    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            x[i] = self.m[i](x[i])  # conv
            bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
 
            if not self.training:  # inference
                if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
 
                y = x[i].sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]  # xy
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy, wh, conf = y.split((2, 2, self.nc + 1), 4)  # y.tensor_split((2, 4, 5), 4)  # torch 1.8.0
                    xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf), 4)
                z.append(y.view(bs, -1, self.no))
 
        return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)
 
    def _make_grid(self, nx=20, ny=20, i=0, torch_1_10=check_version(torch.__version__, '1.10.0')):
        d = self.anchors[i].device
        t = self.anchors[i].dtype
        shape = 1, self.na, ny, nx, 2  # grid shape
        y, x = torch.arange(ny, device=d, dtype=t), torch.arange(nx, device=d, dtype=t)
        yv, xv = torch.meshgrid(y, x, indexing='ij') if torch_1_10 else torch.meshgrid(y, x)  # torch>=0.7 compatibility
        grid = torch.stack((xv, yv), 2).expand(shape) - 0.5  # add grid offset, i.e. y = 2.0 * x - 0.5
        anchor_grid = (self.anchors[i] * self.stride[i]).view((1, self.na, 1, 1, 2)).expand(shape)
        return grid, anchor_grid

第三步

在yolo.py文件下,找到parse_model函数,在下图地方加入改动部分,以及其他一些小改动。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第四步

yolov5s.yaml(我自己的是yolov5s,你们根据自己的模型进行更换yaml文件)文件中,进行最后一步改动,在head中把Detect改为Decoupled_Detect,其他不变。
在这里插入图片描述

总结

至此,关于yolov5加入解耦合头的改进完成,总的来说 提升性能还是不错的,就是会增大参数量👻

参考

参考了以下文章:
YOLOv5 Head解耦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44902604/article/details/129623464

YOLOX全文翻译及环境配置-爱代码爱编程

YOLOX: Exceeding YOLO Series in 2021 声明:作者翻译论文仅为学习,如有侵权请联系作者删除博文,谢谢! 论文地址:https://arxiv.org/abs/2107.08430 图 1:YOLOX 和其他最先进的物体检测器的精确模型(顶部)和移动设备上 lite 模型的尺寸精度曲线(底部)的速度-精度权衡。 Ab

Yolo利息的王者:高效且更精确的目标检测框架(附源代码)-爱代码爱编程

点击上方蓝字关注我们 计算机视觉研究院专栏 作者:Edison_G YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor-free

Yolo系列的巅峰之作:更确的目标检测框架(附源代码)-爱代码爱编程

点击上方蓝字关注我们 计算机视觉研究院专栏 作者:Edison_G YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor-free

[论文翻译]YOLOX: Exceeding YOLO Series in 2021-爱代码爱编程

YOLOX:2021超越YOLO系列 摘要 本报告中,我们对YOLO系列进行了一些有经验的改进,构成了一个新的高性能检测器——YOLOX。我们将YOLO检测器变成无锚模式,并实施了一些其他先进检测技术,即,一个解耦头和引导标签分配策略SimOTA在大尺度范围模型中达到SOTA结果:对于仅有0.91M参数和1.08FLOPs的YOLONano,我们在CO

YoloX框架:高效更精确的目标检测框架(附源代码)-爱代码爱编程

点击上方蓝字关注我们 计算机视觉研究院专栏 作者:Edison_G YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor-free

论文:YOLOX: Exceeding YOLO Series in 2021-爱代码爱编程

作者 Abstract In this report, we present some experienced improvements to YOLO series, forming a new high-performance detector— YOLOX. We switch the YOLO detector to an ancho

单阶段目标检测重要论文总结_秋天的风儿的博客-爱代码爱编程

文章目录 一、Yolov11、论文简介2、检测原理3、结构设计4、疑难问题5、论文总结二、Yolov21、论文简介2、更好、更快、更强1)为什么更好?2)为什么更快?3)为什么更强? 此为YOLO9000内容3、Darknet-19代码实现4、论文总结三、Yolov31、论文简介2、结构设计Darknet-53整体结构3、Darknet-53代码实

yolox: exceeding yolo series in 2021_highlight_jin的博客-爱代码爱编程

YOLOX: Exceeding YOLO Series in 2021 Abstract 在这份报告中,我们对YOLO系列进行了一些有经验的改进,形成了一个新的高性能检测器–YOLOX。我们将YOLO检测器转换为无锚方式,并进行其他先进的检测技术,即解耦头和领先的标签分配策略SimOTA,在大规模的模型范围内获得最先进的结果。对于只有0.91M参数和

看了几十篇轻量化目标检测论文扫盲做的摘抄笔记_y蓝田大海的博客-爱代码爱编程

 摘要:本文首先介绍了轻量化目标检测及其发展历程,接着又对常见的轻量化目标检测算法以及网络进行概述,在此基础上引出近三年来最新的轻量化目标检测算法,最后对轻量化目标检测的发展和研究做出总结。 关键字:目标检测;轻量化;卷积神经网络;深度学习 引言         近年来,随着深度学习技术的不断发展,神经网络凭借强大的特征表达能力和泛化能力在计算机

yolo系列的高效更精确的目标检测框架(附源代码)_计算机视觉研究院的博客-爱代码爱编程

点击上方蓝字关注我们 计算机视觉研究院专栏 作者:Edison_G YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor-free的

yolo系列目标检测算法-yolov6_mr.小梅的博客-爱代码爱编程

YOLO系列目标检测算法目录 YOLO系列目标检测算法总结对比YOLOv1YOLOv2YOLOv3YOLOv4Scaled-YOLOv4YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接

yolo系列目标检测算法——yolox-爱代码爱编程

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接

openmmlab 目标检测-爱代码爱编程

OpenMMLab 目标检测 1. 目标检测简介1.1 滑窗 2. 基础知识2.1 边界框(Bounding Box) 3. 两阶段目标检测算法3.1 多尺度检测技术 4. 单阶段目标检测算法4.1 YO

yolox论文翻译_yolox论文下载-爱代码爱编程

YOLOX论文翻译 论文题目:《YOLOX:2021超越YOLO系列》摘要1引言2 YOLOX2.1 YOLOX-DarkNet532.2 其他骨干网 3 与SOTA比较4 流媒体感知挑战(WAD at

yolo的巅峰框架:高效更精确的目标检测框架(附源代码)-爱代码爱编程

点击上方蓝字关注我们 计算机视觉研究院专栏 作者:Edison_G YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor

yolov8详解 【网络结构+代码+实操】-爱代码爱编程

文章目录 YOLOv8 概述模型结构Loss 计算训练数据增强训练策略模型推理过程 网络模型解析卷积神经单元(model.py) Yolov8实操快速入门环境配置数据集准备模型的训练/验证/预测/导

全网独家首发|极致版yolov7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进yolov7网络模型_提升yolo7处理效率-爱代码爱编程

有不少小伙伴和我交流YOLO改进的时候,都说YOLOv7的网络配置文件长达104层,改起来很费力,数层数都要数很久,还很容易出错,而且基于YOLOv5代码架构,Debug起来也确实比较费时,所以博主对YOLOv7网络配置进行

python+yolov5道路障碍物识别_yolo识别路面异物-爱代码爱编程

Python+Yolov5道路障碍物识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Python+Yolov5道路障碍物识别>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。 文章目录 一、所需工具软件 二、使用步骤