返回顶部
首页 > 资讯 > 精选 >yolov5中head怎么修改为decouple head
  • 458
分享到

yolov5中head怎么修改为decouple head

2023-07-02 09:07:26 458人浏览 泡泡鱼
摘要

这篇文章主要介绍“yolov5中head怎么修改为decouple head”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“yolov5中head怎么修改为decouple hea

这篇文章主要介绍“yolov5中head怎么修改为decouple head”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“yolov5中head怎么修改为decouple head”文章能帮助大家解决问题。

yolox的decoupled head结构

yolov5中head怎么修改为decouple head

本来想将yolov5的head修改为decoupled head,与yolox的decouple head对齐,但是没注意,该成了如下结构:

yolov5中head怎么修改为decouple head

感谢少年肩上杨柳依依的指出,如还有问题欢迎指出

yolov5中head怎么修改为decouple head

1.修改models下的yolo.py文件中的Detect

class Detect(nn.Module):    stride = None  # strides computed during build    onnx_dynamic = False  # ONNX export parameter    def __init__(self, nc=80, 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(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv        self.m_box = nn.ModuleList(nn.Conv2d(256, 4 * self.na, 1) for x in ch)  # output conv        self.m_conf = nn.ModuleList(nn.Conv2d(256, 1 * self.na, 1) for x in ch)  # output conv        self.m_labels = nn.ModuleList(nn.Conv2d(256, self.nc * self.na, 1) for x in ch)  # output conv        self.base_conv = nn.ModuleList(BaseConv(in_channels = x, out_channels = 256, ksize = 1, stride = 1) for x in ch)        self.cls_convs = nn.ModuleList(BaseConv(in_channels = 256, out_channels = 256, ksize = 3, stride = 1) for x in ch)        self.reg_convs = nn.ModuleList(BaseConv(in_channels = 256, out_channels = 256, ksize = 3, stride = 1) for x in ch)                # self.m = nn.ModuleList(nn.Conv2d(x, 4 * self.na, 1) for x in ch, nn.Conv2d(x, 1 * self.na, 1) for x in ch,nn.Conv2d(x, self.nc * self.na, 1) for x in ch)        self.inplace = inplace  # use in-place ops (e.g. slice assignment)self.ch = ch    def forward(self, x):        z = []  # inference output        for i in range(self.nl):            # # x[i] = self.m[i](x[i])  # convs            # print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", i)            # print(x[i].shape)            # print(self.base_conv[i])            # print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")                                                x_feature = self.base_conv[i](x[i])            # x_feature = x[i]                        cls_feature = self.cls_convs[i](x_feature)            reg_feature = self.reg_convs[i](x_feature)            # reg_feature = x_feature                        m_box = self.m_box[i](reg_feature)            m_conf = self.m_conf[i](reg_feature)            m_labels = self.m_labels[i](cls_feature)            x[i] = torch.cat((m_box,m_conf, m_labels),1)            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 - 0.5 + 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 = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh                    y = torch.cat((xy, wh, y[..., 4:]), -1)                z.append(y.view(bs, -1, self.no))        return x if self.training else (torch.cat(z, 1), x)

2.在yolo.py中添加

def get_activation(name="silu", inplace=True):    if name == "silu":        module = nn.SiLU(inplace=inplace)    elif name == "relu":        module = nn.ReLU(inplace=inplace)    elif name == "lrelu":        module = nn.LeakyReLU(0.1, inplace=inplace)    else:        raise AttributeError("Unsupported act type: {}".fORMat(name))    return moduleclass BaseConv(nn.Module):    """A Conv2d -> Batchnorm -> silu/leaky relu block"""    def __init__(        self, in_channels, out_channels, ksize, stride, groups=1, bias=False, act="silu"    ):        super().__init__()        # same padding        pad = (ksize - 1) // 2        self.conv = nn.Conv2d(            in_channels,            out_channels,            kernel_size=ksize,            stride=stride,            padding=pad,            groups=groups,            bias=bias,        )        self.bn = nn.BatchNorm2d(out_channels)        self.act = get_activation(act, inplace=True)    def forward(self, x):        # print(self.bn(self.conv(x)).shape)        return self.act(self.bn(self.conv(x)))        # return self.bn(self.conv(x))    def fuseforward(self, x):        return self.act(self.conv(x))

