yolov1-v3学习报告
1. yolov1
1.1网络结构
网络结构没有什么说的,看图就行。yolov1的结构是卷积神经网络,就是输入是一张 448 × 448 × 3 448\times 448\times 3 448×448×3的图片最终输出7730的张量。
这里的 7 ∗ 7 7*7 7∗7是将图分成了 49 49 49个方格区域。因为输出的张量是 7 × 7 × 30 7\times 7\times 30 7×7×30的张量,说明每个方格后面都有 30 30 30维的向量。
这30维数据包括两个框的信息,包括框的位置(x,y,这里的位置是相对于当前预测格子的),大小(目标边界框的长度和宽度),置信度。最后还有20个位表示类别,如果是网络预测图片中的目标对象是哪个类,那么这个对应此类的位置就是1.
1.2 网络训练
训练的时候,就是输入一个一个 448 × 448 × 3 448\times448\times3 448×448×3的图片,每个图片都要配上一个标签,标签的信息要有,object的边界框的位置(x,y),大小(w,h),置信度,还有类别。
对于损失函数就是平方和误差:在损失函数中的小trick:开根号 和系数问题
说明:(系数的作用在后面说明)
损失函数的第一行,是网络预测的框的位置和gt框的位置的损失。这里输入的应该是相对当前cell左上角坐标的相对位置;第二行代表预测框的大小的损失(这里注意根号的作用,trick);第三行和第四行代表预测框的置信度误差,这里的置信度误差有两部分,第三行是有目标的cell的预测框,第四行是没有目标的cell的预测框(从公式可以看出,有gt目标的cell,对于没有匹配上gt目标的预测框,我们直接计算置信度损失即可)。(后面有解释为什么有两个);第五行代表类别损失。
1.3 阅读论文中遇到的问题和思考
-
问题1:输出张量中的边界框的位置是相对当前格子的中心,那么训练图片的标签中边界框的位置信息(x,y)也应该是相对位置,那么如何知道是哪个网格的相对位置?怎么处理?
答:给一个图像打标签的时候,目标框中心是绝对的,这个目标的绝对中心点会落入到某一个格子中,这样这个格子就会知道,这个目标是哪一类,可以确定类别;接下来标签中的目标对象的边界框的中心和边界框中心落入的格子的中心做差当作损失函数的x和y。 -
问题2:每个格子都会预测两个框(个数可以调参)但是在推理预测的时候,只能输出一个框,我们应该输出哪一个?
答:应该是输出IOU高的那一个,(这个就是损失函数中控制函数1的作用)。在计算置信度的时候会有P(object),格子中有物体就是1,没有物体就是0 -
问题3:在训练的时候,损失函数中的1控制函数具体是什么意思?1的下角标为什么是ij 而不仅仅是i?
答:的下角标ij,i代表第i个格子,j代表第i个格子中的第j个边界框。在损失函数中,在优化的时候,并不是每个格子的两个边界框都要进行优化,而是仅仅选择有目标的cell中的IOU较大的边界框进行优化。对于没有目标的cell只优化置信度。 -
问题4:计算目标框的类别概率 p i p_i pi是什么?
答:每个格子都会预测两个边界框,选择其中IOU大的边界框,这个时候用大的IOU乘上目标对象的概率(P(object))就是置信度,但是我们还不知道是哪一类的置信度,所以乘上在当前目标条件下的类别概率 P ( c l a s s i ∣ o b j e c t ) P(class_i|object) P(classi∣object)就是输出的分数score。这个 P ( c l a s s i ∣ o b j e c t ) P(class_i|object) P(classi∣object)其实就是预测的哪一个类别。是哪个类别,哪个类别所在的位置就是1. -
问题5:损失函数中的lambda的意义?
在图像中,目标框中心往往只落在几个格子内,然而大多数格子内是没有目标的,所以在计算损失函数的时候,没有目标的格子计算的置信度值就会特别大,优化的重心也就落在没有目标的格子内了,那些有目标的格子计算的值相对就会小很多,他们在优化的时候就变的不重要了 -
问题6:标签中的IOU是怎么计算的?实际复现又是怎么实现的?
答:IOU是预测的边界框和实际的边界框的交并比。在训练时,输入图片和标签,图像输入网络以后利用当前的权重,输出一个目标框,这个目标框再和标签中的目标框做做IOU. -
问题7:损失函数对框的大小计算损失时,为什么要开根号?
答:如果不开根号,在优化过程中,模型更倾向于优化大的目标框。 -
问题8:是每个网格训练出来的框数据都是我们要预测的框么?那49个网格都预测出来框的位置,最终应该选择哪个框?
设定一个阈值,置信度大于此阈值的输出
2. yolov2
yolov1存在的问题:
1.对群体的小目标的效果不好,因为每个cell只预测一个类别
2.对于新目标或者不同比例或者配置的效果不好
3.定位不准确,原因是直接预测目标框而不是利用先验框的方法造成的
yolov2主要在yolov1的基础之上加了一些改进和trick。
2.1 better
2.1.1 Batch Normalization(批量归一化)
批量归一化导致收敛的显着改善,同时消除了对其他形式的正则化的需求。批量归一化可以代替dropout层,而不会过度拟合。
2.1.2 2.High Resolution Classifier(高分辨率分类器)
原始的YOLO在224×224处训练分类器网络,并将分辨率提高到448以进行检测,并使用这个高分辨率在检测数据集上finetune。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。所以YOLOv2增加了在ImageNet数据集上使用 [公式] 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。
2.1.3 Convolutional With Anchor Boxes(卷积生成锚框)
yolov2删除了全连接层,并且用锚框来预测边界框。首先,yolov2移除一个池化层(这个池化层应该是卷积步长为2的卷积层,因为对比yolov1和yolov2的网络结构,并没有发现maxpool层少了,只是发现总缩放少了)。其次,yolov2还将网络缩小为可处理416大小图像,而不是 448 × 448 448\times448 448×448,这么做的目的就是,另特征图的大小是奇数,因为此时只有一个中心单元。大对象往往会占据图片的中心,因此最好在中心位置使用一个位置来预测这些对象,而不是使用附近的四个位置。卷积网络对输入图像进行降采样32倍,因此416的输入图像获得了 13 × 13 13\times13 13×13的输出特征图。
利用锚框时,yolov2将类预测机制和空间位置解耦(yolov1中每格子只能预测一个类别,在yolov2中, 13 × 13 13\times13 13×13每个格子都能预测5个边界框,每个边界框都有类别信息(框的坐标,框的长宽,置信度,还有20个位表示类别信息)。网络最后输出的张量为 13 × 13 × 125 , 125 = ( 4 + 1 + 20 ) × 5 ) 13\times 13\times 125 , 125=(4+1+20)\times5)