一,目标检测简介
二,yolov1网络的输出结果分析
我们首先来看一下yolov1的网络图,如下图所示。
在yolov1的网络当中,输入的图片的大小为448x448x3,这个在图中也可以很明显的看出来。重点是,输出的7x7x30的输出结果包含哪些信息。首先我们先看一下下面这张图片:
在图片当中,可以看到,图像被分为7x7的网格,与上面提到的网络输出7x7x30相对应,可以看出每一个网格都包含30个输出参数。接下来我们来讲解一下,这三十个输出参数都代表什么信息。看接下来这张图片:
在yolov1当中每一个网格都会有两个预测框,每个预测框的位置需要四个参数确定(x,y,w,h),其中x,y是预测框左上角的坐标,w,h为框的宽和高。同时,每个预测框都有一个置信度参数,也就是该预测框内含有目标物体的概率。这样,每个预测框就包含了五个参数,一共是10个参数。在yolov1训练的数据集当中,一共有20个物体类别,每个物体类别有一个概率参数,所以一共是20个参数,这个参数是两个预测框共用的。
所以(2 x 5 + 20)= 30个参数,一共有7x7个网格,所以总结一下就是7x7x30个参数,也就是网络的输出结果。
三,yolov1的预测过程
通过在上一节分析的结果,也就是每个网格有两个预测框,整幅图像就包含7x7x2=98个预测框,显示在图像中就如下图所示:
图像当中一共有98个预测框(想数一下的小伙伴,可以试一下),下一步的任务就是如何从98个预测框中,提取出实际包含物体的预测框。这里就使用到了非最大值抑制(nonMaximumSuppression),这里简单讲解一下非极大值抑制(需要深入了解的可以查看一下其他教程)。
在非极大值抑制过程中,第一步就是要将98个预测框按照他们的置信度进行由大到小的排序,假设图中的四个检测框置信度分别0.8,0.7,0.4和0.36。
首先计算将排名第一的检测框与第二名进行交并比计算,交并比公式如下:
随后人为设置一个阈值,只要交并比大于所设阈值,就认为这两个检测框检测的是同一个物体,就删除置信度比较小的检测框。此时就将98个检测框减少为97个检测框。同理继续进行下去,将第一名与第三名进行交并比计算、第一名与第四名进行交并比计算…直到与所有检测框完成对比。
注意,此时还没有结束,以第一名为对象完成一次循环后,将继续将置信度第二名的检测框与比他置信度小的检测框进行对比,若第二名已经被删除,就顺延到置信度第三名,知道遍历完所有的检测框。这时候就可以将上面含有密密麻麻检测框的图片变成下图所示:
四,yolov1的训练过程
讲完推理的过程,现在来讲一下训练的过程,在模型结构上最前面贴出的模型结构图很简单,大家应该都能够看懂,这一节讲的重点是损失函数的设计。首先先把损失函数给大家:
主要可分为五个部分:
(1)负责目标检测的框的中心点定位误差。
(2)负责目标检测的框宽高定位误差。
(3)负责目标检测的框置信度误差。
(4)不负责目标检测的框置信度误差。
(5) 负责目标检测的框分类误差。
接下来我们一一讲解
4.1 中心点定位误差
如下图红框标注所示,这一部分就是负责目标检测的框的中心点定位误差,就是中心点的像素距离,需要注意的只有公式中的两个未知数,图中已经给出了解释,就不再重复(其实是我不会用LaTex数学公式,后面有机会补上,也可以在评论里时不时踢我一下)。
4.2 宽高定位误差
下图中就是宽高误差部分,这一部分很好理解,就是预测框宽高与ground truth的宽高取个差值再各自平方加在一起。这里需要注意的是宽高都取了开平方,这里是为了缓解yolov1的一个缺陷,就是对小目标的物体不敏感。例如一个小目标的预测框和ground truth宽高大小差个好几倍的关系,但是由于小目标本身就比较小,导致求差值的结果也很小,不利于模型的收敛。
4.3 置信度误差
这里我们将第三行和第四行放在一起看,蓝框标出来的那一部分很容易理解,如果预测框中心落在了实际物体的中心,则希望他的置信度越靠近1越好,反正越靠近0越好。需要注意的是,第四行的公式,前面多了一个参数,这个是在模型的训练开始时,使用者可以自由调节的一个参数,表示你对非准确预测框的重视程度。
4.4 分类误差
分类误差就也很容易理解了,就是将前面给出的20个物体的预测概率分别与实际物体的类别做差值取平方,最后再累加。
五、结论
到这里基本上就结束了,yolov1作为该系列的开山之作,开创了单阶段检测的先河,但是因为是先驱,算法仍然有许多需要缺陷,例如检测精度不是特别高,对小目标物体检测不敏感等等。