decouple head的特点:

由于训练模型时,应该是channels = 256的地方改成了channels = x(失误),所以在decoupled head的部分参数量比yolox要大一些,以下的结果是在channels= x的情况下得出

比yolov5s参数多,计算量大,在我自己的2.5万的数据量下map提升了3%多

模型给出的目标cls较高,需要将conf的阈值设置较大(0.5),不然准确率较低

parser.add_argument('--conf-thres', type=float, default=0.5, help='confidence threshold')

对于少样本的检测效果较好,召回率的提升比准确率多

在conf设置为0.25时,召回率比yolov5s高,但是准确率低;在conf设置为0.5时,召回率与准确率比yolov5s高

比yolov5s参数多,计算量大,在2.5万的数据量下map提升了3%多

对于decouple head的改进

yolov5中head怎么修改为decouple head

改进:

将红色框中的conv去掉,缩小参数量和计算量;

channels =256 ,512 ,1024是考虑不增加参数,不进行featuremap的信息压缩

class Detect(nn.Module):    stride = None  # strides computed during build    onnx_dynamic = False  # ONNX export parameter    def __init__(self, nc=80, 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(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv        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 - 0.5 + 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 = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh                    y = torch.cat((xy, wh, y[..., 4:]), -1)                z.append(y.view(bs, -1, self.no))        return x if self.training else (torch.cat(z, 1), x)

特点

模型给出的目标cls较高,需要将conf的阈值设置较大(0.4),不然准确率较低

对于少样本的检测效果较好,准确率的提升比召回率多

准确率的提升比召回率多,

该改进不如上面的模型提升多,但是参数量小,计算量小少9Gflop,占用显存少

decoupled head指标提升的原因:由于yolov5s原本的head不能完全的提取featuremap中的信息,decoupled head能够较为充分的提取featuremap的信息;

关于“yolov5中head怎么修改为decouple head”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: yolov5中head怎么修改为decouple head

