赞
踩
目录
High resolution classifier(高分辨率图像分类器)
Convolution with anchor boxes(使用先验框)
Fine-Grained Features(passthrough层检测细粒度特征)
图片引自: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的快但是相对精度有所妥协。
https://arxiv.org/abs/1506.02640
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是将图像分成了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的。
上边说道每个cell要预测B个bbox,每个bbox除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的groundtruth之间的IoU值
在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的损失函数分为四部分坐标预测、含object的bbox confidence预测、不含object的bbox confidence预测、类别预测,参数的解释:
其中只有当某个网格中有object的时候才对classification error进行惩罚,只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而cell中两个bbox哪个负责就要看其预测值和ground truth box的IoU,IoU最大的负责。
不同类别数量的问题
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要大。
https://arxiv.org/abs/1612.08242
可以看到骨干网络换成了DarkNet
只有YOLO v1明确提出了loss公式,V2和V3都使用了anchor的概念,因此计算loss的方式做出了调整 。
Yolo1 定位误差高,而且相比于基于区域提议的方法,Yolo1 的召回率偏低。针对Yolo1的这些缺点做了以下优化:
V1 使用 224×224 分辨率图像训练分类网络,并且将分辨率增加到 448 用于检测,mAP提升了4%
在所有的卷积层后增加 BatchNormalization 这可以显著改善网络的收敛性,并且有利于正则化模型,防止过拟合。增加 BN以后移除网络的 dropout 。这将 mAP 提升 2%。
学习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的尺寸,检测效果更好。
对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416*416经过卷积网络下采样最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。Passthrough 层类似于 ResNet中的恒等映射,通过将相邻特征堆叠到不同的通道而不是空间位置,来连接高分辨率特征和低分辨率特征。具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
https://arxiv.org/abs/1804.02767
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, 类似于ResNet引入残差结构)
在实际应用场合中,一个物体有可能输入多个类别,单纯的单标签分类在实际场景中存在一定的限制。举例来说,一辆车它既可以属于 car(小汽车)类别,也可以属于 vehicle(交通工具),用单标签分类只能得到一个类别。因此在 YOLO v3 在网络结构中把原先的 softmax 层换成了逻辑回归层,从而实现把单标签分类改成多标签分类。用多个 logistic 分类器代替 softmax 并不会降低准确率,可以维持 YOLO 的检测精度不下降。
Softmax和logistic 之间的区别是在一个多分类任务中,如果类别是互斥的使用Softmax,因为Softmax类似于onehot编码,只能有一个被激活;如果类别是不互斥的可以使用Logistic,可能同时激活多个单元。
YOLOv4的特点是集大成者,俗称堆料。但最终达到这么高的性能,一定是不断尝试、不断堆料、不断调参的结果
https://arxiv.org/abs/2004.10934
Backbone:CSPDarknet53, Neck:SPP,PAN, Head:YOLOv3
YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3
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
当然,这只是其中一部分,还有其他的创新点,没有一一列出。
这个问题要从不同版本的角度去分析,比如针对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详解 - 知乎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。