论文连接:arxiv.org/abs/1902.09…html
代码连接:github.com/generalized…git
这篇论文出自CVPR2019,算是目前已被录用且公布的为数很少的目标检测相关论文了。这篇论文提出了一种优化边界框的新方式——GIoU(generalized IoU,广义IoU)。目前关于IOU的新用法真是层出不穷,从Cascade R-CNN到IOU Net再到现在的GIoU,GIoU的方法是这些论文中相对简单的,相信不少朋友了解了这篇文章的原理后,心里的OS都是“总以为损失函数能够优化,这么简单我怎么没想到呢?”,哈哈,反正我是这样想的了。下面来看看这篇文章所提出的方法吧。github
目前目标检测中主流的边界框优化采用的都是BBox的回归损失(MSE loss, L1-smooth loss等),这些方式计算损失值得方式都是检测框得“代理属性”——距离,而忽略了检测框自己最显著的性质——IoU。以下图所示,在L1及L2范数取到相同的值时,实际上检测效果倒是差别巨大的,直接表现就是预测和真实检测框的IoU值变化较大,这说明L1和L2范数不能很好的反映检测效果。算法
除了能反映预测检测框与真实检测框的检测效果外,IoU还具备尺度不变性。但是既然IOU这么好,为何以前不直接用IoU呢,这是因为IoU有两个缺点,致使其不太适合作损失函数:网络
基于IoU的优良特性和其做为损失函数时的致命缺点,做者提出了一个新的概念——GIoU函数
GIoU的定义以下图所示,post
根据定义,GIoU具备以下性质:优化
GIoU做为损失函数时计算方式以下的算法2代理
从算法中能够看到和GIoU的计算方式和IoU的步骤基本保持一致,在获得IoU的值后在根据上面的算法1计算GIoU的值。这里还不太清楚方向传播时,梯度是怎么计算的。等我看看源码再来更新吧cdn
做者分别在几种主流的目标检测算法上作了实验,分别是YoLo、Faster R-CNN和Mask R-CNN。这里贴上在Pascal Voc数据集上的实验结果,以下
实验结果中在YoLo v3上能够看到GIoU相比IoU的损失函数有较大幅度的提高,而在faster r-cnn中GIoU和IoU做为损失函数的区别不大,这里做者给出的解释是faster rcnn的anchor更密集,致使不易出现与gt不重叠的检测框。其实我的认为,anchor多的情形与gt不重叠的检测框才多,更根本的缘由应该是RPN网络进行了一次粗检后,滤去了大部分跟gt没有重合的检测框。致使GIoU相比IoU的损失函数提高不明显吧
GIoU的方法很简单,巧妙的是优化的点。经过广义IoU做为损失函数替代bbox回归仍是颇有趣的。不过疑惑的是实验结果中的检测AP值都很是低,原生的faster rcnn在pascal voc上的检测效果都不会这么差。从实验对比上GIoU的损失函数相比原始的损失函数在准确率不到40%的效果上来讲确实有较大幅度的提高。然而要是换到准确率较高的baseline上呢?这一点还须要实验验证。 另外总感受这篇论文有点点到即止,没有更多的实验验证bbox做为损失函数存在缺陷的缘由。