yolo网络整理-网络结构原理与anchor

YOLOv5 是Glenn Jocher等人操刀研发,Ultralytics公司的开源项目,项目地址可点击。2020年6月发布以来,Ultralytics公司一直在对项目进行维护与更新,目前repo的star数目突破44k,YOLOv5的功能在迭代中越发强大与完善,目前支持多平台多框架,以及涵盖语义分割等功能,成为越来越强大的检测工具。

1、理解anchor

想要理解检测神经网络,绕不开的就是anchor的具体设定和来源,所以在第一章节我们就聊一聊anchor的起源。
回忆早先处理的人脸识别算法,使用的是Haar级联+boost分类器的方式来做,如果我们要检测下图中小女孩的人脸位置,一个比较简单暴力的方法就是滑窗,我们使用不同大小、不同长宽比的候选框在整幅图像上进行穷尽式的滑窗,然后提取窗口内的特征(例如Haar、LBP、Hog等特征),再送入分类器(SVM、Adaboost等)判断该窗口内包含的是否为人脸。这种方法简单易理解,但是这类方法受限于手动设计的特征,召回率和准确率通常不是很高。

在深度学习时代,大名鼎鼎的RCNN和Fast RCNN依旧依赖滑窗来产生候选框,也就是Selective Search算法,该算法优化了候选框的生成策略,但仍旧会产生大量的候选框,导致即使Fast RCNN算法,在GPU上的速度也只有三、四帧每秒。直到Faster RCNN的出现,提出了RPN网络,使用RPN直接预测出候选框的位置。RPN网络一个最重要的概念就是anchor,启发了后面的SSD和YOLOv2等算法,虽然SSD算法称之为default box,也有算法叫做prior box,其实都是同一个概念,他们都是anchor的别称。

1.1 anchor的概念

Archor就是在图像上预设好的不同大小,不同长宽比的参照框,其实非常类似于上面的滑窗法所设置的窗口大小。举例来说如果我们在38x38、19x19、10x10、5x5的四个特征图上,每张图上分别设置4、6、6、6个不同大小和长宽比的anchor,所以一共有38x38x4+19x19x6+ 10x10x6+5x5x6=8692个anchor。
借助神经网络强大的拟合能力,我们不再需要计算Haar、Hog等特征,直接让神经网络输出,每个anchor是否包含(或者说与物体有较大重叠,也就是IoU较大)物体,以及被检测物体相对本anchor的中心点偏移以及长宽比例。

一般的目标检测网络可能有成千上万个anchor,例如标准SSD在300x300输入下有8732个anchor,在500x500下anchor数量过万。我们拿上图中的三个anchor举例,神经网络的输出,也就是每个anchor认为自己是否含有物体的概率,物体中心点与anchor自身的中心点位置的偏移量,以及相对于anchor宽高的比例。因为anchor的位置都是固定的,所以就可以很容易的换算出来实际物体的位置。以图中的小猫为例,红色的anchor就以99%的概率认为它是一只猫,并同时给出了猫的实际位置相对于该anchor的偏移量,这样,我们将输出解码后就得到了实际猫的位置,如果它能通过NMS(非最大抑制)筛选,它就能顺利的输出来。但是,绿色的anchor就认为它是猫的概率就很小,紫色的anchor虽然与猫有重叠,但是概率只有26%。

1.2 如何科学的设置Anchor

FasterRCNN的RPN网络部分,anchor为三个尺度{128, 256, 512},三个比例{1:1, 1:2, 2:1},所以一共9组anchor。

在SSD论文中,作者使用6组定位层,每个定位层分别有6个anchor(不过第一和最后一个定位层只有4个)。一个尺度,分别有1:1、1:2、2:1、1:3、3:1五个不同宽高比,再加一个与特征图的anchor尺度特异性相关的尺寸,因此共有六个尺寸。

YOLOv3在三个不同尺度,每个尺度三个不同大小的anchor,一共九组。这位退出CV圈的Joseph Redmon大神是在YOLOv2版本开始使用kmeans方法聚类得到合适的anchor。可以得出的是大佬们的anchor数据都是在实际的公开数据集上,都是根据数据的实际分布来设置的,所以,我们在自己的数据集上训练目标检测网络时,也需要针对自身数据分布的特性对Anchor进行针对性的修改,这部分工作在YOLOv5代码仓库中也是有体现的。

