💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡
在目标检测领域内,尽管YOLO系列的算法傲视群雄,但在某些方面仍然存在改进的空间。在YOLOv8提取特征的时候,由于卷积的缘故,会导致很多信息的丢失。对于小目标来说更是如此,这样将大幅度降低小目标的检测能力。本文给大家带来的教程是将原来的网络结构替换为更适合小目标检测的backbone,并附上结构图。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
专栏地址:YOLOv8改进——更新各种有效涨点方法
1. 原理
小目标检测确实更适合使用大的特征图,这是因为大的特征图能够保留更多的空间细节信息,从而提高对小目标的检测精度。
原因
细节保留:
- 大的特征图在经过卷积和池化层时损失的空间信息较少,能够更好地保留图像中的细节,这对于小目标的检测尤为重要。小目标通常在图像中占据的像素较少,如果特征图过小,可能会导致小目标的特征被过度压缩或丢失。
定位精度:
- 小目标通常需要更高的定位精度,大的特征图具有更高的分辨率,能够提供更精确的位置预测。小目标在低分辨率特征图上可能仅占几个像素,不利于精确定位。
特征丰富度:
- 大的特征图包含的特征更多、更丰富,能够更好地描述小目标的外观和形状。这有助于分类器区分小目标与背景或其他物体。
上下文信息:
- 虽然大特征图更注重细节,但它们仍然可以包含足够的上下文信息,帮助检测器更好地理解小目标的周围环境。这对于一些需要考虑上下文信息的小目标检测任务也是有利的。
常见的方法
使用特征金字塔网络(FPN):
- 特征金字塔网络通过结合不同层次的特征图,可以同时保留高分辨率的细节和低分辨率的语义信息,从而增强对不同尺度目标的检测能力。
多尺度训练和测试:
- 在训练和测试过程中使用不同尺度的图像,确保模型能够适应不同大小的目标。
特征增强方法:
- 例如利用注意力机制或其他特征增强技术,进一步提高特征图对小目标的敏感性。
总之,为了提高小目标检测的效果,保持较大的特征图是一种有效的策略,通过结合其他技术手段,可以进一步提升检测性能。
2. YOLOv8
YOLOv8的检测流程大致流程是这样的
输入预处理:
- 将输入图像调整到模型所需的固定尺寸(如640x640),并进行归一化处理,将像素值缩放到[0, 1]之间。
- 进行数据增强,如随机裁剪、旋转、翻转和颜色调整,以提高模型的泛化能力。
特征提取:
- 经过预处理的图像输入到特征提取网络(Backbone)中。
- 通过多层卷积操作提取图像的多尺度特征图。这些特征图包含不同层次的语义信息,有助于检测不同大小的目标。
特征融合:
- 使用特征金字塔网络(FPN)或路径聚合网络(PANet)对不同层次的特征图进行融合。这样可以结合低层次的细节信息和高层次的语义信息,增强检测效果。
- 通过跨层连接和特征融合,提高模型对不同尺度目标的检测能力。
目标检测头:
- YOLOv8使用多个检测头(Detection Heads),每个检测头对应一个特定的特征尺度。每个检测头负责检测特定尺度范围内的目标。
- 在每个检测头上,使用1x1卷积层生成预测,包括目标类别、边界框位置和置信度分数。
-------省略----------
- 结果输出:
- 最终输出检测结果,包括每个目标的类别标签、边界框坐标(通常是左上角和右下角的坐标)、以及置信度分数。
- 将检测结果映射回原始图像尺寸,以便于可视化和进一步处理。
YOLOv8在这个流程中,通过改进特征提取网络和优化检测头设计,实现了更高的检测精度和速度,使其在实时目标检测任务中表现出色。
未修改的YOLOv8的网络结构图
3. 修改主干网络
因为本次改进没有涉及到代码的添加或者替换,直接修改网络结构即可
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPs
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs
l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)
-----------省略---------------
本次修改的主要内容就是将下采样4倍的特征图也concatenate检测层,来进行检测,这样大的特征图也被拿来作为检测层,能进一步检测到小的目标。
小目标检测更适合使用较大的特征图,因为较大的特征图能更好地保留图像中的细节信息,提高检测的精度和定位的准确性。大特征图在卷积和池化过程中损失的空间信息较少,能够提供丰富的特征描述,有助于分类器区分小目标与背景或其他物体。此外,大特征图还能保留足够的上下文信息,帮助检测器理解小目标周围的环境。通过结合特征金字塔网络(FPN)进一步提升了小目标检测的效果。
4. 修改后的结构图
为了更好的理解修改后的网络结构,由于时间的原因,我简单的画出了修改后的网络结构图,如下【其中模块中的结构均没有发生任何变化,因此具体的模块结构请参照未修改的结构即可】
结构图地址:
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】——点击即可跳转
从图中可以清晰的看出,在Neck部分,多增加了一个上采样、concatenate和c2f的模块,主要是拼接的部分,将原来丢弃的backbone丢弃的p2也拼接过来,增加小目标的特征。
5. 完整代码
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】——点击即可跳转
6.总结
小目标检测更适合小的特征图,因为在大特征图上,小目标的特征更加明显,更容易被检测到,并且有助于保留细节信息,提高检测准确性。为了优化小目标检测性能,本文采用在大的特征图上检测的方法:利用多尺度特征融合和特征金字塔网络来结合不同尺度的特征信息,使用相同分辨率的输入图像保留更多细节,显著提升了小目标检测的准确性和效率。