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.mzph.cn/news/76119.shtml

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

相关文章

构建企业分支网络

构建企业分支网络 目录 1.1 项目背景 1.2 项目拓扑 1.3 项目需求 1.4 设备选型 1.5 技术选型 1.6 地址规划 1.6.1 交换设备地址规划表 1.6.2 路由设备地址规划表 1.6.3 ISP设备地址规划表 1.6.4 终端地址规划表 1.6.4.1 VLAN 规划 1.7 VLAN 规划 1.8 项目实施 1.…

时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化

时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化 目录 时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 RIME-VMD【23年新算法】霜冰优化算法优化VMD变分模态分…

TinTin Web3 动态精选:以太坊基金会推出 EELS、Arbitrum Stylus 上线

TinTin 快讯由 TinTinLand 开发者技术社区打造,旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位, 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态,将有助于 TinTinLand 社区的开…

如何获得一个Oracle 23c免费开发者版

获取23c开发者版 简单介绍可参考这里。 获取数据库可以参考这篇文章Introducing Oracle Database 23c Free – Developer Release或这里。 Docker Image 这是最快的方法。在OCI上创建一个计算实例,然后就可以拉取image使用了。 docker的安装和配置不赘述了。 …

html实现邮件模版布局-flex布局table布局-demo

邮件模版布局 flex - 布局简单方便 兼容性差 table - 优点 就是兼容性好&#xff0c;其他没有优点 注&#xff1a;使用图片需要png最好&#xff0c;使用svg图google邮箱会出现不能使用的情况 效果图 flex布局 <!DOCTYPE html> <html lang"en" xmlns:th&qu…

sql server事务隔离别 、 mysql 事务隔离级别、并发性问题

隔离级别和锁 SQL中 mysql 、Oracle 、sql server 等数据库 都是客户端和服务器架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有若干个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就可以称为一个 【会话&#xff08;session&#xff0…

Linkstech多核并行仿真丨光伏发电系统模型及IEEE 39 bus模型多核并行实测

新能源场站和区域电网作为复杂且具有动态特性的大规模电力系统&#xff0c;需要实时仿真测试来验证其性能、稳定性和响应能力。在这种背景下&#xff0c;多核并行仿真运算显得尤为重要。多核并行仿真能够同时处理电力系统的复杂模型&#xff0c;加速仿真过程&#xff0c;实现接…

YOLOV7改进-具有隐式知识学习的Efficient解耦头

[解耦头][https://github.com/z1069614715/objectdetection_script/blob/master/yolo-improve/yolov7-DecoupledHead.py] 1、复制这些到yolo.py 2、到这 3、复制下半部分到yolo.py 4、替换这里 5、最后的加到上面的这里 6、添加 7、添加 8、V5大概一个点的提升 9、解…

Android Jetpack 中Hilt的使用

Hilt 是 Android 的依赖项注入库&#xff0c;可减少在项目中执行手动依赖项注入的样板代码。执行 手动依赖项注入 要求您手动构造每个类及其依赖项&#xff0c;并借助容器重复使用和管理依赖项。 Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期&#xff0c;…

uni-app(微信小程序)图片旋转放缩,文字绘制、海报绘制

总结一下&#xff1a; 要进行海报绘制离不开canvas&#xff0c;我们是先进行图片&#xff0c;文字的拖拽、旋转等操作 最后再对canvas进行绘制&#xff0c;完成海报绘制。 背景区域设置为 position: relative&#xff0c;方便图片在当前区域中拖动等处理。添加图片&#xff0…

基于 Web HID API 的HID透传测试工具(纯前端)

前言 最近在搞HID透传 《STM32 USB使用记录&#xff1a;HID类设备&#xff08;后篇&#xff09;》 。 市面上的各种测试工具都或多或少存在问题&#xff0c;所以就自己写一个工具进行测试。目前来说纯前端方案编写这个工具应该是最方便的&#xff0c;这里放上相关代码。 项目…

数据库实现学生管理系统

1.QT将数据库分为三个层次&#xff1a; 1> 数据库驱动层&#xff1a;QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin 2> sql接口层&#xff1a;QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 3> 用户接口层&#xff1a;提供一些模型QSql…

linux非root安装特定版本的cuda

由于一些代码实现&#xff08;cuda写的外部扩展包&#xff09;对cuda版本要求比较高&#xff0c;因此&#xff0c;我在实验室linux系统下默认的cuda版本上&#xff0c;没办法编译扩展包。需要重新安装特定版本的cuda。 一. 首先&#xff0c;需要查看系统版本&#xff1a; lsb…

LabVIEW利用人工神经网络辅助进行结冰检测

LabVIEW利用人工神经网络辅助进行结冰检测 结冰对各个领域构成重大威胁&#xff0c;包括但不限于航空航天和风力涡轮机行业。在起飞过程中&#xff0c;飞机机翼上轻微积冰会导致升力降低25%。研究报告称&#xff0c;涡轮叶片上的冰堆积可在19个月的运行时间内造成29MWh的功率损…

【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

本文介绍使用Jenkins一键将NodeJS&#xff08;Vue&#xff09;前端项目打包并上传到生产环境服务器&#xff0c;这里使用的是直接打包静态页面&#xff0c;发送到远程服务器Nginx配置目录的方式&#xff0c;首先确保服务器环境配置好&#xff0c;安装Nginx&#xff0c;运行目录…

解决Ubuntu无法安装pycairo和PyGObject

环境&#xff1a;虚拟机Ubuntu20.04&#xff0c;vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20.04&#xff0c;vscode中运行Anaconda搭建的vens 的Python3.8.10 首先在vscode中点击ctrlshiftp&#xff0c;选择Python3.8.10的环境&#xff0c;自动激活Python 最近在搞无人…

第 362 场 LeetCode 周赛题解

A 与车相交的点 数据范围小直接暴力枚举 class Solution { public:int numberOfPoints(vector <vector<int>> &nums) {unordered_set<int> vis;for (auto &p: nums)for (int i p[0]; i < p[1]; i)vis.insert(i);return vis.size();} };B 判断能否…

普中 51 单片机点亮LED灯

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

React中父子组件参数传递讲解

文章目录 结合案例&#xff1a;github搜索案例1.父容器代码2.搜索Search子模块代码3.展示Lisi子模块代码 父子参数传递分析1.子(Search)传父(App)2.父(App)传子(List) 结合案例&#xff1a;github搜索案例 案例结果展示如下图 1.父容器代码 import React, { Component } fr…

【GO语言基础】前言

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录一、基础知识包和函数函数声明语法简洁性 括号成对出现GO常用DOS命令命名规则项目目录结构注释 总结 一、基础知识 包和函数 //声明本代…