本章节参考文献:
新手也能彻底搞懂的目标检测Anchor是什么?

2、网络流程

在理解anchor之后,我们可以理解一下yolo网络架构了。
YOLOv5是对三个尺度的特征图进行目标检测的,即large(大)、medium(中)、small(小)三个尺度。

  1. 准备工作(Input中进行):图片需要经过数据增强(尤其是Mosaic数据增强),并且初始化一组anchor预设(YOLOv5_v6针对不同参数量的模型给出了不同的通用预设)。
  2. 特征提取(Backbone中进行):使用了Conv、C3、SPPF基本结构对输入图片进行特征提取。Conv用于对输入进行下采样(共进行了5次下采样);C3用于对输入进行特征提取、融合,丰富特征的语义信息,在这个过程中使用了Boottleneck减少参数量和计算量、借鉴CSPNet思想增强CNN学习能力;SPPF利用池化、特征融合的方式丰富特征的语义信息,使得最深层的特征图拥有极丰富的语义信息。
  3. 加工特征(Neck中进行):对要进行目标检测的三种尺度的特征图融合浅层特征(浅层特征有利于检测)。v6借鉴了PANet,对提取的特征图融合浅层特征,使得特征图既具有丰富的语义信息又具有物体准确的位置信息。
  4. 预测目标(Head中进行):对加工后的特征图进行预测,根据损失函数(Classificition Loss和Bounding Box Regeression Loss)和优化器优化参数权重。

YOLO内部出现比较多的网络结构,在本章节不进行逐一介绍,可以参考下文的参考文献对此部分内容进行了解。

参考文献:

目标检测:新手也能彻底搞懂的YOLOv5详解
深入浅出Yolo系列之Yolov5核心基础知识完整讲解

3、网络输出与LOSS

3.1网络输出

YOLOv5的输出端主要是预测框,每个预测框由以下信息组成:

  • 置信度(confidence score):表示该框内是否存在目标的概率,取值范围为0到1。

  • 类别概率(class probabilities):表示该框内目标属于各个类别的概率,一般是预先定义好的类别数量。

  • 边界框位置(bounding box coordinates):表示目标的位置和大小,一般用矩形框来表示。

grid cell为20x20,输入为640x640的图像下采样32倍得到20x20,对应输入图像的感受野是32x32;grid cell为40x40,输入为640x640的图像下采样16倍得到40x40,对应输入图像的感受野是16x16;grid cell为80x80,输入为640x640的图像下采样8倍得到80x80,对应输入图像的感受野是8x8。

每个gred cell生成三个锚框,每一个锚框对应一个预测框,每一个预测框有 5(x,y,w,h,置信度) + 80(80个类别的条件概率), 3x85=255。

3.2 NMS非极大值抑制

在目标检测任务中,一个物体可能被多个预测框检测出来,为了避免对同一个物体进行多次检测,需要对重复的预测框进行过滤,这个过程就是非极大值抑制(Non-maximum suppression,简称NMS)。

在YOLOv5中,NMS主要是通过以下几个步骤实现的:

首先,对所有预测框按照置信度从高到低进行排序。

然后,从置信度最高的预测框开始,依次遍历每个预测框,判断该预测框与后面所有预测框之间的IOU值是否大于一定的阈值(一般为0.5或0.6)。

如果IOU值大于阈值,则将该预测框从候选框列表中剔除,否则保留该预测框。

继续遍历下一个预测框,重复上述步骤,直到所有预测框都被遍历一遍。

最终,保留下来的预测框就是经过NMS处理后的结果,即每个物体只对应一个预测框。

NMS算法的核心是通过比较重复预测框之间的IOU值,去除冗余的预测框,保留最优的结果。在YOLOv5中,NMS可以避免同一个物体被重复检测的问题,提高了检测的精度和效率。

