(1) mAP:mean average precision,每个类别各自的AP求和之后的平均值
VOC2010官方给出了如何计算mAP:
1). Compute a version of the measured precision/recall curve with precision monotonically decreasing, by setting the precision for recall r to the maximum precision obtained for any recall r′ ≥ r.
2). Compute the AP as the area under this curve by numerical integration. No approximation is involved since the curve is piecewise constant.
翻译:
1). 计算PR曲线,precision的取值为任意recall(r')大于或等于某个recall(r)对应的precision最大值;
2). PR曲线的积分面积就是要计算的AP。
(2) Grid cell:用网格划分图片,也是一种先验知识,即如果一个物体的中心落在某个cell中,那么这个cell就负责检测该物体。也就是说每个cell要预测B个bounding box及其对应的物体置信度和C个类别概率。假设有个cell,那么共有个输出。4是4个坐标(bounding box的左上角x,y,和bounding box的高,宽),1是物体置信度(cell是否包含物体中心)。
在YOLOv1中,网格划分为;在YOLOv2中,网格划分为;在YOLOv3中,网格划分为,,。输入图片的尺寸为,那么对应的就是32倍,16倍,8倍下采样,分别可以预测大,中,小目标物体。
(3) Bounding box的坐标预测:方法还是沿用了YOLOv2,如下:
网络对每个bounding box的四个坐标进行预测(tx, ty, tw, th),再根据物体中心所在grid cell的左上角坐标(cx, cy)以及bounding box的先验宽和高(pw, ph)修正。这里再补充说明一下bounding box的先验,其实就是anchor box。大家想一想,我们的bounding box要拟合的对象就明白作者指的先验就是anchor box了。
这里有两个trick:
a. sigmoid函数,将tx和ty转换后限制到[0, 1]范围内,这样bx和by的值自然也就还是在当前这个grid cell,不会跳到旁边的cell中造成矛盾;
b. exp(t?) ,我比较同意参考1博主的观点:主要是为了求导的计算。如果选择类似p?*t?的方式,可能后期会造成梯度消失或梯度不再更新。指数函数就不会出现这个问题,而且exp的导数是它自己,实在是我们的最佳选择。指数函数还有个优点就是它的值大于0,这样我们就不用去要求预测的w和h要大于0。带不等式约束的优化问题,不能直接用SGD,还要用拉格朗日,个人认为对深度学习不友好。
来看看原论文的示意图,更加直观:
论文中提到训练过程中的一个trick:在数值预测中的损失函数梯度肯定是真实值减去预测值tgt-tpred。但是标注并没有tgt,我们可以通过计算bgt和tgt的反函数,也就是用tgt与tpred来计算误差。
参考[1]提到我们可以不计算sigmoid的反函数,而是直接用sigmoid计算误差,即:(tgt)=bgt-cgt。
(4) a. 论文提到的objectness score,是用来判断bounding box是否包含物体中心。也就是在测试的时候所说某个bounding box包含物体中心的置信度。这里沿用YOLOv1的损失函数
b. YOLOv3相较于YOLOv2还有一个大的改变就是每个bounding box可以预测多个类别,就是说一个box内如果存在多个类别,也是可以识别出来的。作者仅仅使用了多个独立的逻辑回归来进行类别分析。这么做的原因,作者在后面也说是因为某些数据本身就含有多标签,比如woman和person。如果使用softmax,那么就会认为所有的类别是互斥的,结果上就会造成一个bounding box只能识别一个物体。
好了,这是目前我想到的YOLOv3论文中的一些关键点的理解,如果大家还有什么疑惑,请给我留言。
接下来,我会一步一步搭建并解释YOLOv3的pytorch代码,敬请期待!