目前目标检测算法有很多,譬如:R-CNN,Faster R-CNN,DPM,RPN等等,YOLO也是其中之一,YOLO是当前目标检测算法中发展最为迅速的一个。YOLO结合了GooleNet modification和卷积神经网络的知识,可以对图像中的物体进行分类和定位。卷积神经网络对于物体分类来说效果是很好的,YOLO利用卷积层提取物体特征,通过全连接层进行分类和定位。接下来,我将大概讲一下YOLO的原理。
YOLO算法属于回归问题。
第一步:将图像划分为S*S的栅格(grid cell),如左下图,这里分成了7*7的grid cell。栅格的任务是:检测中心落在该栅格中的物体(注意,栅格中心未必与物体的中心重合,这个一定要明确,对后面的理解才不会产生影响)。
第二步:一个grid cell 可以预测B个bounding boxes(包围盒,以下简称bbox),包括预测bbox的confidence scores。bbox有五个预测值,分别是x,y(代表预测的bbox的中心与grid cell 边界的值),w,h(代表预测的bbox的width/height相对于整个图像width,height的比例),confidence(代表预测的bbox和ground truth box的IOU值)。
confidence = Pr(object) * IOU
一个bbox对应一个confidence score,如果grid cell里面没有object,confidence就是0,如果有,则confidence score等于预测的box和ground truth的IOU值,见上面公式。
在此解释一下IOU的意思,ground truth box是物体实际的位置,而IOU=bbox与ground truth box的交集/二者的并集,即交并比(重叠度),如右上图。
第三步:每个grid cell 还要预测C个conditional class probability (条件类别概率),即Pr (Class|Object)。即预测出,在grid cell包含object的条件下,该object属于某个类的概率。
注意,一个grid cell只需要预测一组(C个)类的概率,而不需要考虑bbox的数量。因为一个grid cell预测的B个bbox框住的都是同一个物体。也就是说,类别概率是针对grid cell的。
在本文中取S=7,B=2,C=20(因为PASCAL 数据集有20个类别),所以最后有7*7*30(30=B*5+C,每个bbox有5个预测值)个tensor。
测试阶段:将每个grid cell的conditional class probability与每个bbox的confidence相乘:
Pr(Class | Object) * Pr(Object) * IOU = Pr(Class) * IOU
想知道这个乘法到底是怎样实现的吗?先看下图
每个bbox的confidence和每个类别的score相乘,得到每个bbox属于哪一类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bbox的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bbox(NMS:针对某一类别,选择得分最大的bbox,然后计算它和其它bbox的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,在选择剩下的score里面最大的那个bbox,然后计算该bbox和其它bbox的IOU,重复以上过程直到最后)。最后每个bbox的20个score取最大的score,如果这个score大于0,那么这个bbox就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bbox里面没有物体,跳过即可。
前面提到了YOLO主要采用GoogLeNet,卷积层用来提取特征,全连接层用来预测图像位置和类别概率值。如下图网络设计:
YOLO网络虽然借鉴了GoogLeNet分类网络结构,但是YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。
以上是对YOLO原理的初步理解,关于YOLO的损失函数,我们下次再讲。
参考链接:https://blog.csdn.net/u014380165/article/details/72616238
https://blog.csdn.net/hrsstudy/article/details/70305791
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:目标检测算法之一 YOLO初步讲解 - Python技术站