YOLOv5算法改进(16)— 增加小目标检测层

news2024/11/19 9:23:36

前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效果不佳,根据一些论文,我们可以通过增加检测层来提高对小目标的特征提取能力,以提高算法在密集场景下的表现。🌈 

 前期回顾:

          YOLOv5算法改进(1)— 如何去改进YOLOv5算法

          YOLOv5算法改进(2)— 添加SE注意力机制

          YOLOv5算法改进(3)— 添加CBAM注意力机制

          YOLOv5算法改进(4)— 添加CA注意力机制

          YOLOv5算法改进(5)— 添加ECA注意力机制

          YOLOv5算法改进(6)— 添加SOCA注意力机制

          YOLOv5算法改进(7)— 添加SimAM注意力机制

          YOLOv5算法改进(8)— 替换主干网络之MobileNetV3

          YOLOv5算法改进(9)— 替换主干网络之ShuffleNetV2

          YOLOv5算法改进(10)— 替换主干网络之GhostNet

          YOLOv5算法改进(11)— 替换主干网络之EfficientNetv2

          YOLOv5算法改进(12)— 替换主干网络之Swin Transformer

          YOLOv5算法改进(13)— 替换主干网络之PP-LCNet

          YOLOv5算法改进(14)— 更换Neck之BiFPN

          YOLOv5算法改进(15)— 更换Neck之AFPN

          目录

🚀1.小目标检测介绍

💥💥1.1 小目标定义

💥💥1.2 小目标检测难点

💥💥1.3 小目标检测意义

💥💥1.4 YOLOv5中的小目标检测

🚀2.增加小目标检测层的方法

💥💥2.1 网络结构

💥💥2.2 添加步骤

💥💥步骤1:创建自定义yaml文件

💥💥步骤2:验证是否添加成功

🚀1.小目标检测介绍

💥💥1.1 小目标定义

🍀(1)以目标检测领域的通用数据集COCO为例,小目标是指小于32×32个像素点(中目标是指32×32 ~ 96×96,大目标是指大于96×96);

🍀(2)在实际应用场景中,通常更倾向于使用相对于原图的比例来定义,比如物体标注框的长宽乘积,除以整个图像的长宽乘积,再开根号,如果结果小于3%,就称之为小目标。

💥💥1.2 小目标检测难点

🍀(1)包含小目标的样本数量较少,这样潜在的让目标检测模型更关注中大目标的检测;

🍀(2)由于小目标覆盖的区域更小,这样小目标的位置会缺少多样性。我们推测这使得小目标检测的在验证时的通用性变得很难。

💥💥1.3 小目标检测意义

小目标检测的意义在于它可以提高技术的应用范围,同时可以帮助大家更好地理解图像中的细节信息。此外,小目标检测其实在我们日常生活中的许多领域均有广泛的应用,例如交通监控、医学影像分析、无人机航拍等。🌴

举个例子:

交通监控领域,小目标检测可用于识别交通信号灯、车牌等;

医学影像分析领域,小目标检测可用于识别微小的肿瘤细胞等;

自动驾驶领域,小目标检测可用于识别微小的障碍物,以弥补激光雷达难以探测的窘况。

等等......🍉 🍓 🍑 🍈 🍌 🍐 

💥💥1.4 YOLOv5中的小目标检测

针小目标检测,YOLOv5的效果可能不好的原因是由于小目标样本的尺寸较小,而YOLOv5模型的下采样倍数较大,导致较深的特征图难以学习到小目标的特征信息。为了改善这个问题,可以考虑在YOLOv5模型中增加小目标检测层,将较浅的特征图与深特征图拼接后进行检测。🍄

这种方式实现简单有效,只需要修改YOLOv5模型文件的yaml即可增加小目标检测层。然而,增加检测层后会带来计算量的增加,从而导致推理检测的速度降低。但是对于小目标的检测,这种改进确实能够取得良好的效果。


🚀2.增加小目标检测层的方法

💥💥2.1 网络结构

YOLOv5 - 5.0网络结构图:

YOLOv5 - 6.0网络结构图:

YOLOv5 - 5.0YOLOv5 - 6.0网络结构图可知,都是由输入端+主干网络Backbone+Neck网络+输出端四部分组成的。

关于YOLOv5的相关知识,请参考文章:👇

YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解

由网络结构图可知,YOLOv5原始只有3个检测头,分别是20×20(大目标)40×40(中目标)80×80(小目标),我们要增加小目标检测层,可以在80×80(小目标)的上面增加,也就是增加160×160检测层🌱

