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可以避免同一个物体被重复检测的问题,提高了检测的精度和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284146.html

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

相关文章

了解葡萄酒最重要的是什么?

事实上,大多数人只知道葡萄酒是一种酒精饮料味道很好,是您享用食物和营造氛围的完美饮品。但我认为知道得多一点葡萄酒的知识会增加你的欣赏力,你不必搜索葡萄酒来找寻资料,因为标签上有很多信息。 葡萄酒标签里有什么&#xff1f…

MFC 程序执行流程

目录 MFC 程序启动 MFC 入口函数 程序执行流程总结 在Win32课程中WinMain由程序员自己实现,那么流程是程序员安排,但到了MFC中,由于MFC库实现WinMain,也就意味着MFC负责安排程序的流程。 MFC 程序启动 程序的启动,…

热烈祝贺龙泰环保加入2024济南生物发酵展

江苏龙泰环保设备制造有限公司(LTEP),是一家致力于工业废气技术的研发、设计、制造、安装调试于一体的综合性科技型企业, 公司自成立以来,坚持高标准、严要求,塑造了一支经验丰富、技术精湛的知识化专业队伍;在坚持自主…

【算法题】 TLV解析 Ⅱ (js)

从第三个字节开始因此 const msg "0F04ABABABAB"; const msg1 "0F04ABABABAB10001FF"; function solution(msg, tags) {const tagObj {};for (let i 0; i 3 < msg.length; ) {const tag parseInt(msg.slice(i, i 2), 16);const len parseInt(m…

MySQL - 创建表的三种方法详解及练习

目录 &#x1f959;1. 基础创建 &#x1f9c0;实例1 &#x1f959;2. 带约束创建 &#x1f9c0;实例2 &#x1f959;3. 复制创建 &#x1f9c0;实例3&#xff1a; &#x1f9c0;实例4&#xff1a; &#x1f9c0;实例5&#xff1a; ​ &#x1f9c0;实例6&#xff1a; &am…

社科院与新加坡新跃社科联合培养博士—我想我的人生变得精彩

既然人生的幕布已拉开&#xff0c;就一定要积极的演出&#xff0c;既然脚步已经跨出&#xff0c;风吹坎坷也不能退步&#xff0c;既然我已经把希望播在这里&#xff0c;就一定要坚持到胜利的谢幕&#xff0c;人生没有什么是为了别人做的&#xff0c;工作不是为了老板&#xff0…

手把手入门MO | 如何通过通过 FineBI 实现 MatrixOne 的可视化报表

1. 概述 FineBI 是新一代大数据分析工具&#xff0c;它有助于企业的业务人员深入了解和充分利用他们的数据。在 FineBI 中&#xff0c;用户可以轻松地制作多样化的数据可视化信息&#xff0c;自由分析和探索数据。FineBI 具有多种数据连接功能&#xff0c;可用于创建各种复杂的…

Android通过listview实现输入框自定义提示栏(代替AutoCompleteTextView自动完成文本框)

效果图 背景 本人因为一些需求初次接触android&#xff0c;需要实现一个类似android自带的AutoCompleteTextView&#xff08;自动完成文本框&#xff09;&#xff0c;但和其不同的是通过后端接口直接筛选数据&#xff08;自己的分词处理规则&#xff09;&#xff0c;然后返回前…

Android-高效加载大图

Android 高效加载大图 前言读取位图尺寸和类型将按比例缩小的版本加载到内存中 前言 图片有各种形状和大小。在很多情况下&#xff0c;它们的大小超过了典型应用界面的要求。例如&#xff0c;系统“图库”应用会显示使用 Android 设备的相机拍摄的照片&#xff0c;这些照片的分…

如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cp…

《代码随想录》--二叉树(一)

《代码随想录》--二叉树 第一部分 1、二叉树的递归遍历2、二叉树的迭代遍历3、统一风格的迭代遍历代码4、二叉树的层序遍历226.翻转二叉树 1、二叉树的递归遍历 前序遍历 中序遍历 后序遍历 代码 前序遍历 class Solution {public List<Integer> preorderTraversal(T…

redis:五、缓存持久化(RDB和AOF)的开启和配置、面试回答模板

持久化 方案 redis中自身存在两种方案&#xff0c;分别叫RDB和AOF&#xff0c;来保障数据的持久化。其中前者默认开启&#xff0c;后者默认关闭。 redis是基于内存的&#xff0c;redis持久化的意思就是将redis数据&#xff0c;即内存数据写入磁盘等持久化存储设备当中。 RDB…