目标检测之YOLO系列-V1至V3改进详解

1.常用概念理解

softmax loss:在计算机视觉中,一般一个做多分类的网络的结构为:多个卷积层(池化)->一个或者两个全连接层->softmax层,softmax层的神经元个数由类别数决定(例如有10类,那么softmax层就有10个神经元),每个神经元的输出表示着输入样本属于该神经元代表的类的概率,他们的和为1。数学计算公式为:          

                                                                        softmaxloss=-\sum_{i}^{n}(q(x_i)log(g(x_i))   

 q(xi)表示样本标签概率分布,g(xi)表示神经网络的输出概率分布,n为类别数。例如,有一个3分类任务,类别为【A,B,C】,输入一个样本m,他的类别为B,最终softmax层输出的结果为【0.1,0.6,0.3】,现在我们可以判断此样本为B类,显然判断是对的,那么它的损失loss为L1= -(0*log0.1+1*log0.6+0*log0.3)。如果softmax层输出的结果为【0.6,0.3,0.1】,那么判断为A类,显然判断错误,此时损失loss为L2= -(0*log0.6+1*log0.3+0*log0.1), 显然L2>L1,所以判断错误的损失大于判断正确的损失,符合逻辑。其实很好理解,softmax loss为-logx,其中x为正确类别的概率,它是一个递减函数,x的值越大,loss的越小,同时x越大,它就越可能是正确类别,所以判断错误的损失大于判断正确的损失。

cross entroy loss:理解交叉熵损失之前,我们先看一下,信息量,熵,相对熵(KL散度)等。现有事件a:中国足球得世界杯冠军了;事件b:德国足球得世界杯冠军了。相比于中国,德国得世界杯冠军的可能性更大,所以我们认为事件A的信息量bi比事件B的信息量更大,即可能性越小的事件其信息量越大,极端情况下,确定事件的信息量为0。那么事件a的信息量为I_a = -logP(a), P(a)为事件a发生的概率。熵就是一个随机变量X所有事件的信息量的期望,例如随机变量X表示明天的天气,所有事件为x1=晴天,x2=雨天,x3=多云,对应的概率为P(x1)=0.3,P(x2)=0.5,P(x3)=0.2,那么随机变量X的熵为:-P(x1)logP(x1)+ -P(x2)logP(x2)+ -P(x3)logP(x3)。相对熵用来衡量同一个随机变量可能的不同分布之间的差异,在机器学习分类任务中,样本属于哪一个类别(假设它是一个随机变量Y),存在一个真实分布Q(Y)和预测分布G(Y),我个人觉得机器学习的本质是通过反复训练大量有限的已知样本来使每一个样本的预测分布G(Y)尽可能地逼近真实分布Q(Y),从而获得模型参数,这些参数的实际意义可以理解为在一定程度上描述了所有样本中各个属性对某个样本属于哪一个类别的重要程度,即属性权重。因为样本的真实分布无法知道,所以一般用样本属于哪一类别的概率表示,对于已知标签的样本,它的分布概率取值范围为0或者1,即它的标签类别概率为1,其他类别概率为0。一般Q(Y)用one-hot形式表示,例如3分类任务中,Q(Y)=[0,1,0],表示该样本为属于第二类。G(Y)=[0.3,0.5,0.2],这两个分布之间的差异计算公式为:

                                                                             \small D_{kl}=\sum_{i}^{n}(q(x_i)log\frac{q(x_i)}{g(x_i)})                                                                                 

 xi表示第i个样本,n表示类别总数,Dkl的值越小说明预测分布和真实分布越相似。KL散度是非对称的,一般是真实分布做分子,预测分布做分母,表示的是预测的出来分布相对于真实分布的差异。Dkl表达式展开的后一项即就是交叉熵,即交叉熵的定义公式:

                                                                       crossentroyloss=-\sum_{i}^{n}(q(x_i)log(g(x_i))

看到这里,你肯定会有疑问,cross entroy loss和softmax loss不是一样的吗,其实当q(xi)用one-hot形式表示概率,g(xi)用softmax计算概率(不一定使用softmax计算),softmax loss 和cross entroy loss就是一样的。

logistic loss:logistic regression解决的是二分类问题,所以可以把它是softmax loss的一种特例。所以它的损失计算公式可以简化为:                                      

、                               \small logisticloss=-\sum_{i}^{n}(q(x_i)log(g(x_i)) =-q(x)log(g(x))-(1-q(x))log(1-g(x)) 

 这里的n=2,说明只有两类,所以展开如上式。

mean-square error loss:它是一种简单的误差衡量方式,即样本观测值和预测值之间的值的误差,计算公式为:

                                                       \small logisticloss=\frac{1}{N}\sum_{i}^{N}(Label_i-Prediction_i)^{2} 

这里的N表示的是样本的数量,在深度学习中N通常是一个batch的样本数量。

非极大值抑制:在目标检测中提取分数最高的窗口。具体做法是:对于bounding box集合B及其置信度S,选择最大置信度的bounding box M,将其从B集合剔除,并加入最终的检测结果D中,然后再将B中剩余bounding box与M的IoU大于阈值的bounding box从B中剔除,重复此过程,直到B为空。D的bouding boxes就是最终需要的bounding box。

leaky激活函数:f(x) = max(0.01x, x)。基于参数的ReLU:f(x)=max(\alpha x,x)

anchor box:在目标检测模型中,一个anchor box包含一个一个bounding box和一组类别概率。

weight decay and momentum:weight decay(权值衰减)的目的既不是提高精确度也不是提高收敛速度,可以将它看做是一种正则化,其最终目的是为了防止过拟合。在进行梯度下降时,使用一个lamda值(取值介于0到1之间)乘以当前计算的每一个weight。momentum是梯度下降中一种常用的加速技术,用来跳过局部最优,如下图,0.99就是权重衰减系数,ita为学习率


2.YOLOv1(You only look once:Unified,Real-Time Object Dection)

特点:他将目标检测任务当作是一个回归任务处理,这个回归任务包括在空间上独立的两部分:定位框和对应的类别概率; 它不像R-CNN那样先用卷积神经网络在建议区域提取特征,然后再用SVM做分类之后进一步提炼bounding boxs,而是整个过程都在一个完整的神经网络中完成。相比于目前最好的检测系统,YOLOv1容易出现定位错误,但是它能够很好地区分前景和背景,同时它提取特征的能力很强,除了自然图片,对艺术图片进行目标检测效果比之前的方法要好。

作者在论文中提到他将目标检测作为一个单一的回归任务,直接从整个图像的像素中获取bounding boxing坐标和类别概率。相比于R-CNN反复从proposal region中提取特征而言,YOLOv1用一个单一卷积神经网络一次性提取所有的bounding boxes和class probabilites。所以作者起名为You only look once。

优点:1.YOLO执行速度很快(相比于其他检测系统,论文的最大亮点),因为它是一个端对端的网络(pipeline);2.YOLO在预测中对整张图的全局合理性把握得更好,因为YOLO在训练和测试中使用的是整张图片,这表明它在某种程度上编码了图片的类别和图片内容信息。作者在论文中提到,YOLO比Fast RCNN减少了将近一半的背景错误。这里的background error我理解为出现bounding box,里面没有所谓的前景物体;3.YOLO能够提取到目标通用的特征,作者用自然图片训练,用艺术图片测试,效果比DPM和R-CNN效果要好很多。

缺点:1.YOLOv1在精确度上落后于当前最好的检测系统,主要来源于坐标定位的不准确,因为这些坐标预测都是从标签bounding box数据中以一种新的宽高比率统计抽象出来,这个过程很容易出现定位不准确。2.大的bounding box和小的bounding box对相同的小错误的敏感度相同。这与直觉逻辑不合,因为直觉告诉我们对于相同的小错误,小的bounding box应该更加敏感。虽然作者试图在损失函数中使用平方根来克服这个缺点,但是只能部分解决。3.YOLOv1对密集物体,重叠面积大的物体不好预测,作者在论文中提到,每个格子负责预测一个物体,但是如果一个格子内有两个或者多个物体,就必然会丢失物体。

检测处理思想:将输入图片划分为S*S的格子(逻辑区域),如果物体的中心坐标落在某个格子中,那么这个格子就负责检测这个物体(包括bounding box的坐标和类别概率)。每个格子预测B个bounding boxes和B个置信度,这个置信度表示这个格子预测的bounding  boxes包含物体的可信程度,论文作者将置信度定义为Pr(Object) * IOU,IOU的意义论文中明确提到是预测bounding box和真实bounding box的交集。这里我理解IOU的值为预测bounding box和真实bounding box交集除以它们的并集,因为这样可以将IOU压缩到0到1之间,Pr(Object)的值为0或者1,表示存不存在目标物体。每一个bounding box包括五个元素,x,y,w,h,confidence。坐标(x,y)表示的是box的中心坐标,并且是相对于格子的边界而言,w和h也是相对于整张图片的宽度和高度而言。置信度预测的值表示预测框和真实框的IOU值。虽然每个格子预测B个bounding box,但是每个格子只预测一组类条件概率,注意这里不是anchor,因为多个bounding box共用了一组class probability。所以网络架构的最后一层实际预测了B个bouding box和一组类别概率,注意这只是针对于一个格子,所以在不考虑batch size的情况下,实际预测输出长度为S*S*(B*5+C),作者在Pascal VOC数据集上训练时S = 7,B=2, C=20。

分析:前面的检测处理思想对神经网络最后输出每一部分解释了很多,但是对置信度如何处理仍然有一些模糊,我的理解为:在训练过程中,哪些格子里面有目标物体是确定的,所以Pr(Object)的值为0或者为1是确定的,IOU的值是通过预测bounding box和label bounding box的交集计算得到的,所以训练过程中的置信度不是直接预测的,而是通过Pr(Object)*IOU计算得到的。在测试过程中,我们无法知道Pr(Object)的值,label bounding box的坐标等信息,所以测试过程中的置信度是直接预测的。同理class probabilites也类似。值得一提的是,在测试选择最终的bounding box作为显示框(因为有B个bounding box)的选择条件是什么呢?作者在论文中提到用预测的类概率和直接预测的置信度的乘积作为衡量标准。所以说在实现过程中,我必须自己设定一个阈值来筛选最终的bounding box,这个值是多少,论文中没有明说,得我们结合自己的数据集微调。

网络结构:论文作者说这个YOLOv1的网络架构(Darknet)借鉴了GoogLeNet思想。整个检测网络包括24个卷积层和2个全连接层,并且在适当的位置使用卷积核为1*1的卷积层来减少特征空间(即feature map的数量),这一点和GoogLeNet的inception模块不同。作者说其他版本的YOLOv1网络结构也就改一下网络的层数,思想基本一样。具体结构如论文中结构图:

其中7*7*64后面的2表示移动步长stride=2,其他的类似,没有的表示默认步长为1。

训练过程:作者使用前面所说的网络架构(Darknet)的前20个卷积层和一个全连接层在ImageNet 1000类的竞赛数据集上进行预训练,然后在ImageNet 2012验证集上验证,取得top5(预测最大概率的5个分类中有正确的,就认为此次预测正确,相似的还有top1.)测试精度为88%的结果。接着作者根据任少卿,何凯明等人的经验(同时给预训练网络增加卷积层和全连接层能提高预测结果),在预训练网络后面又增加了4个卷积层和2个全连接层(这就形成了上面的网络结构Darknet),后面的训练过程和预测过程都是用的darknet网络。作者认为检测的过程需要更多的视觉信息,所以调整了训练图片的分辨率,即预训练过程使用的图像分辨率是224*224,在darknet网络中正式训练时使用的图片分辨率是448*448。【我在实际训练Darknet时始终没有得到很好的效果,可能是没有进行预训练。】对于前面所说bounding box,作者也做了一些处理,将bounding box的w,h除以训练图像的宽度和高度(448*448),使其值在0-1之间。至于bouding box的x,y的实际值意义,作者认为不是相对于整张图片的中心坐标值,而是相对于的对应格子坐标左上边界偏移值,所以x,y的值也在0-1之间,这个地方有些难以理解。我的理解是:格子的坐标是(0,0),(0,1)......(6,6)等等,共有49格子,通过置信度为每一格子从B个bounding boxes中筛选一个最终的bounding box,所以在整张图片就剩下49个bounding boxes,他们的格子坐标分别是(0+x,0+y),(0+x, 1+y).......(6+x,6+y),注意这里的每个格子的x和y是不同的值,因为每一个格子bounding box都预测了对应的x,y(好好理解这句话,理解之后你会发现论文作者的设计是如此巧妙)。最后通过我们设定的置信度阈值使用非极大值抑制方法从这49个bounding box中筛选;还有一种做法就是直接从98个bounding boxes使用非极大值抑制方法筛选。从图片的全局性来考虑,第一种方法更能体现图片的整体性。确定完bounding boxes后,用bounding box坐标值乘以与原图的比例值就可以在原图中框出相应的物体。至于激活函数,作者在论文中提到除了最后一层使用了线性激活函数,其他层都使用了leaky激活函数。最后讨论一下YOLOv1的损失函数(sum-square error),平方和误差损失函数简单,易于优化,但是对准确率的提升效果不好,作者分析原因有两点:1.把坐标误差和分类误差看得同等重要不合理;2.那些没有包含物体,置信度趋向于0(但不是0,累计和还是很大的)的格子相比于有目标物体格子的数量要多很多,这将最终导致格子的损失梯度过高,从而使模型不稳定,过早发散。为了解决这两个问题,作者增大了bounding box坐标预测损失的权重,减少了没有包含目标物体置信度损失的权重,其坐标损失权重为5,没有目标物体的置信度损失权重为0.5,其他损失权重为1。同时作者论文中提到,损失函数应该体现较小的损失变化对大的bounding box影响比小的bounding box的影响小,使用w和h的平方根能够部分解决这个问题。最终的损失函数为:

 

上述损失函数的下标 i 表示第 i 个格子,下标 i j 表示第 i 个格子的第 j 个bounding box。可见在训练过程中计算损失时使用的所有的bounding box,如果格子里面实际没有物体,对应的实际标签值为0。有物体的格子就用真实标签值。

训练数据集和训练参数:Pascal VOC2007和2012的训练和验证集,测试时使用的包含2007的Pascal VOC 2012测试数据集。batch size值为64,峰值为0.9,衰减系数为0.0005,学习率在第一个epoch从10的负3次方增到10的负2次方,然后继续用10负2次方法训练75个epoches,接着用10的负3次方训练30个epches,最后用10的负4次方训练30个epoches,总共136个epoches【我在实验时没有达到效果,有可能是没有这样设置学习率】,dropout层的连接率值为0.5, 最后作者在论文中提到,数据增强使用了随机变换图片尺度1.2倍于原图片大小,同时使用因子1.5调整图片的HSV颜色空间。

额外的工作:作者想既然YOLOv1能够犯较少的背景错误,如果将YOLOv1和Fast R-CNN结合起来,可能会使结果更好。于是作者做了一个将二者结合的实验:对于Fast R-CNN预测的每一个boudingbox,都用YOLO的预测的bounding box检测一下,看是否有相似的bounding box, 如果有,就认为Fast R-CNN预测的这个bounding box包含物体的可能性很大,其衡量标准包括YOLOv1预测的bounding box的执行都,和两个bounding boxes的重叠面积。论文作者没有提到做这个实验的细节,我的理解是:用相同的训练集训练好Fast R-CNN和YOLOv1两个网络,将同一张图片同时输入两个网络,得到两个网络输出,利用的YOLOv1预测的bounding box来检测筛选Fast R-CNN的输出得到最终的输出。【为了效率,如何并行同步两个网络没有实验过,可能有些难度】最好的Fast R-CNN模型在测试数据集VOC 2007上能实现71.8%的平均准确率。当结合YOLOv1后,平均准确率达到75.0%,增加了3.2个百分点。【在计算机视觉领域能够增加1到2个百分点就很不错了】

总结:YOLOv1的优缺点前面已经说得够多了,且看作者如何改进YOLOv1到更好,更快,更强。

3. YOLOv2:(YOLO9000:Better,Faster,Stronger)

论文概要:在这篇论文中,作者介绍了两个模型YOLO9000和YOLOv2。YOLO9000是能够检测超过9000个类的的实时检测系统,YOLOv2是一个标准的图片目标物体的检测系统(可以在数据集Pascal voc,COCO上检测)。在YOLO9000中,作者提出了联合训练方法,这种方法可以使YOLO9000对没有检测标签数据的物体类别进行检测预测【翻译得有些拗口,我的理解是同时在检测数据集COCO和分类数据集上ImageNet上训练神经网络】。在YOLOv2中,作者使用了多尺度训练方法,这使得YOLOv2可以同时在不同大小的数据集上训练,这样做的目的是为了平衡速度和精度。【在数据集VOC2007上,mAP为76.8,速度为67FPS;mAP为78.6,速度为40FPS】

更好(Better):更好主要指相对于YOLOv1,YOLOv2提高了召回率,减少了定位错误,同时提高了分类精度。YOLOv2想要既做到高精度也要高速度,仅仅是增加网络的复杂性不可能提高检测速度。所以作者简化网络结构,并且做了一系列处理让特征容易被提取出来。这些操作包括:

1.Batch Normalization(提高损失收敛速度,同时mAP提高了2个百分点)batch  normalization一般加在神经网络激活函数的前面,他能够提高梯度在网络中的流动,Normalization的能够使特征全部缩放到[0,1],这样在反向传播的过程中,梯度都是1左右,避免了梯度消失,提升了学习率,更快达到收敛,减少模型训练对初始化的依赖。

 2.High Resolution Classifier:从AlexNet开始,绝大多数的分类器的输入图片的大小小于256*256,[YOLOv1预训练的input image size是224*224,正式训练的input image size是448*448]。在YOLOv2中,用size为448*448的ImageNet数据集微调分类网络10个epoches【既然是微调,和YOLOv1一样,低分辨率的ImageNet图片进行预训练分类网络,高分辨图片训练检测网络,只是在这两个过程加了一个适应性微调】,这样做的目的是使网络能够有足够的时间适应高分辨率图片的输入。然后继续用高分辨图片微调这个网络进行检测任务,作者在论文中提到这样做能够提高mAP将近4个百分点。

3.Convolutional With Anchor Boxes:作者去掉了YOLOv1的全连接层,使用anchor boxes来预测bounding boxes,同时也去掉了最后池化层使得最后feature maps的分辨率大一些。为了得到奇数形状的feature maps,作者调整输入图片的分辨率为416*416,使得最后的卷积层输出的feature maps的分辨率大小为13*13。与YOLOv1不同的是,YOLOv2为每一个bounding box预测一个类条件概率【YOLOv1中B个bounding box共用一个类条件概率】。在YOLOv1中bounding boxes数目为:S*S*(5*B+C),而在YOLOv2中bounding box数目为S*S*B(5+C)。使用anchor box没有使精度提升,提高了召回率。在YOLOv1中每一幅图片值预测98个bounding boxes,在YOLOv2预测了13*13*9个bounding boxes,召回率肯定提高呀,所以anchor box在YOLOv2中其实没有太大的作用【个人感觉】。

4.Dimension Clusters,前面使用B=9是根据Faster R-CNN来设定的,但是9是不是最合适的,还有待检验,于是作者采用维度聚类的方法对数据集的真实标签的bounding box进行聚类分析从而确定B的取值。如果用欧式距离来衡量K-means的距离,会使得大的bounding box比小的bounding box产生更大的误差,于是作者调整距离计算公式为:

                                                                      \small d(box,centroid)=1-IOU(box,centroid)

如下图,作者在论文中提到最终选择B=5(聚类中心有5个,意味着每一个格子的anchor box有5个)来平衡模型的复杂性和召回率,并且发现这些作为聚类中心的box比手工挑选的box要偏窄,偏高。对于聚类分析的过程作者在论文中没有详细说明。对此有一个疑惑,IOU(box,centroid)是用直接用像素点计算还是相对于最后的feature map计算。我觉得是相对于feature map计算,因为这样做可以保持与预测网络输出的bouding box的环境一样。具体的做法是:先按比例缩小真实的bouding box(原始图片的大小肯定不是416,输入的图片会按一定的比例缩放到416)再除以32(416/13),然后再计算IOU值。

5.Direct location prediction直接预测坐标会导致模型不稳定,特别是在迭代早期。YOLOv2,没有采用RPN(region proposal network)的坐标预测方法,而是继续使用YOLOv1的坐标预测方法,预测相对于格子的偏移,使用logistic activation(sigmoid)函数将偏移值限定在0到1之间。具体计算示意图如下图:

 

tx和ty为预测的偏移值,sigma函数为sigmoid激活函数,pw和ph为聚类维度中的先验bounding box宽度和高度。cx和cy为格子坐标。如果要恢复为最终的显示bounding box,只需要将bx,by,bw,bh分别乘以(416/13)然后乘以缩放比例即可。这样做后,增加了5个百分点的精度。

6.Fine-Grained Feature,13*13的feature map可以提供足够信息预测较大的物体,但是对于小物体而言提供的信息仍然不够,所以作者提供了一个passthrough层,利用26*26的feature map来预测小物体(可能是受SSD的启发,不同大小的特征图检测不同大小的物体)。和Resnet相似,将前面高分辨率的feature maps连接到后面低分辨率的feature map上,例如26*26*512的feature maps则可以转化为低分比率的feature maps 13*13*2048,作者在论文中提到这样做提高准确率1个百分点。具体的passthrough层处理方式为:分别对高度和宽度进行倍数提取像素点组成低分辨率feature maps。

7.Mutil-Scale Training,YOLOv2的网络只有卷积层和池化层,所以就可以在训练进行的过程改变feature maps的shape。 为了使得YOLOv2更具鲁棒性,我们让模型能够对不同大小的图片进行训练。在训练过程中,每10个batch就换一组新尺度的图片(这里的新图片指大小不同,图片的其他属性是一样的)。由于下采样因子是32,作者将尺度设置为{320,352,...,608},不同尺度的图片最终输出的feature map是不同的,如何修改最后的检测处理,论文没有说明。

更快:VGG-16是一个非常有效的分类网络,但是它很复杂,作者没有使用它,而是基于Googlenet创造了Darknet-19,他包含19个卷积层和5个最大池化层,具体结构如下:

训练过程:整个训练过程由三个阶段组成,第一阶段,用分辨率为224*224的ImageNet 1000类图片预训练darknet-19网络160轮;第二阶段分辨率为448*448的图片微调网络10轮,学习率设置为10的负三次方,此时top-1的精度达到了76.5%,top5的精度达到了93.3%。前两个阶段完成了分类训练,第三阶段是检测训练,去掉分类网络的最后三层(convalutional ,avgpool,softmax),增加3层卷积核为3*3,通道数为1024的卷积层,每一层后面添加卷积核为1*1,通道数为B*(C+5)的卷积层,相当于添加了6个卷积层,训练这个网络总共160轮,开始时学习率为10的-3次,在第60轮和第90轮时,设置学习率为10的-4次,我们设置权重衰减值为0.0005,峰值为0.9。数据增强使用了随机裁剪,颜色转变等。关于YOLOv2的损失函数,论文中没有说明。参考YOLOv2损失函数博文,损失函数如图:

Stronger(更强):在这里作者提出了一种将分类数据集和检测数据集联合训练的方法,在训练的过程,我们将这两类数据集混合,当输入的检测数据集时,反向传播全部的误差损失(YOLOv2的loss),当遇到分类数据集时,只反向传播分类误差损失。检测数据集COCO的分类比较泛(狗;船),分类数据集ImageNet比较细(哈士奇,猎犬;筏子,游艇),这就导致类别标签不具备排他性,为此,作者首创了有向图WordNet,为了简化问题,作者使用hierarchical tree表示ImageNet标签的层级关系,根节点是‘physical object’,越抽象的标签越靠近根节点层,如果一个子标签属于多个父标签节点,则将他添加到距离根节点层级距离较短的父标签节点下面。构建的这颗树称作WordTree。在执行分类任务时,我们为每一个标签节点预测一个条件概率,如果要计算一个节点标签发生的概率,从根节点出发,连乘他们的条件概率,直到到达该标签节点。根节点p(physical object) = 1.作者使用Darknet-19在1000类的ImageNet数据集上做了验证。在构建的WordTree的过程中,添加了369个中间节点,所以预测输出的概率是一个1369维的向量,并且对每一父节点的所有子节点做softmax计算。使用之前Darknet-19训练得到的参数,在增加369类的情况下,仍然获得了top1精度71.9%,top5精度90.4%的分类效果。在做检测任务,其模型称作YOLO9000,它预测p(physical object), bounding box和条件概率树。YOLO9000和YOLOv2预测输出的结构一样,YOLOv2输出5个anchor boxes,YOLO9000输出3个bounding boxes,在预测类别概率时,YOLO9000预测了1369个条件概率,外加一个p(physical object),在确定预测的最终类别时,不像YOLOv2那样简单直接选择最大的概率值为最终类别,YOLO9000需要设定一个阈值,从根节点出发,计算每一个层所有的标签节点的概率值,直到这一层至少有一个标签节点的概率达到阈值,如果这一层又多个标签节点达到阈值,选择概率值最大标签节点为最终类别,如果只有一个标签节点达到阈值就直接将最终类别预测为该类别标签。当YOLO9000遇到检测数据集图片时,和YOLOv2一样传递误差损失(包含bounding box的误差),对于类别损失的部分,只反向传播类别标签层级及以上层级的标签误差(具体的计算方法是,假设WordTree已经建立,找到真实类别标签及以上层级标签节点,分别计算他们发生的概率,真实标签节点到根节点的这条路径上的所有标签节点的值为1,其他节点为0,然后对应相减求平方和)。如果YOLO9000遇到分类数据集图片,只传递分类误差,利用每个格子(YOLO9000中,一个格子有三个anchor boxes)中自信度最高的bounding box对应的类别概率计算分类误差。(作者最后提到他有一个想法,将自信度最高的anchor box假设为真实标签bounding box值,格子中的其他anchor box与他计算IOU,IOU值大于0.3,则也反向传递bounding box误差)

总结:YOLOv2的改进基本上是借鉴别人的方法,YOLO9000的数据集联合训练是作者的独创,也是最大创新点,为跨数据集训练提供了思路。

4.YOLOv3:(An Incremental Improvement)

主要工作:对YOLOv2进行了更细微的设计调整,并且重新设计了一个结构稍微复杂一点的新网络,在保证速度的前提下提高了精度。

Bounding Box Prediction:从前面的介绍知道Bounding box预测主要分为两个部分,坐标预测和置信度预测(在训练过程中,objectness置信度=IOU*boundbox预测的概率值)。YOLOv3中引入一个Objectness score概念,使用logistic regression为每一个bounding box预测一个Objectness score。将预测的bounding boxes中与真实bounding box重叠最大的bounding box的Objectness score赋值为1,如果这个bounding box与真实bounding box重叠值达到设定的阈值0.5,这个bounding box的损失为0,其同一格子里面的其他bounding box只计算置信度损失,忽略坐标损失和类别损失。我的理解是:这里bounding box是指网络模型预测的confidence,bx,by,bw,bh,计算置信度误差时,用真实标签坐标和预测坐标(bx,by,bw,bh)计算IOU,Objectness score相当于Pr(Object),所以最终的置信度计算为IOU*Pr(Object)

分析:作者忽略预测bounding box与真实bounding box的IOU达到阈值0.5的bounding box的损失(这个bounding box记作A),我的理解是0.5表示预测的bounding box已经能很好地标记框出物体,所以不用计算它的损失,每一个格子中的object由一个预测的bounding box预测,既然已经找到了较好地bounding box,所以同一个格子里面的其他bounding box没有必要计算坐标误差和分类误差,只需要计算置信度误差,用来调整置信度,最理想的效果是这些bounding box的置信度值更新为0。论文中虽然没有说明如果bounding box A没有阈值该怎么办,但是基于我的分析,很明显既然找不到满意的bounding box,所以格子里面的所有bounding box都参与误差损失计算(包括坐标,类别和置信度),补充说明:如果格子里面确实没有物体,bounding box的IOU值永远无法达到0.5,这个格子里面的所用bounding boxes就会一直更新,最理想的情况就是置信度,坐标都为0。

Class Prediction:类别预测使用了多标签分类(多分类),没有使用softmax,而是对每一个类各自对立地使用了logistic分类器,用binary cross-entroy loss替代softmax loss,这样能较好地处理标签重叠(包含)关系(例如:女人和人)【我理解的具体连接方式,神经网络的预测bounding box那层的条件类概率输出神经元后边分别连接两个神经元(第一个神经元表示是,另一个表示不是)作为logistic regression,它的输入为类条件概率乘以置信度,这样做相当于是为每一个类别再做一次判断,能够更明确地处理标签之间的重叠关系。【是这个类或者不是】

Predictions Across Scales:YOLOv3预测三种不同尺度的box,每一种尺度预测三个anchor boxes,即N*N*(3*(4+1+80)),所以最终的输出是3*【N*N*(3*(4+1+80))】,最前面的3表示三种尺度。3种尺度,3个anchor box,是由聚类数为9决定的,按照一定的顺序(面积从小到大)将这个聚蔟box分配给不同尺度。在YOLOv2中,为了加强对小物体的检测,引入了passthrough层,假设最后提取的feature map的size是13*13,passthrough层的作用是将上层26*26的feature map和最后层13*13的feature map连接,作为网络最后的输出。SSD中采用了尺度融合的方式,但是没有上采样过程,只是从网络的不同层抽取不同尺度的feature map做预测。YOLOv3是采用了低分辨率feature map上采用和高分辨率feature map做融合,形成新的feature map层,对新的feature map层单独做预测。这样就是多尺度预测。如果YOLOv3最后一层也是13*13的话,那么三个尺度的大小为(13*13,26*26,52*52),第三个尺度只用第二个尺度上采样并做融合。值得说明的是:YOLOv2中的多尺度指输入图像的大小不同,YOLOv3的多尺度是指用不同的分辨率的feature map做预测。

Feature Extractor:提出一种新的网络模型darknet53

仅供参考,如有不对,还望指教

 

参考文献:

3篇YOLO论文

其他博客(很多)

 

 

 

 

 

 

 

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值