YOLOv5s模型只有3个预测层,当将尺寸为640×640的图像输入网络时,Neck 网络分别进行8倍16倍32倍下采样,对应的预测层特征图尺寸为80×8040×4020×20,用来检测小目标、中目标和大目标。在YOLOv5s原始网络上增加一个预测层,在Neck网络中增加1次上采样,第3次上采样后,与主干网络第2层融合,得到新增加的160×160的预测层,用以检测小目标。整个模型改进后采用4个预测尺度的预测层,将底层特征高分辨率和深层特征高语义信息充分利用,并且未显著增加网络复杂度。🌄

当增加了一层之后,网络结构就变成下面这样子了。👇

YOLOv5 - 5.0版本:

YOLOv5 - 6.0版本:

说明:♨️♨️♨️

上图中,红框部分为新增的检测层,随着箭头往上走,将Neck网络中80×80的特征图经过上采样变成160×160。

💥💥2.2 添加步骤

💥💥步骤1:创建自定义yaml文件

models文件夹中复制yolov5s.yaml,粘贴并重命名为yolov5s_SmallTarget.yaml

针对增加小目标检测层,我们需要做两处修改。

修改1:

🍀(1)修改Anchor:增加一组较小的anchor

#---原始的anchors--#
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

若输入图像的尺寸是640×640

# P3/8     对应的检测特征图大小为 80×80,用于检测大小在 8×8 以上的目标。

# P4/16   对应的检测特征图大小为 40×40,用于检测大小在 16×16 以上的目标。

# P5/32   对应的检测特征图大小为 20×20,用于检测大小在 32×32 以上的目标。

#---修改后的anchors---#
anchors:
  - [4,5, 8,10, 22,18]   #  P2/4
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

 # P2/4     新增加的anchors,对应的检测特征图大小为 160×160,用于检测大小在 4×4 以上的目标。

修改2:

YOLOv5中的head包括 Neck Detect(输出端) 两部分。修改head部分,增加一层网络结构。

#---原始的head部分---#
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13
 
   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)
 
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)
 
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
 
   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

修改后的head部分如下所示:

#---修改后的head部分---#
head:
#neck
  #[512,20,20]
  [[-1, 1, Conv, [512, 1, 1]],  #10  卷积层  [512,20,20]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #11  上采样 [512,40,40]
   [[-1, 6], 1, Concat, [1]],      #12 Concat [1024,40,40]
 
   [-1, 3, C3, [512, False]],      #13 C3  [512,40,40]
   [-1, 1, Conv, [256, 1, 1]],     #14  卷积层  [256,40,40]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #15  上采样 [256,80,80]
   [[-1, 4], 1, Concat, [1]], #16 Concat  [512,80,80]
   #[-1, 3, C3, [256, False]],  # 被删了
 
   #下面是我们自己加的
   [-1, 3, C3, [256, False]], #17  C3 [256,80,80]
   [-1, 1, Conv, [128, 1, 1]], #18  卷积层  [128,80,80]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   #19 上采样 [256,160,160]
   [[-1, 2], 1, Concat, [1]],  #20 Concat [512,160,160]
 
   #head
   [-1, 3, C3, [128, False]],  #21  C3 [128,160,160]
   [-1, 1, Conv, [128, 3, 2]], #22  卷积层  [128,80,80]
   [[-1, 18], 1, Concat, [1]], #23  Concat [512,160,160]
   [-1, 3, C3, [256, False]],  #24   C3  [256,160,160]
   [-1, 1, Conv, [256, 3, 2]],  #25  卷积层 [256,40,40]
   [[-1, 14], 1, Concat, [1]],  #26 Concat [512,160,160]
 
   [-1, 3, C3, [512, False]],  #27 C3  [512,40,40]
   [-1, 1, Conv, [512, 3, 2]], #28  卷积层 [512,20,20]
   [[-1, 10], 1, Concat, [1]],  #29  特征融合 [1024,20,20]
   [-1, 3, C3, [1024, False]],  #30 C3  [1027,20,20]
 
   [[21, 24, 27, 30], 1, Detect, [nc, anchors]],  # 将21, 24, 27, 30传入检测头
  ]

yaml文件修改后的完整代码如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
 
# Parameters
nc: 80
depth_multiple: 0.67
width_multiple: 0.75
 
anchors:
  - [4,5, 8,10, 22,18]   #  P2/4
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32
 
