说点 Cornernet/Centernet 代码里面 GT heatmap 里面如何应用高斯散射核

技术讨论 kira ⋅ 于 2个月前 ⋅ 357 阅读
来源:本文授权转自知乎作者Monstarrrr,https://zhuanlan.zhihu.com/p/96856635。未经作者许可,不得二次转载

最近在看anchor-free的论文,可能是以前anchor-base的论文看多了,有了思维定势,一下还不是很好理解anchor-free,一度怀疑人生,于是打开源码开始分析。不得不说光看论文而不源码简直就是浪费作者的心血,因为很多小的知识点在论文中基本上知识提了一下,而代码中包含更全面丰富的信息,很值得细细品味的。这不,在看CornerNet/CenterNet论文的时候看到了这一句话。

For each corner, there is one ground-truth positive location, and all other locations are negative. During training, instead of equally penalizing negative locations, we reduce the penalty given to negative locations within a radius of the positive location. This is because a pair of false corner detections, if they are close to their respective ground truth locations, can still produce a box that suciently overlaps the ground-truth box (Fig. 5). We determine the radius by the size of an
object by ensuring that a pair of points within the radius would generate a bounding box with at least t IoU with the ground-truth annotation (we set t to 0:3 in allexperiments).

fig5

这段话的意思就是在设置GT box的heat map的时候,我们不能仅仅只在top-left/bottom-right的位置设置标签(置为1),因为你看fig5啊,其中红色的bbox为GT框,但是绿色的框其实也能很好的包围目标。所以如果在检测中得到想绿色的这样的框的话,我们也给它保留下来。甚至说的更普遍一些,只要预测的corners在top-left/bottom-right点的某一个半径r内,并且其与GTbox的IOU大于一个阈值(一般设为0.7),我们将将这些点的标签不直接置为0,那置为多少呢?可以通过一个温和的方式来慢慢过渡,所以采用二维的高斯核未尝不可。

那问题现在就变成了如何确定半径r,使得IOU与GT box大于0.7的预测框不被直接阉割掉。

一旦弄清楚了这个问题,其实就好办了。

考虑三种情况:情况一,预测的框和GTbox两个角点以r为半径的圆外切。

预测的框与GT box外切

则此时计算一个出一个临界值r。

$$
overlap=\frac{h*w}{(h+2r)(w+2r)}
$$

整理为r的一员二次方程:

$$
4overlapr^{2} + 2overlap(h+w)r+(overlap-1)(h*w) = 0
$$

则相当于求这个关于r的一元二次方程。

令 $a = 4overlap, b=2overlap(h+w), c=(overlap-1)(h*w)$

根据根的判别式公式并且r需要大于0,则:

$$
r = \frac{-b+\sqrt{b^{2}-4ac}}{2a}
$$

记作r1

情况二:预测的框和GTbox两个角点以r为半径的圆内切

均内切的情况

此时也可以计算一个临界值:

$$
overlap=\frac{(h-2r)(w-2r)}{hw}
$$

整理成r的一元二次方程:

$$
4r^{2} - 2(h+w)r+(1-overlap)(hw) = 0
$$

于是令 $a =4, b=-2(h+w), c=(1-overlap)(h*w)$

根据根的判别式公式并且r需要大于0,则:

$$
r = \frac{-b+\sqrt{b^{2}-4ac}}{2a}
$$

记作r2。

情况三:预测的框和GTbox两个角点以r为半径的圆一个边内切,一个边外切。

一边内切,一边外切的情况

此时计算临界值。

$$
overlap=\frac{(h-r)(w-r)}{2hw -(h-r)(w-r)}
$$

整理得到r的方程:

$$
r^{2} - (h+w)r+\frac{(1-overlap)*wh}{1+overlap}
$$

令 $a = 1, b=-(w+h), c=\frac{(1-overlap)*wh}{1+overlap}$

得到:

$$
r = \frac{-b+\sqrt{b^{2}-4ac}}{2a}
$$

记作r3。

则综合三种情况,可以得到r = min(r1, r2, r3)将这三个中的最小值设为半径。

思路有了,那么代码就好写了

对应的源码为:

def gaussian_radius(det_size, min_overlap):
    height, width = det_size
    # 情况三
    a1  = 1
    b1  = (height + width)
    c1  = width * height * (1 - min_overlap) / (1 + min_overlap)
    sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1)
    r1  = (b1 + sq1) / 2

    # 情况二
    a2  = 4
    b2  = 2 * (height + width)
    c2  = (1 - min_overlap) * width * height
    sq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2)
    r2  = (b2 + sq2) / 2

    # 情况一
    a3  = 4 * min_overlap
    b3  = -2 * min_overlap * (height + width)
    c3  = (min_overlap - 1) * width * height
    sq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3)
    r3  = (b3 + sq3) / 2
    return min(r1, r2, r3)

以上就是关于如何确定确定最小半径的方法了,然后根据这个半径设计一个高斯散射核,就是很简单的事了。高斯散射核长这样:

最中心的位置是标签值为1,周围的标签呈 $e^{-\frac{x^{2}+y^{2}}{2\sigma^{2}}}$ 规律递减。

—题外话—

其实代码不是最难的,难的是思路的训练。多想想怎么做,多想想为什么这么做。已经有很长时间没有更新了,但是这段时间也没有空闲着,也看了一些论文,最近会把这些学习心得整理一下,放在知乎上。也欢迎大家指出问题,一起讨论,共同进步!

成为第一个点赞的人吧 :bowtie:
回复数量: 0
暂无回复~
您需要登陆以后才能留下评论!