日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
目标检测:YOLO V1、YOLO V2、YOLO V3 算法
KITTI自动驾驶数据集的训练和检测过程(人、车检测案例)、KITTI数据集的TFRecord格式存储、YOLO V3/Yolo V3 Tiny 迁移学习
5.7 YOLO算法
学习目标
- 目标
- 掌握YOLO算法原理以及训练损失计算公式
- 应用
- 无
在正式介绍YOLO之前,我们来看一张图:
可以看出YOLO的最大特点是速度快。YOLO在精度上仍然落后于目前最先进的检测系统。虽然它可以快速识别图像中的目标,但它在定位某些物体尤其是小的物体上精度不高。论文中做了精度/时间的权衡。接着之前在概述中所介绍的,进入到真正端到端的目标检测:直接在网络中提取特征来预测物体分类和位置。
YOLO算法系列的演变过程:YOLO->YOLO9000->YOLOv2->YOLOv3
5.7.1 YOLO介绍
YOLO是一种新的目标检测方法。以前的目标检测方法通过重新利用分类器来执行检测。与先前的方案不同,将目标检测看作回归问题从空间上定位边界框(bounding box)并预测该框的类别概率。使用单个神经网络,在一次评估中直接从完整图像上预测边界框和类别概率。由于整个检测流程仅用一个网络,所以可以直接对检测性能进行端到端的优化。
5.7.1.1 YOLO结构
YOLO是很简单直观的图像处理系统,整个过程分为三步:
-
1、把图像缩放到448X448
-
2、在图上运行卷积网络
-
3、根据模型的置信度对检测结果进行阈值处理
一个网络搞定一切,网络结构如下:
论文中的网络架构受GoogleNet的启发,使用网络有24个卷积层,后面是2个全连接层。只使用1×1降维层,后面是3×3卷积层。没有使用Inception模块。
论文还使用训练了一个快速版本的YOLO,旨在推动快速目标检测的界限。快速YOLO使用具有较少卷积层(9层而不是24层)的神经网络,在这些层中使用较少的滤波器。基本版YOLO和快速YOLO网络的最终输出是7×7×30的预测张量。
5.7.1.2 统一检测过程理解
- 1、原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7 x 7 x 30的结构
怎么理解这个过程?系统将输入图像分成S×S的网格。如果目标的中心落入某个网格单元中,那么该网格单元就负责检测该目标。
以图示的方式演示,默认7 x 7个单元格,这里用3 x 3的单元格图演示
2、每个网格单元都会预测B个边界框和这些框的置信度分数(confidence scores)
3、进行NMS筛选,筛选概率以及IoU
5.7.1.3 单元格(grid cell)
上面第二步是理解YOLO网络的关键。图片输入到YOLO之后只会得到7 x 7 x 30的输出结果。每个网格单元都会预测B个边界框和这些框的置信度分数(confidence scores),这些置信度分数反映了该模型对那个框内是否包含目标的信心,以及它对自己的预测的准确度的估量。
置信度与边界框
最后网络输出的7 x 7 x 30的特征图怎么理解?7 x 7=49个像素值,理解成49个单元格,每个单元格可以代表原图的一个方块。单元格需要做的两件事:
-
每个边界框包含两个目标预测,每个目标包括5个预测值:x,y,w,h和置信度
-
每个单元格预测两个(默认)bbox位置,两个bbox置信度(confidence) : 7 x 7 x 2=98个bbox
- 30=(4+1+4+1+20), 4个坐标信息,1个置信度(confidence)代表一个bbox的结果, 20代表 20类的预测概率结果
5.7.1.4 网格输出筛选
1、置信度比较
Pascal VOC上评估YOLO,使用最终大小S=7,预测数量B=2。
- 一个网格会预测两个Bbox,在训练时我们只有一个Bbox专门负责(一个Object 一个Bbox)
那么如何对每个位置预测的两个bbox进行筛选?
- 通过置信度大小比较
注:所以如何判断一个grid cell中是否包含object呢?如果一个图片中真实的object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
2、预测位置大小-回归offset代替直接回归坐标
每个 bbox 包含5个预测值, (𝑥,𝑦,𝑤,ℎ,𝑐𝑜𝑛𝑓𝑖𝑑𝑒𝑛𝑐𝑒),不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值
- 1、(𝑥,𝑦) 表示 box 的中心相对于 grid cell 原点的偏移值(原点, 即每个 grid cell 的 top-left 顶点, yolo 将之设置为(0, 0), bottom-right顶点设置为(1, 1), 所以 (𝑥,𝑦) 取值范围一定在(0,1)之内).
- 2、(𝑤,ℎ) 为相对于整张图片的宽和高, 即使用图片的宽和高标准化自己, 使之取值范围也在(0, 1)之间.
为什么这样去做?
- 预测相对于网格单元位置的位置坐标。这使得真实值的界限在0到1之间。由于我们限制位置预测,因此参数化更容易学习,从而使网络更加稳定
举例理解:
如前所述,bx、by、bh和bw是相对于正在处理的网格单元计算而言的。下面通过一个例子来说明这一点。以包含汽车的右边网格为例:
由于bx、by、bh和bw将仅相对于该网格计算。此网格的y标签将为(假设总共只有3个类别,分别是行人(c1)、汽车(c2)和摩托车(c3),这里就不拿20类别举例了):
y=(1, bx, by, bh, bw, 0, 1, 0)
由于这个网格中有一个对象为汽车,所以pc=1, c2=1,现在,我们看看如何决定bx,by,bw,bh的取值,论文中分配给所有网格的坐标如下图所示
bx和by是相对于该网格中物体的中心点的x和y坐标,刚才这个例子中,假设近似bx=0.4和by=0.3:
bh是边界框的高度与相应单元网格的高度之比,如图中假设bh=0.9,同理bw=0.5。所以最后预测的结果应该为:
y=(1, 0.4, 0.3, 0.9, 0.5, 0, 1, 0)
注:bx和by将始终介于0和1之间,因为中心点始终位于网格内,而在边界框的尺寸大于网格尺寸的情况下,bh和bw可以大于1。
关于 yolo 的预测的 bbox 中心坐标是相对于 grid cell 左上角的偏移值, 不是直接预测而是预测偏移值, 但是, 预测的 x, y 可能为负数啊, 这样 (x, y) 就不在该 cell 中了, yolo v2 通过 (sigmoid(x), sigmoid(y)) 来解决这个问题.
YOLO V1的偏移计算
3、测试阶段
- yolo 预测的不是类的概率而是类的条件概率, 即条件为如果这个 cell 中包含物体(条件),那么这个物体是N 类前景中每一类的概率;
- 即每个框有20个概率值,但是并不会直接使用这个值,这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的值。
最终:测试的时候,条件类概率和每个框的预测的置信度值相乘得到每个框特定类别的置信度分数。这些分数体现了该类出现在框中的概率以及预测框拟合目标的程度。
理解:这个乘积即 encode 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。得到每个 box 的 class-specific confidence score 以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行 NMS 处理,就得到最终的检测结果。
非最大抑制(NMS)
每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉概率的低的bbox,对每个类别过滤IoU,就得到最终的检测结果
5.7.1.5 训练
背景
论文中使用的YOLO模型事先ImageNet的1000类竞赛数据集上预训练的卷积层。对于预训练,使用比较了基本版本YOLO中的前20个卷积层,接着是平均池化层和全连接层。对这个网络进行了大约一周的训练,并且在ImageNet 2012验证集上获得了单一裁剪图像88%的top-5准确率,最后将转换模型来执行检测训练。使用Darknet框架进行所有的训练和推断。
1、训练损失
通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间。将边界框x和y坐标参数化为特定网格单元位置的偏移量,所以它们的值被限定在在0和1之间。
- 损失
- 三部分损失 bbox损失+confidence损失+classfication损失
模型输出的平方和误差进行优化。选择使用平方和误差,是因为它易于优化。但是由此不会得到很理想的结果。
1、因为分类误差与定位误差的权重是一样的,但是粒度并不一样;2、并且每个图像都有很多网格单元并没有包含任何目标,这将这些单元格的“置信度”分数定位零,通常压制了包含目标的单元格的梯度。这可能导致模型不稳定,从而导致训练在早期就发散。
- 解决办法:
- 为了弥补平方和误差的缺陷,增加了边界框坐标预测的损失,并减少了不包含目标的框的置信度预测的损失。
- 使用两个参数λcoord和λnoobj来实现这一点。 实验设定λcoord= 5和λnoobj= .5。
- 下面包含:bbox,confidence,categories的损失
2、训练细节
- 1、YOLO模型分为两部分,分类模型和检测模型,前者使用在ImageNet上预训练好的模型,后者在检测数据集上fine-tuning。
- YOLOv1在预训练时采用的是224x224的输入(在ImageNet数据集上进行),然后在检测的时候采用448x448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
- 2、用Pascal VOC 2007和2012的训练集和验证数据集进行了大约135个迭代的网络训练。因为仅在Pascal VOC 2012上进行测试,所以训练集里包含了Pascal VOC 2007的测试数据。在整个训练过程中,使用的批量大小是64,动量为0.9,衰减率是0.0005。
-
3、学习率变化如下:在第一个迭代周期,将学习率从0.001慢慢地提高到0.01。如果从大的学习率开始训练,模型通常会由于不稳定的梯度而发散。继续以0.01进行75个周期的训练,然后以0.001进行30个周期的训练,最后以0.0001进行30个周期的训练。
-
4、为避免过拟合,使用了Dropout和大量的数据增强。 在第一个连接层之后的dropout层的丢弃率设置为0.5,以防止层之间的相互适应。 对于数据增强,引入高达20%的原始图像大小的随机缩放和平移。还在HSV色彩空间中以高达1.5的因子随机调整图像的曝光度和饱和度。
5.7.2 与Faster R-CNN比较
Faster R-CNN利用RPN网络与真实值调整了候选区域,然后再进行候选区域和卷积特征结果映射的特征向量的处理来通过与真实值优化网络预测结果。而这两步在YOLO当中合并成了一个步骤,直接网络输出预测结果进行优化。
所以经常也会称之为YOLO算法为直接回归法代表,特点是快速。以下为PASCAL VOC 2007上的实时系统测试:
-
快速YOLO是PASCAL上最快的目标检测方法;据我们所知,它是现有的最快的目标检测器。具有52.7%的mAP,实时检测的精度是以前的方法的两倍以上。普通版YOLO的mAP达到63.4%的同时保持了实时性能。
-
论文还使用VGG-16训练YOLO。 这个模型比普通版YOLO更精确,但也更慢。 它的作用是与依赖于VGG-16的其他检测系统进行比较,但由于它比实时更慢,所以本文的其他部分将重点放在我们更快的模型上。
- Faster R-CNN的VGG-16版本比YOLO高出10mAP,但比YOLO慢了6倍。
5.7.3 YOLO总结
- 优点
- 第一YOLO速度非常快。由于我们将检测视为回归问题,所以我们不需要复杂的流程。测试时,我们在一张新图像上简单的运行我们的神经网络来预测检测结果。在Titan X GPU上不做批处理的情况下,YOLO的基础版本以每秒45帧的速度运行
- 第二YOLO是在整个图像上进行推断的:与基于滑动窗口和候选框的技术不同,YOLO在训练期间和测试时都会顾及到整个图像,所以它隐式地包含了关于类的上下文信息以及它们的外观。与Fast R-CNN相比,YOLO的背景检测成目标的误检数量少了一半。
- 第三YOLO能学习到目标的泛化表征。把在自然图像上进行训练的模型,用在艺术图像进行测试时,YOLO大幅优于DPM和R-CNN等顶级的检测方法。由于YOLO具有高度泛化能力,因此在应用于新领域或碰到意外的输入时不太可能出故障。
- 缺点
- 准确率会打折扣
- YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了一个结果。
- 如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
5.7.4 总结
- YOLO算法原理以及训练损失计算公式
5.8 YOLOV2&V3
学习目标
- 目标
- 掌握YOLOV2的改进方法
- 掌握YOLOV3的网络改进
- 应用
- 无
5.8.1 YOLOV2介绍
YOLO v2的题目叫做:《YOLO9000:Better,Faster,Stronger》,是17年的一篇论文。达到了当时的state-of-art的效果。为什么叫9000?当时论文训练YOLO9000,一个实时的目标检测器,可以检测超过9000种不同的目标类别。也就是支持实时检测许多目标类型。(我们说的YOLOV2与YOLO9000有些区别,在于训练上的区别)
YOLO2是YOLO的升级版本,在YOLO的基础上用到了很多trick,尤其是结合了anchor box。前面提到yolo v1的缺点在于bbox的定位不准,精度低,对于小物体的检测效果不好,所以yolo v2吸收了其他很多算法来解决这些问题。
可以这样说V2版本,主要有一下工作
- 把多种物体检测网络(例:Faster R-CNN)和分类网络(ResNet,GoogleNet)的特点加入进去,并且使用ImageNet分类数据集训练了最终物体分类部分,然后使用COCO一样的检测数据集训练检测定位部分。
5.8.1.1 改进方法
1、Better(更好)-七种方式
与最先进的检测系统相比,YOLO存在各种缺点。 YOLO与Fast R-CNN的误差比较分析表明,YOLO产生了大量的定位错误。
- 1、批标准化(Batch Normalization ):批量标准化可以显着改善收敛性,而且不再需要其他形式的正则化。通过在YOLO中的所有卷积层上添加批量标准化,可以在mAP中获得了2%以上的改进。
- 2、高分辨率分类器(High Resolution Classifier)
- YOLOv2则将预训练分成两步:先用224x224的输入在ImageNet数据集训练分类网络,大概160个epoch(将所有训练数据循环跑160次)后将输入调整到448x448,再训练10个epoch(这两步都是在ImageNet数据集上操作)。然后利用预训练得到的模型在检测数据集上fine-tuning。这样训练得到的模型,在检测时用448x448的图像作为输入可以顺利检测。
- 3、基于卷积的Anchor机制(Convolutional With Anchor Boxes ):从YOLO中移除全连接层,并使用锚框来预测边界框。
- YOLOv2通过缩减网络,使用416x416的输入,模型下采样的总步长为32,最后得到13x13的特征图,然后对13x13的特征图的每个cell预测5个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后,YOLOv2可以预测13x13x5=845个边界框,模型的召回率由原来的81%提升到88%,mAP由原来的69.5%降低到69.2%.召回率提升了7%,准确率下降了0.3%。
- 4、维度聚类(Dimension Clusters ):
- Faster-RCNN中anchor boxes的个数和宽高维度往往是手动精选的先验框(hand-picked priors),设想能否一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置,YOLOv2使用k-means聚类算法对训练集中的边界框做了聚类分析,尝试找到合适尺寸的Anchor。
- 作者发现如果采用标准的k-means聚类,在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关:
YOLOv2采用的5种Anchor可以达到的Avg IOU是61,而Faster-RCNN采用9种Anchor达到的平均IOU是60.9,也即是说本文仅仅选取5种Anchor就可以达到Faster-RCNN中9种Anchor的效果。
第二个问题如下:
- 5、直接位置预测(Direct location prediction ):模型不稳定大多数来自于预测框中位置。在FasterRCNN的候选区域网络中,网络预测的tx,ty。
- YOLOV2没有预测偏移,而是遵循YOLOV1的方法,预测相对于网格单元位置的位置坐标。这使得真实值的界限在0到1之间。
网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to。如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应的box维度(bounding box prior)的长和宽分别为(pw,ph),那么对应的box为:
由于我们限制位置预测,因此参数化更容易学习,从而使网络更加稳定。 使用维度聚类并直接预测边界框中心位置,可以使YOLO比锚框的版本提高近5%。
- 6、细粒度功能(Fine-Grained Features ):修改后的YOLO在13×13特征图上预测检测结果。 虽然这对于大型物体是足够的,但使用更细粒度特征对定位较小物体有好处。
- 修改:添加一个直通层,以26×26的分辨率从较早的层中提取特征。
- 实现与作用:直通层将高分辨率特征与低分辨率特征连接起来,将相邻特征叠加到不同的通道中,而不是空间位置上,类似于ResNet中的恒等映射。将26×26×512的特征图变为13×13×2048的特征图。最终性能提高了1%。
- 7、多尺度训练(Multi-Scale Training ):原来的YOLO使用448×448的输入分辨率。通过添加锚框,将分辨率更改为416×416。但是,由于我们的模型仅使用卷积层和池化层,因此可以实时调整大小。希望YOLOv2能够在不同尺寸的图像上运行,因此可以将多尺度训练应到模型中。
- 每隔几次迭代就改变一次网络。每10个批次我们的网络会随机选择一个新的图像尺寸大小。由于模型缩减了32倍,所以从32的倍数中抽取:{320,352,…,608},因此,最小的选项是320×320,最大的是608×608
5.8.1.2 结构与训练
1、YOLOV2更快的效果
在VOC2007上的精度和速度比较(论文中还在VOC2012数据集中做了更多的实验比较):
YOLOV2修改的结构对mAP的提高影响如下:
注:从YOLO到YOLOv2的路径。大多数列出的设计决策都会导致MAP显着增加,但其中切换到带有锚框的全卷积网络和使用新网络。切换到锚框方法增加召回率,而不改变mAP。
2、Darknet-19更快的模型
论文坐着使用一个新的分类模型作为一个新的分类模型作为YOLOv2的基础
- Darknet-19,它有19个卷积层和5个Maxpool层,中间大多使用3x3滤波器,也是用全局平均池化来做预测,使用1x1滤波器来压缩3x3的特征表示,批量归一化来稳定训练,加速收敛,并规范模型。
- 有一个比较:Darknet-19只需要55.8亿次操作来处理图像,VGG-16的卷积层在一个224×224分辨率单个图像上运行一次需要306.90亿浮点运算
(1)分类训练:
给予DarkNet神经网络框架
- 训练参数:Darknet-19在标准1000类的ImageNet上训练
- 1、使用随机梯度下降,初始学习率为0.1,多项式速率衰减为4,权重衰减为0.0005
- 2、动量为0.9,在标准ImageNet 1000类别分类数据集上对网络进行160个迭代周期的训练
- 数据处理
- 训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。
- 分类微调:
- fine-tuning:第1步结束后,改用448x448输入(高分辨率模型),学习率改为0.001,训练10个epoch,其他参数不变。结果表明:fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,若按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。可以看出,两步分别从网络结构和训练方式方面入手提高了网络分类准确率。
(2)检测训练:
- 网络修改:
- 1、修改网络:去除最后一个卷积层,然后添加三个具有1024个滤波器的3X3的卷积层,然后在最后添加1×1卷积层,该层的滤波器数量是检测需要的输出数量
- 2、在VOC中,论文选择预测5个边界框,每个边界框有5个坐标和20个类别,所以有125个输出维度
- 3、还添加了从最后的3×3×512层到倒数第二层卷积层的直通层,以便我们的模型可以使用细粒度特征
- 训练参数
- 1、训练网络160个迭代周期,初始学习率为10-3,在60和90周期除以10。我们使用0.0005的权值衰减和0.9的动量
- 数据处理
- 进行类似的增强技巧
5.8.1.3 联合分类与检测训练-YOLO9000(了解)
论文坐着提出了将分类数据和检测数据综合的联合训练机制,训练了可以识别超过9000种物品的实时目标检测与识别系统-YOLO9000。(方法也是值得去进行借鉴的)
-
过程:当网络遇到一张属于检测数据集的图片就基于YOLOv2的全部损失函数(包含分类部分和检测部分)做反向传播。当网络遇到一张属于分类数据集的图片就仅基于分类部分的损失函数做反向传播。
-
难度:要检测更多对象,从原来的VOC(检测数据集)的20种对象,扩展到ImageNet(分类数据集)的9000种对象。
大多数分类的方法采用softmax层,考虑所有可能的种类计算最终的概率分布。但是softmax假设类别之间互不包含,但是整合之后的数据是类别是有包含关系的。所以ImageNet的对象类别与COCO的对象类别不是互斥的。比如COCO对象类别有“狗”,而ImageNet细分成100多个品种的狗,狗与100多个狗的品种是包含关系,而不是互斥关系。
1、Hierarchical classification(多层分类)
ImageNet的数据标签来源于WordNet,论文根据WordNet建立了ImageNet标签的树(WordTree)。将ImageNet和COCO中的名词对象一起构建了一个WordTree。
其实就是一种包含关系,比如说terrier(猎狗)节点之下的Norfolk terrier、Yorkshire terrier、Bedlington terrier等,各品种的terrier之间是互斥的,所以计算上可以进行softmax操作。进行如下的softmax,同级之间可以建立:
构建好的WordTree有9418个节点(对象类型),如何表达一个对象呢?如果也是n维向量(这里WordTree有9418个节点(对象),即9418维向量),使预测的对象那一位为1,其它维都为0,但是这样的形式依然表示所有互斥关系,这样是不合理的。所以需要根据子节点来表示,如上图thing,matter,object,phenomenon为一个softmax向量,长度为4。
联合训练细节
- 1、由于ImageNet样本比COCO多得多,所以对COCO样本会多做一些采样(oversampling),适当平衡一下样本数量,使两者样本数量比为4:1
- 2、5个先验框减少到3个先验框,以减少计算量。YOLO2的输出是13x13x5x(4+1+20),现在YOLO9000的输出是13x13x3x(4+1+9418)
5.8.1.4 总结
- 1、使用WordTree将各种来源的数据和我们的联合优化技术相结合,在ImageNet和COCO上同时进行训练。 YOLO9000向缩小检测和分类之间的数据集大小的差距迈出了坚实的一步。
- 2、YOLOv2在各种检测数据集中都是最先进的,并且比其他检测系统更快。
5.8.2 YOLOV3介绍
YOLOV3是前几个版本同一个作者,在18年做的一次改进。
比YOLOv2稍大一些,但更准确,速度仍然很快,在320×320 YOLOv3运行22.2ms。下图是在K40上的测试时间以及mAP
5.8.2.1 改进
网络结构变化
论文网络使用连续的3×3和1×1卷积层,有53个卷积层,称之为 Darknet-53
逻辑回归替代softmax作为分类器
不使用softmax,发现它对于高性能没有必要,所以作者只是使用独立的逻辑分类器。 在训练过程中,使用二元交叉熵损失来进行类别预测。
训练
与之前YOLOV2类似,注意不是9000那个模式。做了多尺度训练,数据增强等等。
5.8.2.2 总结
最终效果对比:
5.8.3 总结
- YOLOV2的改进方法
- YOLOV3的网络改进
YOLO的核心思想
- YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
- faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。
YOLO的实现方法
- 将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
- 每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。
- 每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。 - 举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
整个网络结构如下图所示:
- 在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处理,就得到最终的检测结果。
YOLO的实现细节
- 每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。
其中坐标的x和y用对应网格的offset归一化到0~1之间,w和h用图像的width和height归一化到0~1之间。 - 在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。
这种做法存在以下几个问题:
第一,8维的localization error和20维的classification error同等重要显然是不合理的;
第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。 - 解决办法:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为λcoord在pascal VOC训练中取5。
对没有object的box的confidence loss,赋予小的loss weight,记为λnoobj在pascal VOC训练中取0.5。
有object的box的confidence loss和类别的loss的loss weight正常取1。 - 对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。- 一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。
- 最后整个的损失函数如下所示:
这个损失函数中:
只有当某个网格中有object的时候才对classification error进行惩罚。
只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。
其他细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等,在这里就不一一赘述了。
- YOLO的缺点
YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况时泛化能力偏弱。
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
YOLO核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度还不行。 YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。
YOLO的主要特点:
- 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
- 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
- 泛化能力强。
1.Resize成448*448,图片分割得到7*7网格(cell)
2.CNN提取特征和预测:卷积不忿负责提特征。全链接部分负责预测:
- a) 7*7*2=98个bounding box(bbox) 的坐标
和是否有物体的confidence 。
- b) 7*7=49个cell所属20个物体的概率。
3.过滤bbox(通过nms)
网络设计:
网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )
- 预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。
- 训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增加卷积和全链接层可以改善性能。在他们例子基础上添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也又224*224变成448*448。见Figure3。
- 一幅图片分成7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体
- 最后一层输出为 (7*7)*30的维度。每个 1*1*30的维度对应原图7*7个cell中的一个,1*1*30中含有类别预测和bbox坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。具体如下:
- 每个网格(1*1*30维度对应原图中的cell)要预测2个bounding box (图中黄色实线框)的坐标
,其中的中心坐标的
相对于对应的网格归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。 每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:confidence =
。其中如果有ground true box(人工标记的物体)落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的ground truth box之间的IOU值。即:每个bounding box要预测
,共5个值 ,2个bounding box共10个值,对应 1*1*30维度特征中的前10个。
- 每个网格还要预测类别信息,论文中有20类。7x7的网格,每个网格要预测2个 bounding box 和 20个类别概率,输出就是 7x7x(5x2 + 20) 。 (通用公式: SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的)
- 损失函数设计
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足: - a) 8维的localization error和20维的classification error同等重要显然是不合理的;
- b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。
解决方案如下:
- 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord,在pascal VOC训练中取5。(上图蓝色框)
- 对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj,在pascal VOC训练中取0.5。(上图橙色框)
- 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
- 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
- 一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)
-
测试:Test的时候,每个网格预测的class信息
和bounding box预测的confidence信息
相乘,就得到每个bounding box的class-specific confidence score。等式左边第一项就是每个网格预测的类别信息,第二项+第三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
- 对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
- 得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
- 缺陷:
YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。
由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
前言
end-to-end方法的典型代表就是有名的YOLO。YOLO将物体检测作为一个回归问题进行求解,输入图像经过一次inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast-rcnn/faster-rcnn将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。
YOLOV1
1 技术架构
YOLO网络借鉴了GoogLeNet分类网络结构,不同的是,YOLO未使用inception-module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+ 3x3卷积层简单替代。
1.2 网络模型结构 - 端对端(将Obj Detection问题转化为Regression问题)
1.2.1 输入
- YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。何为之落入?若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。
- 如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。
- 个人理解:依据最终输出特征图的大小m * m,对应的将图片分为S * S,且S = m;
1.2.2 输出
- 在每个cell上生成2个Bbox, Bbox信息包含5个数据值,分别是x,y,w,h,和confidence。
- 其中:
- x,y是指当前格子预测得到的物体的Bbox的中心位置的坐标。
- w,h是Bbox的宽度和高度。
- confidence反映当前Bbox是否包含物体以及物体位置的准确性,计算方式如下:
![]()
- 其中,若bounding box包含物体,则P(object) = 1;否则P(object) = 0。
- IOU为预测Bbox与物体真实区域的交集与并集的比值。
- 注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是Bbox中心位置相对于当前cell左上角位置的偏移值,并且被归一化到[0,1];
- 另外,针对每个cell,输出cell(只针对IOU最大的Bbox)属于类别的概率分布;
- 因此每个cell只负责一个obj的检测(20维度的class概率分布),及2个prior box的坐标和置信度的预测;
- 因此,YOLO网络最终的全连接层的输出维度是S * S * (B * 5 + C )。
- YOLO论文中,作者训练采用的输入图像分辨率是448x448,S=7,B=2;采用VOC 20类标注物体作为训练数据,C=20。因此输出向量为7 * 7 * (20+2 * 5)=1470维。
2 训练
2.1 分类模型与检测模型
- 分类与检测:
- 分类:将一个obj划分为某一类;
- 检测:识别一张图片中包含的obj及obj的位置。
- 训练分类网络:在1000类ImageNet数据集上预训练一个分类网络,这个网络是Figure3中的前20个卷积网络 + APL层 + FC层(此时网络输入是224*224);
- 训练检测网络:在分类网络的基础上进行fine-tune,取其前20层卷积层,添加4个卷积层和2个全链接层,随机初始化权重同时把网络输入也由224*224变成448*448。见Figure3。
- 其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。
2.2 yolo-loss
- YOLO对上式loss的计算进行了如下修正,以分类误差为单位进行修正;
- 位置相关误差(坐标、IOU)与分类误差对网络loss的贡献值是不同的,因此YOLO在计算loss时,使用
修正coordError。
- 在计算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值是不同的。若采用相同的权值,那么不包含物体的格子的confidence值近似为0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用
修正iouError。(注此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内)
- 对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。(注:这个方法并不能完全解决这个问题)。
3 测试阶段
3.1 class-specific confidence score
- 对每一个网格的每一个bbox执行同样操作:7x7x2=98bbox(每个bbox既有对应的class信息又有坐标信息)
3.2 非极大值抑制(NMS)
- 将所有框的得分排序,选中最高分及其对应的框;
- 遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除;
- 从未处理的框中继续选一个得分最高的,重复上述过程。
4 优缺点
- 优点:
- 速度快:GPU:titan x,mAP:63.4%,数据集:VOC,检测速度:45fps;
- 背景误检率低:YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region-proposal的物体检测方法(如rcnn/fast-rcnn),在检测过程中,只‘看到’候选框内的局部图像信息;
- 泛化能力强:YOLO模型可以学到更加一般的特征,对艺术类作品中的物体检测同样适用。
- 缺点:
- 识别物体位置精准性差;
- 召回率低。
- 每个cell仅预测2个Bbox(Yolo-V1);
- 最终只选择IOU最高的Bbox作为物体检测输出,即每个cell最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
- 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
YOLO-V2
0 前言 - 改进的YOLO-V2:Better、Faster
1 技术架构
1.1 预训练分类模型 -- darknet19
- 模型结构
- 模型结构特征:
- Input-Size:224 * 224
- 采用3 * 3小卷积核及使用2 * 2 max-pooling将feature-map尺寸缩小一倍,同时将channel翻倍;
- 通过1 * 1的卷积核对feature-map进行特征融合(压缩通道);
- 最后使用1000channel的1 * 1的卷积核进行卷积,最后通过GAP(Global Average Pooling)获取提取最终1000维的特征;
- 在最终7*7*1000的特征图上,每个channel(7*7)获取一个均值;
- 最终通过softmax进行分类。
- 提高Input-Size:448 * 448 进行fine-tune(10 epochs)。
1.2 训练检测模型 -- fine-tune darknet19
- 模型修改:
- Input-Size:416 * 416 --> 输出的feature-map尺寸为奇数(13 * 13);
- 作者观察到一般图片种的对象会占据中心的位置,这样可以使用feature-map中心的cell来单独负责该物体的预测;
- 移除最后一个卷积层、GAP层、softmax层;
- 新增3个3 * 3 * 1024卷积层;(TODO:有待源码验证)
- 新增passthrough层 - 融入更精细的feature-map;
- 采用最后一个max-pooling的输入feature-map:26 * 26 * 512
- passthrough实现实例:
- 隔行隔列获取数据?
- 在具体实现的时候,先通过64个1*1的卷积核对26 * 26 * 512的feature-map进行压缩;之后进行passthrough操作,形成13*13*256的feature-map与新增加的第二个卷积结果的feature-map进行concate,输出13 * 13 * (256+1024)的feture-map;
- 通过增加的最后一层3*3卷积输出13 * 13 * 1024的feature-map;
- 模型结构:
2 训练
2.1 改进策略
YOLOV3
1 技术架构
1.1 网络结构图:yolov3最精细网络结构图:一图看懂yolov3网络结构
2 训练
2.1 anchors聚类
1.原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7 x 7 x 30的特征图。
根据7x7的特征图大小在输入原图上分成7x7=49个网格,如果目标的中心落入到某个网格单元cell中,那么该网格单元cell就负责检测该目标。
7x7的特征图大小:7x7=49个像素值,理解成49个单元格,每个单元格可以代表原图的一个方块。
2.每个网格单元cell都会预测N个边界框bounding boxes和每个bbox框的1个置信度分数confidence scores,
这些置信度分数反映了该模型对那个框内是否包含目标的信心,以及它对自己的预测的准确度的估量。
3.yolo V1、yolo V2、yolo V3 的bbox(边界框bounding boxes)数目变化
1.yolo V1:
1.每个网格单元cell预测2个(默认)bbox(边界框bounding boxes):输入图像一共有 7x7x2=98个bbox(边界框bounding boxes)
2.每个bbox(边界框bounding boxes)包含4个预测位置(x、y、w、h),1个bbox置信度分数confidence scores
3.一个网格单元预测cell的2个(默认)bbox(边界框bounding boxes)一共的预测数据量:2x(4+1)+20=30
4个预测位置(x、y、w、h)和1个bbox置信度分数confidence scores代表一个bbox的预测数据量。
20代表1个bbox的20个类别的预测概率值,每个单元格选出20个类别的预测概率中的最大概率值的一个类别,那么一个单元格就只能代表一个类别,
这也是yolo V1的缺点,yolo V1就只会1个单元格cell预测1个目标物体,对于检测效果并不好,因此并不建议使用yolo V1。
4.输入图像一共预测的数据量:7x7x(2x(4+1)+20)=1470
7x7的特征图大小即输入图像中的网格数。
2x(4+1)即每个网格都预测2个边界框bounding boxes的4个预测位置(x、y、w、h),1个bbox置信度分数confidence scores。
加20即是因为在yolo V1中一个网格中的2个bbox中最终只会有1个bbox用于预测目标物体,因此如果多个目标物体都在一个单元格cell中出现的话,
如果使用了yolo V1就只会1个单元格cell预测1个目标物体,对于检测效果并不好,因此并不建议使用yolo V1。
2.yolo V2:
1.每个网格单元cell都使用5种(默认)不同尺寸的锚框Anchor boxes来预测bbox(边界框bounding boxes),
一个网格单元cell中每种不同尺寸的锚框Anchor boxes各预测一个bbox(边界框bounding boxes),一共预测5个(默认)bbox(边界框bounding boxes)。
输入图像一共预测有 13x13x5=845个bbox(边界框bounding boxes)。
注意:5个(默认)的锚框Anchor boxes的尺寸大小都是不一样的。
2.每种不同尺寸的锚框Anchor boxes所预测的bbox(边界框bounding boxes)包含:4个预测位置(x、y、w、h),1个bbox置信度分数confidence scores,
N个分类类别的预测概率值。
3.一个网格单元cell中5种(默认)不同尺寸的锚框Anchor boxes所预测的5个(默认)bbox(边界框bounding boxes)一共预测的数据量(假如预测20个类别):
5x(4+1+20)=125
5代表5个(默认)bbox(边界框bounding boxes)。
每个bbox(边界框bounding boxes)都分别有4个预测位置(x、y、w、h),1个bbox置信度分数confidence scores,20个类别的预测概率值。
4.输入图像一共预测的数据量(假如预测20个类别和在13x13特征图上做预测):13x13x(5x(4+1+20))=169*125=21125
5.YOLO V2基于卷积的Anchor机制(Convolutional With Anchor Boxes):从YOLOV1中移除全连接层,
并使用5个(默认)不同尺寸的锚框Anchor boxes来预测bbox(边界框bounding boxes)。
YOLO V2通过缩减网络,使用416x416的输入,模型下采样的总步长为32,最后得到13x13的特征图,13x13的特征图对应在输入原图分割13x13个单元格cell。
每个单元格cell预测5个不同尺寸锚框anchor boxes对应的bbox(边界框bounding boxes),每个锚框anchor box所预测的bbox(边界框bounding boxes)
包含4个位置信息、1个置信度、N个分类类别的概率值。
YOLO V2采用的5种不同尺寸锚框Anchor boxes可以预测13x13x5=845个bbox(边界框bounding boxes)。
YOLO V2引⼊faster rcnn中anchor机制,anchor尺度就是用来预测网络预测值和目标GT做尺度变换的。
6.维度聚类
Faster-RCNN中anchor boxes的个数和宽高维度往往是手动精选的先验框(hand-picked priors),
设想能否一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置,
YOLOv2使用k-means聚类算法对训练集中的边界框做了聚类分析,尝试通过维度聚类找到合适尺寸的锚框Anchor boxes。
YOLOV2没有使用FasterRCNN预测偏移和尺度变换。而是遵循YOLOV1的方法,预测相对于网格单元位置的位置坐标。
这使得真实值的界限在0到1之间。
3.yolo V3:
1.特征金字塔(FPN网络)
yolo V3使用了特征金字塔(FPN网络),yolov3在3个不同尺度的特征图上做预测。
比如:13x13,26x26,52x52三个不同尺度特征图上的每个单元格cell分别使用3种(默认)不同尺寸的锚框Anchor boxes来预测bbox(边界框bounding boxes)。
每种不同尺寸的锚框Anchor boxes所预测的bbox(边界框bounding boxes)包含:4个预测位置(x、y、w、h),1个bbox置信度分数confidence scores,
N个分类类别的概率值。
那么一个NxN的特征图大小就有NxN个网格单元cell,那么每个网格单元cell预测数据量为3x(4+1+N个分类类别的概率值),
一整个特征图一共预测数据量为NxNx(3x(4+1+N个分类类别的概率值))。
yolo V3在13x13,26x26,52x52大小的三个特征图做预测计算,特征图比例大小分别是13x13为NxN,26x26为2x(NxN),52x52为4x(NxN),
那么3个不同尺度特征图一共预测数据量为(NxN + 2x(NxN) + 4x(NxN)) x (3x(4+1+N个分类类别的概率值))
2.每种不同尺度特征图上所设置的先验框(bbox边界框bounding boxes)大小,
会从下面的array数组yolo_anchors中选出对应合适的组合作为先验框(bbox边界框bounding boxes)的大小。
yolo_anchors = np.array([(10, 13), (16, 30), (33, 23), (30, 61), (62, 45), (59, 119), (116, 90), (156, 198), (373, 326)],
np.float32) / 416
1.yolo V2、yolo V3中的每个bbox(边界框bounding boxes)的预测值:4个预测位置(x、y、w、h)、1个bbox置信度分数confidence scores、N个类别的预测概率值。
2.(x, y) 表示bbox的中心点相对于单元格(grid cell)原点的偏移值,单元格(grid cell)的原点即为当前单元格的左上角的顶点(top-left),
yolo将左上角的顶点(原点)设置为(0, 0),右下角的顶点设置为(1, 1),所以x和y的取值范围都分别是在0到1之间。
x和y将始终介于0到1之间,因为中心点始终位于单元格(grid cell)内。
之所以把(x, y)预测为相对于网格单元cell的位置坐标,使得真实值的界限在0到1之间,因此参数化更容易学习,从而使网络更加稳定。
3.(w, h) 表示为相对于整张图片的宽和高, 即使用图片的宽和高标准化自己。
如果边界框bbox的尺寸小于单元格(grid cell)的尺寸的话,w和h的取值范围都分别是在0到1之间。
如果边界框bbox的尺寸大于单元格(grid cell)的尺寸的话,w和h的取值范围都可以大于1。
4.yolo V2、yolo V3都基于卷积的Anchor机制(Convolutional With Anchor Boxes)
yolo V2使用5种不同尺寸的锚框Anchor boxes预测边界框的4个位置信息、1个置信度、N个分类类别的概率值。
yolo V3使用3种不同尺寸的锚框Anchor boxes预测边界框的4个位置信息、1个置信度、N个分类类别的概率值。
5.比如在yolo V2中,13*13特征图上的每个单元格(grid cell)中预测5个不同尺寸的锚框Anchor boxes。
anchor尺寸就是用来预测网络预测值和目标GT之间做尺度变换的。
比如下面的蓝色框是预测的bbox(边界框bounding boxes),黑色点的矩形框是锚框Anchor boxes。
每一个bbox(边界框bounding boxes)都预测:tx、ty、tw、th、to(置信度)。
如果这个单元格(grid cell)距离输入原图的左上角原点的边距离为(cx,cy),该单元格(grid cell)对应的边界框bbox维度(边界框优先bounding box prior)的长和宽分别为(pw,ph),
那么对应的边界框bbox计算结果实际为:
1.yolo V2中不同尺寸的锚框Anchor boxes所预测的bbox(边界框bounding boxes)的4个位置信息为(tx, ty, tw, th),
那么tx和ty分别为相对于单元格(grid cell)原点的0到1之间取值的值,tw和th则根据所预测的bbox(边界框bounding boxes)是大于还是小于单元格(grid cell)的尺寸来决定
tw和th的取值范围是在0到1之间还是在大于1。
2.pw和ph分别为手动设定的锚框Anchor boxes宽和高,而网络最终计算的预测结果为(bx, by, bw, bh),因此需要把(tx, ty, tw, th)转换为(bx, by, bw, bh)。
3.把(tx, ty, tw, th)转换为(bx, by, bw, bh)作为yolo输出层的最终输出:
σ读作sigma。Cx和Cy分别为当前单元格(grid cell)距离输入原图的左上角原点的边距离。W和H为输入原图像的宽和高。分别除以W和H,目的是归一化。
tx->bx:bx = (σ(tx) + Cx) / W
ty->by:by = (σ(ty) + Cy) / H
tw->bw:bw = (pw * e^tw) / W
th->bh:bh = (ph * e^th) / H
4.σ(tx) + Cx:边界框的中心点在输入原图像中的x坐标,也即边界框的中心点离输入原图像原点的x方向长度
σ(ty) + Cy:边界框的中心点在输入原图像中的y坐标,也即边界框的中心点离输入原图像原点的y方向长度
pw * e^tw:边界框在输入原图像中的宽度
ph * e^th:边界框在输入原图像中的高度