YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

news2025/1/19 3:26:48

  一、本文介绍

本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块特征融合模块。其可以起到特征选择的作用,非常适合轻量化的读者来使用,其存在二次创新和多次创新的机会,利用该结构参数量下降了约100W,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家,同时本专栏目前改进基于yolov9.yaml文件,后期如果官方放出轻量化版本,专栏内所有改进也会同步更新,请大家放心。

欢迎大家订阅我的专栏一起学习YOLO! 

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

目录

  一、本文介绍

二、HS-FPN原理

2.1  HS-FPN的基本原理

2.2  SSF模块

三、HS-FPN的核心代码

四、手把手教你添加HS-FPN 

4.1 HS-FPN添加步骤

4.1.1 修改一

4.1.2 修改二

4.1.3 修改三 

4.1.4 修改四

4.2 HS-FPN的yaml文件和训练截图

4.2.1 HS-FPN的yaml版本一(推荐)

4.2.2 HS-FPN的yaml版本二

4.2 HS-FPN的训练过程截图 

五、本文总结


二、HS-FPN原理

dc5fc59fbdae4c919232c28df8009d0f.png

论文地址:论文官方链接

代码地址:代码官方链接

610b78849060477ca986c2d71398cf80.png


2.1  HS-FPN的基本原理

HS-FPN(High-level Screening-feature Fusion Pyramid Networks)是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块特征融合模块

HS-FPN的结构如下图所示,包括两个主要组成部分:

2eafc944fb234fc5b384934ecd97a0a8.png

1. 特征选择模块:该模块利用通道注意力(CA)和维度匹配(DM)机制对不同尺度的特征图进行筛选。通过池化操作(如全局平均池化和全局最大池化)和权重计算,该模块有效地提取了每个通道中的重要信息。

2. 特征融合模块:该模块通过选择性特征融合(SFF)机制将筛选后的低级特征和高级特征结合起来。高级特征扩展后,通过双线性插值或转置卷积进行尺度调整,然后与低级特征融合,从而增强模型对白细胞特征的表达能力。

总的来说,HS-FPN通过这两个模块协同工作,有效地解决了白细胞检测中的多尺度问题,提高了检测的准确性和鲁棒性。


2.2  SSF模块

选择性特征融合(Selective Feature Fusion, SFF)是HS-FPN网络中的一个关键组件,它的主要作用是融合不同尺度的特征图。SFF通过使用高级特征作为权重来过滤低尺度特征中的重要信息。在这个过程中,高级特征经过转置卷积和双线性插值操作进行尺度调整,以匹配低尺度特征的尺寸。然后,利用高级特征作为注意力权重,筛选出低尺度特征中有用的信息。这种融合方法能够有效地结合高级特征的语义信息和低尺度特征的细节信息,从而提高模型在处理多尺度问题时的性能。

 下图为大家展示了SFF模块的框架结构:

4ab051fb7d174d31add86d1ac4ad0e7d.png

给定一个输入高级特征eq?f_%7Bhigh%7D%5Cepsilon%20R%5E%7BC*H*W%7D和一个输入低尺度特征eq?f_%7Blow%7D%5Cepsilon%20R%5E%7BC*H*W_%7B1%7D%7D,高级特征首先使用一个大小为2,核大小为3x3的转置卷积(T-Conv)进行扩展,得到特征大小eq?f_%7Bhigh%7D%5Cepsilon%20R%5E%7BC*2H*2W%7D

然后,为了统一高级特征和低尺度特征的维度,作者使用双线性插值来向上或向下采样高级特征,得到特征eq?f_%7Batt%7D%5Cepsilon%20R%5E%7BC*H_%7B1%7D*W_%7B1%7D%7D。接下来,使用CA模块将高级特征转换为相应的注意力权重,以过滤低尺度特征,在获得具有相同维度的特征后。

最后,将过滤后的低尺度特征与高级特征融合,以增强模型的特征表示,并得到eq?f_%7Bout%7D%5Cepsilon%20R%5E%7BC*H_%7B1%7D*W_%7B1%7D%7D。方程(1)和(2)说明了特征选择的融合过程:

65f82ddf139441b29ef26fd1349271af.png


三、HS-FPN的核心代码

这里的CA对应着官方代码中的ChannelAttention,但是在早期的库里面它在官方里面已经集成了,导入过来可能名字重复从而导致使用的时候报错,我这里给改写成CA了,大家看官方代码的时候需要注意下。

import torch
import torch.nn as nn
import torch.nn.functional as F


__all__ = ['CA', 'multiply', 'Add']


class Add(nn.Module):
    # Concatenate a list of tensors along dimension
    def __init__(self, ch=256):
        super().__init__()

    def forward(self, x):
        input1, input2 = x[0], x[1]
        x = input1 + input2
        return x