本文链接: https://lsjlt.com/news/340705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • yolov5中head怎么修改为decouple head
    这篇文章主要介绍“yolov5中head怎么修改为decouple head”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“yolov5中head怎么修改为decouple hea...
    99+
    2023-07-02
  • yolov5中head修改为decouple head详解
    目录yolox的decoupled head结构对于decouple head的改进特点疑问总结yolov5的head修改为decouple head yolox的decoupled...
    99+
    2024-04-02
  • Linux中怎么配置Dual Head
    这期内容当中小编将会给大家带来有关Linux中怎么配置Dual Head,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。修改 xorg.conf大部分可以使用自动生成的 xorg.conf, 需要更改的是 ...
    99+
    2023-06-17
  • Linux中head命令怎么使用
    今天就跟大家聊聊有关Linux中head命令怎么使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。head命令将每个文件的前10行打印到标准输出。对于多个文件,在每个文件前面加上一个...
    99+
    2023-06-28
  • js放到head中失效怎么办
    小编给大家分享一下js放到head中失效怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.今天写js碰到一个奇怪的问题,写...
    99+
    2024-04-02
  • Elasticsearch中的Head插件怎么使用
    本篇内容主要讲解“Elasticsearch中的Head插件怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch中的Head插件怎么使用”吧!Elasticsearc...
    99+
    2023-06-27
  • head和tail命令怎么在Linux中使用
    head和tail命令怎么在Linux中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10...
    99+
    2023-06-09
  • Android中怎么利用RecycleView添加head配置
    这篇文章给大家介绍Android中怎么利用RecycleView添加head配置,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实例代码:package com.wwl.android;  ...
    99+
    2023-05-30
    android recycleview head
  • 怎么将yolov5中的PANet层改为BiFPN
    今天小编给大家分享一下怎么将yolov5中的PANet层改为BiFPN的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Ad...
    99+
    2023-07-02
  • 华为云服务器修改密码怎么修改
    如果您的华为云服务器是使用密码来保护用户的数据,那么您可以通过以下方法来修改它的登录密码: 登录华为云服务器后,使用浏览器访问“账户与安全”页面,然后在“密码与安全设置”中找到“登录时强制登录”选项,点击它。 接下来,选择“强制登录”选...
    99+
    2023-10-26
    华为 修改密码 服务器
  • ubuntu怎么修改语言环境为中文
    要将Ubuntu的语言环境修改为中文,请按照以下步骤操作:1. 打开“设置”应用程序。你可以在左上角的应用程序启动器中找到它,它的图...
    99+
    2023-10-08
    ubuntu
  • win11的excel语言怎么修改为中文
    这篇文章主要介绍“win11的excel语言怎么修改为中文”,在日常操作中,相信很多人在win11的excel语言怎么修改为中文问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win11的excel语言怎么修改...
    99+
    2023-07-01
  • 华为云服务器修改密码怎么修改啊
    如果您的华为云服务器忘记了原始密码,您可以尝试以下步骤进行密码重置: 在华为云服务控制台上,输入“登录华为云”的账号和密码,然后点击“密码重置”选项。 在弹出的重置密码页面中,输入旧密码和新密码,同时勾选“使用两次相同的密码以确保安全性...
    99+
    2023-10-26
    华为 修改密码 服务器
  • MySQL数据库中怎么修改引擎为INNODB
    MySQL数据库中怎么修改引擎为INNODB,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  对于MySQL数据库,如果你要使...
    99+
    2024-04-02
  • 华为云服务器修改密码怎么修改不了
    如果您无法修改华为云服务器密码,以下是一些可能有用的步骤: 确认正确的账户信息:您必须提供正确的华为云服务器账号和密码,以使其他人可以访问您的数据。请确保输入的账户信息与您正在使用的账户名称一致。 检查服务器配置:请您确认您的华为云服务...
    99+
    2023-10-26
    华为 修改密码 服务器
  • 华为云服务器修改密码怎么改
    如果您的华为云服务器是使用密码来保护用户的数据,您可以按照以下步骤进行操作: 确认您的用户名和密码是否与您服务器上使用的用户名和密码匹配。 登录到服务器,选择“我的账户”选项卡。 选择“更改用户密码”选项,以便管理员可以修改您的账户。 ...
    99+
    2023-10-26
    华为 怎么改 修改密码
  • 在mysql怎么修改表为外键
    在mysql修改表为外键的示例:country 表是父表,country_id是主键,city是子表,外键为country_id,和country表的主键country_id对应,在创建表的时候添加外键,示例:create tab...
    99+
    2024-04-02
  • 怎么在MySQL中将字符集utf8修改为utf8mb4
    本篇文章给大家分享的是有关怎么在MySQL中将字符集utf8修改为utf8mb4,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。[client]...
    99+
    2024-04-02
  • centos7怎么修改系统语言为简体中文
    这篇文章主要介绍“centos7怎么修改系统语言为简体中文”,在日常操作中,相信很多人在centos7怎么修改系统语言为简体中文问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”centos7怎么修改系统语言为简...
    99+
    2023-06-05
  • 华为云服务器修改密码怎么修改啊苹果
    如果您想要更改苹果手机上的 AleID 密码,您可以按照以下步骤操作: 进入苹果官方网站(https://account.microsoft.com/store/APPLE/identity/AleID_password)。 在登录页面...
    99+
    2023-10-26
    华为 修改密码 苹果
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作