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

前言: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.75anchors:- [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.rhkb.cn/news/129557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电容笔值不值得买?开学季比较好用的电容笔

眼看着新学期即将到来,到底应该选择什么样的电容笔?一款原装的苹果Pencil,就卖到了将近一千块,这对于很多人来说,都是一个十分昂贵的价格。事实上,由于平替电容笔的价格非常便宜,只要一二百元就…

Shell命令管理进程

Shell命令管理进程 列出进程 ps命令 top命令 管理后台进程 启动后台进程 查看后台进程 jobs和ps的区别 停止进程 Linux除了是一种多用户操作系统之外,还是一种多任务系统。多任务意味着可以同时运行多个程序。Linux 提供了相关的工具来列出运行中的进程,监视…

库的相关操作

目录 一、创建数据库 1,创建数据库规则 2、创建案例 二、字符集和校验规则 1、查看系统默认字符集以及校验规则 2、查看数据库支持的字符集以及校验规则 3、校验规则对数据库的影响 三、操纵数据库 1、查看数据库和目前所在数据库 2、显示创建语句 3、修改数据库 4、…

windows环境下node安装教程(超详细)

安装node.js 1、下载node: 下载地址:下载 | Node.js 中文网 node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路next就可以了 选择一中方式就可以 2、解压后的目录,或者mis安装后的目录如下: 3、安装完后,可以在命令行中输入…

c高级day4(9.11)shell脚本(case ....in语句,循环语句,select ...in和case...In结合,辅助控制关键字,函数)

1.实现一个对数组就和的函数,数组通过实参传递给函数 2.写一个函数,输出当前用户的uid和gid,并使用变量接收结果 #!/bin/bash read -a arr sum0 function add() { …

【易盾点选】

拿官网的点选做个例子吧,比较省事,水一篇~ ​ 官网的接口目前都改成V3了,多了个dt参数,以及加密的一个函数也变动了下 点选坐标在这,加密函数未变,用逗号拼接 整个加密里的函数变了,直接重新…

RedisJava基础代码实现

Jedis快速入门 <!--jedis--> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version> </dependency> <!--单元测试--> <dependency><groupId>org.ju…

人工智能AI 全栈体系(一)

第一章 神经网络是如何实现的 这些年人工智能蓬勃发展&#xff0c;在语音识别、图像识别、自然语言处理等多个领域得到了很好的应用。推动这波人工智能浪潮的无疑是深度学习。所谓的深度学习实际上就是多层神经网络&#xff0c;至少到目前为止&#xff0c;深度学习基本上是用神…

华为云云耀云服务器L实例评测|有关华为云云耀云服务器L实例你可能不知道的事情

前言 最近华为云推出了华为云云耀云服务器L实例。主打一个轻量级云服务器&#xff0c;即开即用&#xff0c;轻松运维&#xff0c;开启简单上云第一步。具有智能不卡顿&#xff0c;价优随心用&#xff0c;上手更简单&#xff0c;管理特省心。 在推出的第一时间我就买了一台来耍…

C高级day4

一、实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 二、写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 三、XMind思维导图

23062C++QTday4

仿照string类&#xff0c;完成myString 类 代码&#xff1a; #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造my…

【MySQL系列】视图特性

「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 视图1.1 视图概念1.2 创建视图1.3 修改互相影响1.4 删除视图1.5 视图规则和限制 视图 1.1 视图概念 视图是一个虚拟表&#xff0c;其内容由查询定义同真实的表一样…

零基础教程:使用yolov8训练无人机VisDrone数据集

1.准备数据集 1.先给出VisDrone2019数据集的下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1e2Q0NgNT-H-Acb2H0Cx8sg 提取码&#xff1a;31dl 2.将数据集VisDrone放在datasets目录下面 2.数据集转换程序 1.在根目录下面新建一个.py文件&#xff0c;取名叫…

【strcat函数和strncat函数的对比与模拟实现】

strcat函数和strncat函数的对比与模拟实现 1.strcat函数的介绍 资源来源于cplusplus网站 它的作用是&#xff1a; 将源字符串的副本追加到目标字符串。目标中的结束空字符被源的第一个字符覆盖&#xff0c;并且在由目标中的两个字符串串联形成的新字符串的末尾包含一个空字符…

序列到序列学习(seq2seq)

permute(1,0,2)&#xff0c;将batch_size 放在中间state 最后一个时刻&#xff0c;每个层的输出

一文看懂Java的类加载机制

前言 当我们运行Java程序时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;需要加载各种类文件&#xff0c;以执行程序中的代码。Java的类加载机制是Java语言的一个关键特性&#xff0c;它负责在运行时将类加载到内存中&#xff0c;并确保类的正确性。 类是在运行期间第一…

网络安全—0基础入门学习手册

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

用python实现基本数据结构【01/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

Kubernetes (K8s) 解读:微服务与容器编排的未来

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…