class multiply(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        x = x[0] * x[1]
        return x

class CA(nn.Module):
    def __init__(self, in_planes, ratio = 4, flag=True):
        super(CA, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.conv1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
        self.flag = flag
        self.sigmoid = nn.Sigmoid()

        nn.init.xavier_uniform_(self.conv1.weight)
        nn.init.xavier_uniform_(self.conv2.weight)

    def forward(self, x):
        avg_out = self.conv2(self.relu(self.conv1(self.avg_pool(x))))
        max_out = self.conv2(self.relu(self.conv1(self.max_pool(x))))
        out = avg_out + max_out
        out = self.sigmoid(out) * x if self.flag else self.sigmoid(out)
        return out



class FeatureSelectionModule(nn.Module):
    def __init__(self, in_chan, out_chan):
        super(FeatureSelectionModule, self).__init__()
        self.conv_atten = nn.Conv2d(in_chan, in_chan, kernel_size=1)
        self.group_norm1 = nn.GroupNorm(32, in_chan)
        self.sigmoid = nn.Sigmoid()
        self.conv = nn.Conv2d(in_chan, out_chan, kernel_size=1)
        self.group_norm2 = nn.GroupNorm(32, out_chan)
        nn.init.xavier_uniform_(self.conv_atten.weight)
        nn.init.xavier_uniform_(self.conv.weight)

    def forward(self, x):
        atten = self.sigmoid(self.group_norm1(self.conv_atten(F.avg_pool2d(x, x.size()[2:]))))
        feat = torch.mul(x, atten)
        x = x + feat
        feat = self.group_norm2(self.conv(x))
        return feat


if __name__ == "__main__":
    # Generating Sample image
    image_size = (1, 64, 240, 240)
    image = torch.rand(*image_size)

    # Model
    mobilenet_v3 = FeatureSelectionModule(64, 64)

    out = mobilenet_v3(image)
    print(out.size())


四、手把手教你添加HS-FPN 

4.1 HS-FPN添加步骤

4.1.1 修改一

首先我们找到如下的目录'yolov9-main/models',然后在这个目录下在创建一个新的目录然后这个就是存储改进的仓库,大家可以在这里新建所有的改进的py文件,对应改进的文件名字可以根据你自己的习惯起(不影响任何但是下面导入的时候记住改成你对应的即可),然后将HS-FPN 的核心代码复制进去。


4.1.2 修改二

然后在新建的目录里面我们在新建一个__init__.py文件(此文件大家只需要建立一个即可),然后我们在里面添加导入我们模块的代码。注意标记一个'.'其作用是标记当前目录。


4.1.3 修改三 

然后我们找到如下文件''models/yolo.py''在开头的地方导入我们的模块按照如下修改->

(如果你看了我多个改进机制此处只需要添加一个即可,无需重复添加)

注意的添加位置要放在common的导入上面!!!!!

5af82969538846b0ad386aa4acd733dd.png​​​​


4.1.4 修改四

然后我们找到''models/yolo.py''文件中的parse_model方法,按照如下修改->

3b5e1471ac054f6c8e50ffd57a080b7a.png

        elif m in {'此处添加大家修改的对应机制即可'}:
            c2 = ch[f]
            args = [c2, *args]
        elif m is multiply:
            c2 = ch[f[0]]
        elif m is Add:
            c2 = ch[f[-1]]

到此就修改完成了,复制下面的ymal文件即可运行。


4.2 HS-FPN的yaml文件和训练截图

4.2.1 HS-FPN的yaml版本一(推荐)

下面的添加HS-FPN是我实验结果的版本,这个版本为官方一比一复现的版本。

# YOLOv9

# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()

# anchors
anchors: 3

# YOLOv9 backbone
backbone:
  [
   [-1, 1, Silence, []],
   # conv down
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2
   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4
   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3
   # conv down
   [-1, 1, Conv, [256, 3, 2]],  # 4-P3/8
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 6-P4/16
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 8-P5/32
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9
  ]

# YOLOv9 head
head:
  [
   # elan-spp block
   [-1, 1, SPPELAN, [512, 256]],  # 10

   [ -1, 1, CA, [ ] ], # 11
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 12
   [ -1, 1, RepNCSPELAN4, [256, 256, 128, 1] ], # 13 P5

   [ 7, 1, CA, [ ] ],
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ],  # 15

   [ 12, 1, nn.ConvTranspose2d, [ 256, 3, 2, 1, 1 ] ], # 16
   [ -1, 1, CA, [ 4, False ] ],
   [ [ -1, 15 ], 1, multiply, [ ] ], # 18
   [ [ -1, 16 ], 1, Add, [ ] ], # 19
   [ -1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 20 P4

   [ 5, 1, CA, [ ] ], # 21
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 22

   [ 16, 1, nn.ConvTranspose2d, [ 256, 3, 2, 1, 1 ] ], # 23
   [ -1, 1, CA, [ 4, False ] ], # 24
   [ [ -1, 22 ], 1, multiply, [ ] ], # 25
   [ [ -1, 23 ], 1, Add, [ ] ], # 26
   [ -1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 27 P3

   # routing + 5
   [5, 1, CBLinear, [[256]]], # 28
   [7, 1, CBLinear, [[256, 512]]], # 29
   [9, 1, CBLinear, [[256, 512, 512]]], # 30
   
   # conv down
   [0, 1, Conv, [64, 3, 2]],  # 31-P1/2

   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 32-P2/4

   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 33

   # conv down fuse
   [-1, 1, Conv, [256, 3, 2]],  # 34-P3/8
   [[28, 29, 30, -1], 1, CBFuse, [[0, 0, 0]]], # 35

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 36

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 37-P4/16
   [[29, 30, -1], 1, CBFuse, [[1, 1]]], # 38

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 39

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 40-P5/32
   [[30, -1], 1, CBFuse, [[2]]], # 41

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 42

   # detect
   [[36, 39, 42, 13, 20, 27], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]


4.2.2 HS-FPN的yaml版本二

添加的版本二具体那种适合你需要大家自己多做实验来尝试,此版本把通道数改回了YOLOv5的版本。

# YOLOv9

# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()

# anchors
anchors: 3

# YOLOv9 backbone
backbone:
  [
   [-1, 1, Silence, []],
   # conv down
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2
   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4
   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3
   # conv down
   [-1, 1, Conv, [256, 3, 2]],  # 4-P3/8
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 6-P4/16
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 8-P5/32
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9
  ]

# YOLOv9 head
head:
  [
   # elan-spp block
   [-1, 1, SPPELAN, [512, 256]],  # 10

   [ -1, 1, CA, [ ] ], # 11
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 12
   [ -1, 1, RepNCSPELAN4, [256, 256, 128, 1] ], # 13 P5

   [ 7, 1, CA, [ ] ],
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ],  # 15

   [ 12, 1, nn.ConvTranspose2d, [ 256, 3, 2, 1, 1 ] ], # 16
   [ -1, 1, CA, [ 4, False ] ],
   [ [ -1, 15 ], 1, multiply, [ ] ], # 18
   [ [ -1, 16 ], 1, Add, [ ] ], # 19
   [ -1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 20 P4

   [ 5, 1, CA, [ ] ], # 21
   [ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 22

   [ 16, 1, nn.ConvTranspose2d, [ 256, 3, 2, 1, 1 ] ], # 23
   [ -1, 1, CA, [ 4, False ] ], # 24
   [ [ -1, 22 ], 1, multiply, [ ] ], # 25
   [ [ -1, 23 ], 1, Add, [ ] ], # 26
   [ -1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 27 P3

   # routing + 5
   [5, 1, CBLinear, [[256]]], # 28
   [7, 1, CBLinear, [[256, 512]]], # 29
   [9, 1, CBLinear, [[256, 512, 512]]], # 30
   
   # conv down
   [0, 1, Conv, [64, 3, 2]],  # 31-P1/2

   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 32-P2/4

   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 33

   # conv down fuse
   [-1, 1, Conv, [256, 3, 2]],  # 34-P3/8
   [[28, 29, 30, -1], 1, CBFuse, [[0, 0, 0]]], # 35

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 36

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 37-P4/16
   [[29, 30, -1], 1, CBFuse, [[1, 1]]], # 38

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 39

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 40-P5/32
   [[30, -1], 1, CBFuse, [[2]]], # 41

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 42

   # detect
   [[36, 39, 42, 13, 20, 27], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]


4.2 HS-FPN的训练过程截图 

大家可以看下面的运行结果和添加的位置所以不存在我发的代码不全或者运行不了的问题大家有问题也可以在评论区评论我看到都会为大家解答(我知道的)。

​​​​​​


五、本文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv9改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

希望大家阅读完以后可以给文章点点赞和评论支持一下这样购买专栏的人越多群内人越多大家交流的机会就更多了。  

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

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

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

相关文章

vue快速入门(三十一)vscod开发vue需要下载的插件

步骤很详细,直接上教程 上一篇 暂时就这两样足矣,有新的以后再更新(别下载太多,可能会冲突) 测试一下: 提示功能: 代码补全功能:

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下,虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同,虚拟试衣节省时间、方便客户,并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

第Y7周:训练自己的数据集

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录 一、下载YOLOv8 二、配置环境 三、准备工作 四、运行 出现报错:…

《QT实用小工具·三十一》基于QT开发的访客管理平台demo2

1、概述 源码放在文章末尾 该项目为访客管理平台demo,包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下: #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain…

使用不锈钢微型导轨的优势!

微型导轨是一种专门用于在紧凑空间内执行高精度的机器运动控制的导轨设备。其特点是尺寸小、精确度高、刚性好、平稳性好以及使用寿命长。微型导轨的材质种类多样,一般包括钢、不锈钢、铝合金等。目前来说,不锈钢材质的使用率最为频繁,那么使…

python中中英文打印对齐解决方案

在python中,有时候会出现中英文混合输出的情形,但是由于中文默认是全角格式(一个中文字符占用两个字符宽度),这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候,这种差异会导致文…

揭秘网红主播美颜工具:探秘美颜SDK的技术奥秘

在如今的网络直播平台上,越来越多的主播通过美颜工具来提升自己的形象,吸引更多的粉丝和观众。美颜技术的不断发展使得主播们能够在镜头前展现出更加完美的容颜,让观众眼前一亮。 一、美颜SDK的概念 美颜SDK,即美颜软件开发工具…

Bert语言大模型基础

一、Bert整体模型架构 基础架构是transformer的encoder部分,bert使用多个encoder堆叠在一起。 主要分为三个部分:1、输入部分 2、注意力机制 3、前馈神经网络 bertbase使用12层encoder堆叠在一起,6个encoder堆叠在一起组成编码端&#xf…

存储过程的使用(一)

目录 不带参数的存储过程 创建一个存储过程,向数据表 dept 中插入一条记录 带 IN 参数的存储过程 在存储过程中接受来自外部的数值,在存储过程中判断该数值是否大于零并显示 输入一个编号,查询数据表emp中是否有这个编号,如果…

【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等

往期回顾 【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView(图文并茂超详细版本)-CSDN博客【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客 【QT进阶】Qt Web混合编程之使…

【Web】2022DASCTF Apr X FATE 防疫挑战赛 题解(全)

目录 warmup-php soeasy_php warmup-java warmup-php spl_autoload_register函数实现了当程序遇到调用没有定义过的函数时,会去找./class/函数名.php路径下的php文件,并把它包含在程序中。 拿到附件拖进Seay里自动审计一下 显然利用终点为evaluateExp…

【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录 写在前面Tag题目来源解题思路方法一:层序遍历方法二:深度优先搜索 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…

MySQL-使用CPP接入到MySQL

📟作者主页:慢热的陕西人 🌴专栏链接:MySQL 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容介绍如何在c/cpp代码连接和管理数据库 文章目录 MySQL-…

SpringBoot-自定义注解AOP实现及拦截器示例

SpringBoot-自定义注解AOP实现及拦截器示例 一、四大元注解 当你在编写自定义注解时,Target、Retention、Documented 和 Inherited 是四个你可能会用到的元注解,它们可以帮助你更好地定义和使用注解。 1、Target Target 注解用于指定注解可以应用的程…

响应式修改 页面字体字号【大 中 小 】

浅浅记录下&#xff0c;工作中遇到的问题&#xff0c;修改页面文本字号。 <p class"change_fontSize">[ 字号 <a href"javascript:doZoom(18)">大</a><a href"javascript:doZoom(16)">中</a><a href"ja…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

嘉立创EDA基础

一&#xff0c;原理图部分 &#xff08;1&#xff09;路径设置 打开嘉立创以后&#xff0c;在右上角点击设置 可以看到下图 左边栏所有工程为工程路径&#xff0c;常用库为库路径 &#xff08;2&#xff09;模式设置 同样点击设置&#xff0c;可以看到下面界面 下图为在线系…

【读点论文】YOLOX: Exceeding YOLO Series in 2021,无锚框单阶段目标检测方案,解耦检测头的分类和回归分支,优化标签分配策略

YOLOX: Exceeding YOLO Series in 2021 Abstract 在本报告中&#xff0c;我们介绍了YOLO系列的一些经验改进&#xff0c;形成了一种新的高性能探测器—YOLOX。我们将YOLO检测器切换到无锚方式&#xff0c;并进行其他先进的检测技术&#xff0c;即去耦头和领先的标签分配策略S…

【Java EE】依赖注入DI详解

文章目录 &#x1f334;什么是依赖注入&#x1f340;依赖注入的三种方法&#x1f338;属性注入(Field Injection)&#x1f338;构造方法注入&#x1f338;Setter注入&#x1f338;三种注入优缺点分析 &#x1f333;Autowired存在的问题&#x1f332;解决Autowired对应多个对象问…

Compose Canvas

文章目录 Compose Canvas概述Canvas属性drawPoints 绘制点drawPoints属性使用 drawLine 绘制线drawLine属性使用 drawRect 绘制矩形drawRect属性使用 drawRoundRect 绘制圆角矩形drawRoundRect属性使用 drawCircle 绘制圆drawCircle属性使用 drawOval 绘制椭圆drawOval属性使用…