# YOLOv5 v6.0 backbone
backbone:
   [[-1, 1, Conv, [64, 6, 2, 2]],  #0 卷积层 [64,320,320 ]
   [-1, 1, Conv, [128, 3, 2]], #1   卷积层 [128,160,160]
   [-1, 3, C3, [128]],         #2   C3 [128,160,160]
 
   [-1, 1, Conv, [256, 3, 2]], #3   卷积层 [256,80,80]
   [-1, 6, C3, [256]],         #4   C3 [256,80,80]
 
   [-1, 1, Conv, [512, 3, 2]],  #5  卷积层 [512,40,40]
   [-1, 9, C3, [512]],          #6 C3 [512,40,40]
 
   [-1, 1, Conv, [1024, 3, 2]], #7  卷积层 [1024,20,20]
   [-1, 3, C3, [1024]],         #8  C3 [1024,20,20]
   [-1, 1, SPPF, [1024, 5]],    #9 SPPF  [1024,20,20]
  ]
 
head:
#neck
  #[512,20,20]
  [[-1, 1, Conv, [512, 1, 1]],  #10  卷积层  [512,20,20]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #11  上采样 [512,40,40]
   [[-1, 6], 1, Concat, [1]],      #12 Concat [1024,40,40]
 
   [-1, 3, C3, [512, False]],      #13 C3  [512,40,40]
   [-1, 1, Conv, [256, 1, 1]],     #14  卷积层  [256,40,40]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #15  上采样 [256,80,80]
   [[-1, 4], 1, Concat, [1]], #16 Concat  [512,80,80]
   #[-1, 3, C3, [256, False]],  # 被删了
 
   #下面是添加的
   [-1, 3, C3, [256, False]], #17  C3 [256,80,80]
   [-1, 1, Conv, [128, 1, 1]], #18  卷积层  [128,80,80]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   #19 上采样 [128,160,160]
   [[-1, 2], 1, Concat, [1]],  #20 Concat [512,160,160]
 
   #head
   [-1, 3, C3, [128, False]],  #21  C3 [128,160,160]
   [-1, 1, Conv, [128, 3, 2]], #22  卷积层  [128,80,80]
   [[-1, 18], 1, Concat, [1]], #23  Concat [512,160,160]
   [-1, 3, C3, [256, False]],  #24   C3  [256,160,160]
   [-1, 1, Conv, [256, 3, 2]],  #25  卷积层 [256,40,40]
   [[-1, 14], 1, Concat, [1]],  #26 Concat [512,160,160]
 
   [-1, 3, C3, [512, False]],  #27 C3  [512,40,40]
   [-1, 1, Conv, [512, 3, 2]], #28  卷积层 [512,20,20]
   [[-1, 10], 1, Concat, [1]],  #29  特征融合 [1024,20,20]
   [-1, 3, C3, [1024, False]],  #30 C3  [1027,20,20]
 
   [[21, 24, 27, 30], 1, Detect, [nc, anchors]],  # 将21, 24, 27, 30传入检测头
  ]
 

💥💥步骤2:验证是否添加成功

yolo.py文件里,配置我们刚才自定义的yolov5s_SmallTarget.yaml

然后运行yolo.py,得到结果。👇

这样就算添加成功了。🎉🎉🎉  


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

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

相关文章

[管理与领导-85]:IT基层管理者 - 核心技能 - 高效执行力 - 10 - 高效执行力的9个段位

目录 前言: 一段:准确执行,快速反应,坚决执行 (态度很重要) 二段:结果导向 苦劳过后,有功劳(有结果很重要) 三段:有始有终 主动反馈、有始有终…

Prometheus 监控指南:如何可靠地记录数字时间序列数据

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…

《TCP/IP网络编程》阅读笔记--多播与广播

目录 1--多播 2--多播代码实例 3--广播 4--广播代码实例 1--多播 多播方式的数据传输是基于 UDP 完成的,多播数据包的格式与 UDP 数据包相同; 多播与 UDP 的区别:UDP 数据传输以单一目标进行,多播数据同时传递到加入&#xff…

【数据结构】红黑树的插入与验证

文章目录 一、基本概念1.时代背景2. 基本概念3.基本性质 二、实现原理1. 插入1.1变色1.2旋转变色①左旋②右旋③右左双旋④左右双旋 2.验证 源码总结 一、基本概念 1.时代背景 1972年鲁道夫拜尔(Rudolf Bayer)发明了一种数据结构,这是一种特殊的B树4阶情况。这些树…

基于SSM的学生公寓管理中心系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Geotif.js读取tif元信息相关问题记录

起因是使用OL加载COG时,出现了不指定sources的max就一片黑的情况,所以需要读取tif真实波段值范围而不是靠比例设置颜色了。 使用geotiff.js可以读取tif的元信息,但当tif没有GDAL_METADATA这个key时就读不出来 然后找到了这个 乍一看简直完美…

