yolo系列网络算法的演变过程
目录
目标检测的历史发展历程:
Yolo1
论文地址
Yolo1结构图:
设计思路:
Yolo1输出形状
bbox的置信度计算
bbox的所属类的置信度计算
Yolo1的损失函数
四个部分
loss函数设计的缺陷
总结Yolo1的优点和需要改进的地方
优点:
需要改进之处:
Yolo2
论文地址:
Yolo2网络结构:
Yolo2损失函数
Yolo2做的优化
High resolution classifier(高分辨率图像分类器)
增加BN移除dropout
Convolution with anchor boxes(使用先验框)
去掉全连接层的全卷积网络多尺度训练
尺寸聚类
Fine-Grained Features(passthrough层检测细粒度特征)
总结Yolo2的效果优点
Yolo3
论文地址:
网络结构:
Yolo3改进之处
引入FPN(多尺度预测)
主干网络改为DarkNet-53
二分类交叉损失熵分类
Yolo4
论文地址
结构图
堆trick的v4主要的创新点:
从结构4个部分来看创新点:
相关研究论文:
如何提升YOLO对小目标检测的精度
目标检测的历史发展历程:
图片引自:https://arxiv.org/pdf/1905.05055.pdf
可以看到yolo出现的比较晚,R-CNN系列算法相对较早,同时R-CNN系列的算法也继承了传统目标检测算法的思路,分为两个阶段来执行,第一步先获取候选框,第二步再做分类。
为了做到提速,并且简化检测流程做到更加端到端效果,yolo系列换了思路,利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别,做到了one-stage的效果。
R-CNN和Yolo对比,two-stage的精度高但是相对慢,one-stage的快但是相对精度有所妥协。
Yolo1
论文地址
https://arxiv.org/abs/1506.02640
Yolo1结构图:
yolov1的网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )
设计思路:
YOLO的全称是You Only Look Once,即你只用看一次。YOLO1版本是YOLO系列的开山之作,其核心思想是:把目标检测当做一个单一的回归任务。它首先将图像划分为SxS个网格(grid cell),物体真实框中心落在哪个网格上,就由该网格对应的锚框负责检测该物体。
Yolo1输出形状
Yolo1是将图像分成了S*S个网格,每个cell会负责预测落在其上边物体的类别(假如一共C个类别),另外每个cell会预测B个bounding box,每个bounding box要预测(x, y, w, h)和置信度confidence共5个值,因此yolov1输出是一个S x S x (5*B+C)的一个张量tensor。
假如是PASCAL VOC数据集的20分类,取S=7,B=2,所以输出为7*7*(2*5+20)的tensor。整个图片最多识别7X7X2个box,最多识别49个目标。如上图,每一个网格只能只能预测两个框,不利于识别密集型目标和小目标。注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。
bbox的置信度计算
上边说道每个cell要预测B个bbox,每个bbox除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的groundtruth之间的IoU值
bbox的所属类的置信度计算
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。非极大值抑制解释请移步:目标检测综述(一:历史由来和古典目标检测的出现)_RayChiu757374816的博客-CSDN博客_目标检测起源
Yolo1的损失函数
四个部分
Yolo1的损失函数分为四部分坐标预测、含object的bbox confidence预测、不含object的bbox confidence预测、类别预测,参数的解释:
其中只有当某个网格中有object的时候才对classification error进行惩罚,只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而cell中两个bbox哪个负责就要看其预测值和ground truth box的IoU,IoU最大的负责。
loss函数设计的缺陷
不同类别数量的问题
yolov1的损失函数简单粗暴的采用了sum-squared error loss来做这件事,这种简单粗暴的loss设计在类别数量不同的情况下存在问题: 8维的localization error和20维的classification error同等重要显然是不合理,解决办法就是设置不同的权重分数。
W和H的处理
对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。
总结Yolo1的优点和需要改进的地方
优点:
- 速度快,达到了完全实时的效率
- 错误率低(相对于faster rcnn会把很多背景预测为物体)
- 泛华能力强(论文试验-在美术绘画作品中也有较好的效果)
需要改进之处:
- 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
- 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个
- YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
Yolo2
论文地址:
https://arxiv.org/abs/1612.08242
Yolo2网络结构:
可以看到骨干网络换成了DarkNet
Yolo2损失函数
只有YOLO v1明确提出了loss公式,V2和V3都使用了anchor的概念,因此计算loss的方式做出了调整 。
Yolo2做的优化
Yolo1 定位误差高,而且相比于基于区域提议的方法,Yolo1 的召回率偏低。针对Yolo1的这些缺点做了以下优化:
High resolution classifier(高分辨率图像分类器)
V1 使用 224×224 分辨率图像训练分类网络,并且将分辨率增加到 448 用于检测,mAP提升了4%
增加BN移除dropout
在所有的卷积层后增加 BatchNormalization 这可以显著改善网络的收敛性,并且有利于正则化模型,防止过拟合。增加 BN以后移除网络的 dropout 。这将 mAP 提升 2%。
Convolution with anchor boxes(使用先验框)
学习RPN使用先验框,这种操作基于的理论是:“模型学习拟合偏移量相对于学习直接拟合出坐标操作会更加容易”,简单说就是预先设定一些预测框,然后在训练的过程中去调整这些检测框(这个过程就是在学习偏移量)
网络通过32 降采样因子,网络输出特征图大小为 13×13;yolov2 将类预测机制与空间位置分离,为每个锚框预测类和目标。v1在每幅图像仅预测 98个框,但是 v2在每幅图像预测超过 1000个框(前提每个anchor 9个Anchor Boxes,实际上通过后边讲的聚类效果发现5个box就能达到Faster RCNN的9中box的效果)。使用锚框导致精度略微下降,但是召回率显著提高。
去掉全连接层的全卷积网络多尺度训练
和SSD一样,模型中只包含卷积和平均池化层(平均池化是为了变为一维向量,做softmax分类)。这样做一方面是由于物体检测中的目标,只是图片中的一个区块,它是局部感受野,没必要做全连接。而是为了输入不同尺寸的图片,如果采用全连接,则只能输入固定大小图片了。全卷积网络使得模型支持多种尺度图像的输入并轮流进行训练
尺寸聚类
通过在训练数据集上运行 k−means聚类算法,为预测框找到较优的先验尺寸,更科学与更准确的选择Anchor Box的尺寸,检测效果更好。
Fine-Grained Features(passthrough层检测细粒度特征)
对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416*416经过卷积网络下采样最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。Passthrough 层类似于 ResNet中的恒等映射,通过将相邻特征堆叠到不同的通道而不是空间位置,来连接高分辨率特征和低分辨率特征。具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
总结Yolo2的效果优点
- 小目标检测召回率好了一些
- 物体距离近的检测效果好了一些
- 精度好了一些
Yolo3
论文地址:
https://arxiv.org/abs/1804.02767
网络结构:
Yolo3改进之处
引入FPN(多尺度预测)
YOLOv3 借鉴了 FPN 的思想,从不同尺度提取特征。相比 YOLOv2,YOLOv3 提取最后 3 层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出 9 种尺度的 anchor box,将 9 种尺度的 anchor box 均匀的分配给 3 种尺度的特征图。
YOLOv2每个网格分配 5 个锚框,YOLOv3 为每个网格分配 3 个尺度的特征图,每个尺度分配 3 个锚框,一共使用 9 个锚框。输出为N×N×[3∗(4+1+C)] 维度的张量,C为预测的类别数量。
主干网络改为DarkNet-53
更好的基础分类网络(darknet-53, 类似于ResNet引入残差结构)
二分类交叉损失熵分类
在实际应用场合中,一个物体有可能输入多个类别,单纯的单标签分类在实际场景中存在一定的限制。举例来说,一辆车它既可以属于 car(小汽车)类别,也可以属于 vehicle(交通工具),用单标签分类只能得到一个类别。因此在 YOLO v3 在网络结构中把原先的 softmax 层换成了逻辑回归层,从而实现把单标签分类改成多标签分类。用多个 logistic 分类器代替 softmax 并不会降低准确率,可以维持 YOLO 的检测精度不下降。
Softmax和logistic 之间的区别是在一个多分类任务中,如果类别是互斥的使用Softmax,因为Softmax类似于onehot编码,只能有一个被激活;如果类别是不互斥的可以使用Logistic,可能同时激活多个单元。
Yolo4
YOLOv4的特点是集大成者,俗称堆料。但最终达到这么高的性能,一定是不断尝试、不断堆料、不断调参的结果
论文地址
https://arxiv.org/abs/2004.10934
结构图
Backbone:CSPDarknet53, Neck:SPP,PAN, Head:YOLOv3
YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3
堆trick的v4主要的创新点:
从结构4个部分来看创新点:
- 输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
- BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
- Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构
- Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
相关研究论文:
Mosaic数据增强:参考2019年的Cutouthttps://arxiv.org/abs/1905.04899v2
CSPDarknet:参考2019年的CSPNethttps://arxiv.org/pdf/1911.11929.pdf
Mish激活函数:参考2019年的https://arxiv.org/abs/1908.08681
Dropblock:参考2018年的https://arxiv.org/pdf/1810.12890.pdf
SPP:参考2019年的《DC-SPP-Yolo》https://arxiv.org/ftp/arxiv/papers/1903/1903.08589.pdf
PAN:参考2018年的PANethttps://arxiv.org/abs/1803.01534
CIOU_loss:参考2020年的https://arxiv.org/pdf/1911.08287.pdf
当然,这只是其中一部分,还有其他的创新点,没有一一列出。
如何提升YOLO对小目标检测的精度
这个问题要从不同版本的角度去分析,比如针对v1版本,可以说v2版本的聚类得到的先验框回归偏差可能会解决小目标检测问题。针对v2可以说v3的多尺度预测、更好的分类网络都能提升对小目标的检测准确率。针对v3可以说v4众多的trick的引入使得网络性能巨大的提升,自然就比v3小目标监测准确率高。
要是针对v5,或者说针对整个base YOLO的模型,那解决的方法就是类似SSD那样在每个尺度的特征图上抽样送入末端卷积层去处理,自然对小目标的检测率会提升,比如说base EfficiNet模型。
或者说效仿base Transformer模型将输入图片划分为多个patch,然后在末端去使用like RCNN去处理,有放大局部目标物体的作用。
参考:目标检测之YOLO算法:YOLOv1,YOLOv2,YOLOv3,TinyYOLO,YOLOv4,YOLOv5,YOLObile,YOLOF,YOLOX详解 - 知乎
如何看待新提出来的YOLOv4? - 知乎
深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎
行为分析(六):人形检测部分(一):YOLOv1-v5的学习笔记_是魏小白吗的博客-CSDN博客
yolo系列网络算法的演变过程相关推荐
- YOLO系列 --- YOLOV7算法(二):YOLO V7算法detect.py代码解析
YOLO系列 - YOLOV7算法(二):YOLO V7算法detect.py代码解析 parser = argparse.ArgumentParser()parser.add_argument('- ...
- YOLO系列 --- YOLOV7算法(四):YOLO V7算法网络结构解析
YOLO系列 - YOLOV7算法(四):YOLO V7算法网络结构解析 今天来讲讲YOLO V7算法网络结构吧~ 在train.py中大概95行的地方开始创建网络,如下图(YOLO V7下载的时间不 ...
- YOLO系列网络训练数据准备工具—Yolo_mark
项目介绍 Yolo_mark是一个检测任务数据集制作工具,制作完成后的数据格式不是VOC或者COCO的数据格式,从它的名字也可以看出,它是专门为了YOLO系列的网络训练准备数据的,YOLO这一点还是很 ...
- Yolo系列检测网络不再孤单,延伸框架层出不穷(附框架源代码)
点击蓝字关注我们 关注并星标 从此不迷路 计算机视觉研究院 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 至今,目标检测框架已经百花齐放,各种应用场景.应用限制的要求, ...
- YOLO系列算法详解(一)
一.深度学习经典检测方法 1.检测任务中阶段的意义 对于单阶段(one-stage)检测来说,输入一张图像,经过一个卷积神经网络,输出一个边界框,只需要得到框的(x1,y1)和(x2,y2)四个值即可 ...
- YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中)
YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(上) YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中) YOLO系列(v1~v3)的学习及Y ...
- YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)
从刚开始接触YOLO到现在也已经有大半年时间了,中间也陆陆续续接触过其它网络.最近又抽时间研究了一下YOLOv4. 因此,趁此机会,将yolov1到yolov4进行一个全面的整理和总结,希望对即将入坑 ...
- 目标检测——YOLO系列算法(YOLOv4、YOLOv5)的学习笔记
目录 1 前言 2 致谢 3 YOLO模型列表 4 模型结构 2.1 Backbone Focus--网格下采样 CSPDarknet53 2.3 Neck -- SPP & PAN SPP: ...
- 目标检测 YOLO系列算法
文章目录 1. YOLO算法 1.1 Yolo算法思想 1.2 Yolo的网络结构 1.2.1 网络输入 1.2.2 网络输出 1.7X7网格 2x30维向量 1.3 Yolo模型的训练 1.3.1训 ...
最新文章
- 复分析可视化方法:笔记:log(z)的可视化微分法
- [Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
- piaoxue/feixue驱动程序分析
- 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 )
- 201621123053 张雨阳软工作业2
- Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
- 谷歌浏览器有哪些好看的主题_Kibou 简洁的Typecho主题
- GitHub推出“AI程序员”插件 !
- 基于JAVA+SpringMVC+Mybatis+MYSQL的医院HR人事管理系统
- 跟着开源项目学因果推断——mr_uplift(十五)
- mysql列不明确_PHP和MYSQL:如何解决JOIN操作中不明确的列名?
- linux: tee日志记入文件
- android 动画遮盖,android view用动画实现遮罩效果
- 【linux】详解TOP命令
- iphone开源汇总
- 复旦大学计算机科学与技术,复旦大学计算机科学技术学院
- html5半径,化学元素原子半径大小比较
- Linux磁盘监控工具说明
- 3ds Max导出OBJ的mtl贴图路径不正确
- 【解决】Cloning into ‘xxx‘... remote: HTTP Basic: Access denied fatal: