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.0和YOLOv5 - 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×80、40×40、20×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,得到结果。👇
这样就算添加成功了。🎉🎉🎉
相关文章:

YOLOv5算法改进(16)— 增加小目标检测层
前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效…...
蓝桥杯官网练习题(图像模糊)
题目描述 小蓝有一张黑白图像,由 nm 个像素组成,其中从上到下共 n 行,每行从左到右 �m 列。每个像素由一个 0 到 255 之间的灰度值表示。 现在,小蓝准备对图像进行模糊操作,操作的方法为: 对…...

使用鳄鱼指标和ADX开立空头的条件,3秒讲清楚
使用鳄鱼指标和ADX开立空头的条件其实很简单,anzo capital昂首资本3秒钟讲清楚。 首先,市场行情需呈水平状态。再者,均线体系开始向上发散,给出明确的信号。最后,ADX确认该信号,要求指数上涨20%以上&#…...

RabbitMQ死信队列与延迟队列
目录 死信队列 死信队列的定义 死信队列的应用场景 死信队列的作用 死信队列架构图 死信队列代码实现 延迟队列 延迟队列的定义 延迟队列的应用场景 延迟队列的作用 延迟队列架构图 延迟队列的代码实现 死信队列 死信队列的定义 死信队列(Dead Letter …...
存储管理呀
世界太吵,别听,别看,别管,别怕,向前走 一. 存储管理 初识硬盘 机械 HDD 固态 SSDSSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,拥有极高的存储性能,被认为是存储技术发展的未来…...
学习 BeautifulSoup 库从入门到精通
可以按照以下步骤进行: 1. 安装 BeautifulSoup: 首先,确保你已经安装了 Python。然后可以使用 pip 命令来安装 BeautifulSoup 库。在命令行中输入以下命令: pip install beautifulsoup42. 导入 BeautifulSoup: 在 …...
JavaScript基础知识总结
目录 一、js代码位置 二、变量与数据类型 1、声明变量 2、基本类型(7种基本类型) 1、undefined和null 2、String ⭐ 模板字符串(Template strings) 3、number和bigint ⭐ 4、boolean ⭐ 5、symbol 3、对象类型 1、Fun…...

技术面试与HR面:两者之间的关联与区别
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

【Redis】为什么要学 Redis
文章目录 前言一、Redis 为什么快二、Redis 的特性2.1 将数据储存到内存中2.2 可编程性2.3 可扩展性2.4 持久性2.5 支持集群2.6 高可用性 三、Redis 的应用场景四、不能使用 Redis 的场景 前言 关于为什么要学 Redis 这个问题,一个字就可以回答,那就是&…...

动静态库生成使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️林 子 🛰️博客专栏:✈️ Linux 🛰️社区 :✈️ 进步学堂 🛰…...
LLVM编译安装
LLVM编译安装 #全量下载 git clone https://github.com/llvm/llvm-project.git #只下载最新commit版本 git clone --depth 1 https://github.com/llvm/llvm-project.git#配置 #!/bin/bash set -ex cmake -S llvm -B build -DCMAKE_INSTALL_PREFIX/data0/huozai/software/insta…...
表的内连接和外连接
表的连接是SQL中的一种操作,用于将两个或多个表中的数据按照某个条件进行关联。 内连接 使用内连接将两个表(Table1 和 Table2)进行连接: select * from Table1 inner join Table2 on Table1.id Table2.id;举例: -- 用普通的写法 select…...

三、C#—变量,表达式,运算符(3)
🌻🌻 目录 一、变量1.1 变量1.2 使用变量的步骤1.3 变量的声明1.4 变量的命名规则1.5 变量的初始化1.6 变量初始化的三种方法1.7 变量的作用域1.8 变量使用实例1.9 变量常见错误 二、C#数据类型2.1 数据类型2.2 值类型2.2.1 值类型直接存储值2.2.2 简单类…...

纷享销客受邀出席CDIE2023数字化创新博览会 助力大中型企业增长
2023年,穿越周期,用数字化的力量重塑企业经营与增长的逻辑,再次成为企业数字化技术应用思考的主旋律,以数字经济为主线,数字技术融入产业发展与企业增长为依据,推动中国企业数字化升级。 9月5日,…...
linux下qt交叉编译 tslib 库
在 Linux 下进行 Qt 的交叉编译,并包含 tslib 库,可以按照以下步骤进行操作:1. 准备交叉编译工具链:首先,你需要准备适用于目标平台的交叉编译工具链。这个工具链包括交叉编译器、 2. 链接器和其他相关的工具ÿ…...

2.13 PE结构:实现PE代码段加密
代码加密功能的实现原理,首先通过创建一个新的.hack区段,并对该区段进行初始化,接着我们向此区段内写入一段具有动态解密功能的ShellCode汇编指令集,并将程序入口地址修正为ShellCode地址位置处,当解密功能被运行后则可…...
Rust更换Cargo国内源,镜像了寂寞
换皮不换身 换了国内源,构建时该卡还会卡。因为它所谓的换源,只是更换crates.io“索引”的源,而不是package“内容”的源。换了国内源后,在国内编译时访问 crates.io-index 自然会快很多,可是crates.io-index里面的信…...

【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入
目录 0x00 前言: 0x02 解决: 0x00 前言: 本篇博文可能会有一点点的超级呆 0x02 解决: 你是不是也会想: 使用pyrhon将指定文件夹位置里面的1.txt中数据全部删除以后---->然后再将参数req_text的值写入到1.txt …...
ESP32蓝牙实例-BLE服务器与客户端通信
BLE服务器与客户端通信 文章目录 BLE服务器与客户端通信1、软件准备2、硬件准备3、代码实现3.1 BLE服务器实现3.2 Android手机测试BLE服务器3.3 ESP32 BLE客户端在本文中,我们将介绍如何使用低功耗蓝牙在两个 ESP32 开发板之间执行 BLE 服务器客户端通信。 换句话说,将介绍如…...

第11章_瑞萨MCU零基础入门系列教程之SysTick
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...