<think>好的,用户想了解YOLO架的工作原理及使用方法。首先,我需要整理YOLO的基本概念和核心思想。YOLO是单阶段目标检测算法,强调“You Only Look Once”,也就是一次性完成检测。得解释它和两阶段方法(如Faster R-CNN)的区别,突出速度和实时性的优势。 接下来要分版本介绍,用户可能对各个版本的改进点感兴趣。比如YOLOv1的网格划分和预测机制,v2的锚引入,v3的多尺度预测,v4的优化策略,v5的易用性,v7和v8的进一步提升,以及最新的YOLOv11特性。需要确保每个版本的亮点清晰,但不过于深入技术细节,保持易懂。 然后,结合用户提供的引用资料,引用[1]提到理论详解,适合用来支撑YOLO的理论部分;引用[2]和[4]介绍了Ultralytics和Darknet架的使用,需要整合安装和基本使用的步骤;引用[3]关于YOLO11的教程,可能需要简要提及新版本的特点。 用户可能需要具体的使用教程,所以需要分步骤说明如何安装环境、数据准备、训练和推理。这里要参考引用中的信息,比如使用Ultralytics架的安装命令,数据集的格式要求,以及示例代码。同时,注意代码块用正确的格式,并保持简洁。 最后,生成相关问题时要覆盖理论、应用、优化、比较和工具等方面,确保问题能引导用户深入学习和解决可能遇到的疑问。检查引用标注是否正确,确保每个引用在回答中都有对应的标识,比如提到YOLOv1时引用[^1],提到Ultralytics时引用[^2]等。 需要确保回答结构清晰,分点明确,语言通俗,符合用户对教程的需求。同时,避免使用过多专业术语,或者在必要时加以解释。最后检查LaTeX格式是否正确,数学表达式用$包裹,独立公式用$$,并正确换行。</think>### YOLO架工作原理及使用方法详解 #### 一、YOLO架核心思想 YOLO(You Only Look Once)是一种单阶段目标检测算法,其核心思想是将目标检测任务转化为**回归问题**,通过单次前向传播直接预测目标的边界类别概率传统的两阶段检测方法(如Faster R-CNN)相比,YOLO通过全局图像信息进行预测,显著提升了检测速度,适用于实时场景。 数学上,YOLO将输入图像划分为$S \times S$的网格,每个网格预测$B$个边界(Bounding Box)。每个边界包含坐标$(x,y,w,h)$、置信度$Confidence$和类别概率$C_i$。最终输出维度为: $$S \times S \times (B \times 5 + C)$$ 其中$C$为类别总数。 #### 二、YOLO版本演进 1. **YOLOv1** - 提出检测架,输出7×7网格 - 每个网格预测2个边界 - 缺点:对小目标检测效果较差 2. **YOLOv2/YOLO9000** - 引入锚Anchor Box)机制 - 使用高分辨率分类器(448×448输入) - 支持多尺度训练(Multi-Scale Training) 3. **YOLOv3** - 采用Darknet-53骨干网络 - 引入FPN结构实现多尺度预测 - 使用二元交叉熵损失替代Softmax 4. **YOLOv5/v7/v8** - 改进数据增强策略(Mosaic增强) - 优化损失函数(CIoU Loss) - 支持实例分割和姿态估计 5. **YOLOv11** - 引入动态标签分配策略 - 改进训练效率推理速度 - 支持边缘设备部署优化[^3] #### 三、使用方法(以Ultralytics架为例) 1. **环境安装** ```bash pip install ultralytics ``` 2. **数据准备** - 数据集格式遵循YOLO标准: ``` dataset/ ├─ images/ └─ labels/ ``` - 标注文件为.txt格式,每行表示一个目标: ```txt <class_id> <x_center> <y_center> <width> <height> ``` 3. **模型训练** ```python from ultralytics import YOLO model = YOLO('yolov8n.yaml') # 选择模型架构 model.train(data='coco128.yaml', epochs=100, imgsz=640) ``` 4. **推理预测** ```python results = model.predict('input.jpg') results.show() # 显示检测结果 ``` #### 四、性能优化建议 1. 输入分辨率调整(如640→320提升速度,但降低精度) 2. 使用TensorRT加速推理(适用于NVIDIA GPU) 3. 剪枝量化(减少模型参数量)[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值