普中 51 单片机点亮LED灯

普中 51 单片机 (STC89C52RC) LED / IO 将LED1进行闪烁操作 为啥要进行延时操作?依据人的肉眼余晖效应, 延时时间不能太短,否则就无法观察到 LED 闪烁 #include "reg52.h" typedef unsigned int u16; //对…

【Linux】Base64编码

Mz1 对这3个字符进行一个Base64编码理解,把他化为2进制数据,在以6个位为单位分割,然后用这个16进制化为10进制,查表得出阿斯卡码对应的字符,那么这个字符就是base64编码,因为64个字符有64阿斯卡码。 相关截…

SpringBoot学习笔记(项目创建,yaml,多环境开发,整合mybatis SMM)

一、SpringBoot入门 1.1 SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。 Spring程序缺点:配置繁琐,依赖设置繁琐。SpringBoot程序优点:自动装配&#xff0c…

列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>

目录 事件起因环境和工具解决办法结束语 事件起因 在写一个市级的项目时,遇到了一个问题,这个项目涉及的数据内容非常大,光是数据库文件的大小就已经达到了12G,数据的规模大致是在百万级的,光是我这次参与处理的数据就…

led灯白光和暖光哪个对眼睛好?最适合孩子开学使用的护眼台灯

什么样的光更适合阅读呢?从生物学的角度上讲是早上的自然光。一方面是因为早晨的光照使得人体内在的生物钟和外界24h亮暗循环同步。如果生理节律被打乱,早晨明亮的光照可以帮助恢复正常的生理节律。另一方面是其物理特性,自然光漫射效果较好&…

基于springboot+vue的加盟店管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

零碎改动(ES6+)

这里写自定义目录标题 let 和 const幂运算字符串新增API let 和 const ES6建议不再使用var定义变量,而使用let定义变量,const定义常量 let a 1; // 使用 let 定义变量 a 2; // 变量的值是可修改的const b 1; // 使用 const 定义常量 b 2; // ❌ 报…

4. HBase必知必会之理论基础篇

HBase必知必会理论基础篇 1.1 HBase简介1.2 HBase 数据模型1.3 HBase整体架构1.4 HBase 读写流程1.4.1 客户端读取流程1.4.2 客户端写入流程 1.5 HBase 客户端常用的方法1.5.1 scan查询1.5.2 get查询1.5.3 put查询1.5.4 delete 查询1.5.5 append 查询1.5.6 increment查询 1.6 H…

SB树,看这一篇就够了

算法拾遗三十九SB树及跳表 SB树SB树四种违规类型总结 SB树Code 跳表 SB树 SB树是基于搜索二叉树来的,也有左旋和右旋的操作,只是不同于AVL树,它也有它自己的一套平衡性方法。 任何以叔叔节点为头的子树的节点个数不小于自己任何一个侄子树的…

【PAT】攀拓(PAT)- 程序设计(甲级)2023年夏季考试自测

个人学习记录,代码难免不尽人意。 今天又斥资巨款买了PAT甲级2023年夏季的考试真题做了做,得分 95,还买了时光机,在当时排名42名。总的来说还是比较满意的!有些地方当时做的时候卡住了但是后面回过头来重新想的时候还是…

小程序环境搭建

第一种:微信开发者工具 1. 微信公众平台注册小程序 注册类型选择‘个人’即可,‘企业’需要公司相关信息(企业信用代码、法人信息等) 注册成功后,在‘开发’-‘开发管理’-‘开发设置’中找到AppID 并纪录。 2. …

关于前端就业前景的一点看法

一、前言 最近,很多人在知乎上鼓吹前端未来会没掉的概念。在此我想说这个说法并不真实,而是一种极端的观点。 事实上,前端开发在当今的互联网行业中扮演着至关重要的角色,它是构建 Web 应用程序所必需的一部分,能够实现…

高速电路设计-----第二章

本章主要讲解的是电阻、电容、电感的选型。 一、电阻:关键还是限流。 1、通常在电源滤波时除了LC外,还会串接一个R。目的是为了降低信号的Q值,防止信号失真。常用于失真电源滤波。 2、选型的电阻的封装太小,电路的电流超过电阻能…

让你不再惧怕内存优化

原文链接 让你不再惧怕内存优化 之前曾经写过一篇关于如何做性能优化的文章,现在针对内存这一专项再做精细化的讨论。对于安卓应用开发来说,内存究竟会遇到什么样的问题,有什么方法可以用来测试和分析,以及有什么样的策略可以去实…