CornerNet Guassian radius高斯半径的确定-数学公式详解
目录
废话
正文
第一种计算方式
情况一:两角点均在真值框内
情况二:两角点均在真值框外
情况三:一角点在真值框内,一角点在真值框外
第二种计算方式
两种计算方式的比较
最后
References
废话
由于论文实验的需要,这几天在看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).
关于高斯半径的问题与论文中如上所述的文段及图片对应。
在[1]中,知乎作者认为上述“这段话的意思就是在设置GT box的heat map的时候,我们不能仅仅只在top-left/bottom-right的位置设置标签(置为1),因为你看fig5啊,其中红色的bbox为GT框,但是绿色的框其实也能很好的包围目标。所以如果在检测中得到想绿色的这样的框的话,我们也给它保留下来。甚至说的更普遍一些,只要预测的corners在top-left/bottom-right点的某一个半径r内,并且其与GTbox的IOU大于一个阈值(一般设为0.7),我们将将这些点的标签不直接置为0,那置为多少呢?可以通过一个温和的方式来慢慢过渡,所以采用二维的高斯核未尝不可。”[1]
我认为说的非常明白,“那问题现在就变成了如何确定半径r,使得IOU与GT box大于0.7的预测框不被直接阉割掉。”[1]
现在根据预测的两个角点与Ground Truth角点的位置关系,分三种情况来考虑:
1)两角点均在真值框内
2)两角点均在真值框外
3)一角点在真值框内,一角点在真值框外
PS:为什么分三种情况,因为角点间关系就只有这三种情况。
第一种计算方式
下面分别分析这三种情况:
情况一:两角点均在真值框内
IOU计算公式:
根据两个预测角点的两个限制条件:1)均在GT框内,2)均在GT框两个角点以r为半径的圆内,以及IOU计算公式可知,最小IOU的在预测框和半径r圆相切时获得。(最小IOU都满足要求了,其余情况就也符合了),因此我们只需要考虑“预测的框和GTbox两个角点以r为半径的圆内切。”[1]的情况。
下面,我们根据上图和IOU计算公式,分析下半径r如何选取。
实际上,随着半径r的变化(半径r的变化是由于预测框角点的变化引起的),上图中并集的面积是固定的,等于GT框的面积;而交集面积随着半径r的增大而减小,从而导致IOU的减小,也就是说IOU的值随r增大,逐渐从1→0。
此时可以根据论文要求的iou=0.7,反向计算一个“高斯半径r”:
注意,此处公式中的r并不是真正的r,只是r在x、y轴上的分量d=rcosθ。但实际上d和r在(0°, 90°)范围内单调性相同,可能是为了简便,统一把d写作r。最终比较三个d的大小,也就比较了三个r的大小。
整理成r的一元二次方程:
于是令
根据根的判别式公式,则:
并且r需要大于0,则:
此处想说下,在[1]中,作者三种情况计算的r公式均相同,我觉得不太对。(不同的地方就在于中间的加减号)
所以,此时求得的r是当前情况一下的最大半径。(r越小,IOU越大)。
情况二:两角点均在真值框外
同理,我们可以分析出,该情况下,最小IOU在预测框和半径r相外切时取得,因此我们只需要考虑“预测的框和GTbox两个角点以r为半径的圆外切。”[1]的情况。
此时,分析r的变化与IOU的关系可知, 随着r的增大,交集面积不变,但并集面积增大,则IOU减小。
则此时计算一个出一个临界值“r”。
整理为r的一员二次方程:
则相当于求这个关于r的一元二次方程。
令,
根据根的判别式公式并且r需要大于0,则:
此时求得的r也是当前情况二下的最大半径。(r越小,IOU越大)。
情况三:一角点在真值框内,一角点在真值框外
我们也可以很容易地分析出,该情况下,最小IOU在预测框两个角点分别和和半径r的圆相外切和相内切时取得(例如我们可以固定某一角点在x方向不变,变动y方向观察相交、相并面积的变化情况)。因此我们只需要考虑“预测的框和GTbox两个角点以r为半径的圆一个边内切,一个边外切。”[1]的情况。
此时,分析r的变化与IOU的关系可知, 随着r的增大,交集面积减小,同时并集面积增大,则IOU会快速减小。
此时计算临界值。
整理得到r的方程:
令,
得到,
此时求得的r仍然是当前情况三下的最大半径。(r越小,IOU越大)。
综上,
1)两角点均在里面,求得的是最大r
2)两角点均在外面,求得的也是最大r
3)一点在外一点在里,求得的还是最大r
“则综合三种情况,可以得到r = min(r1, r2, r3)将这三个中的最小值设为半径。”[1]
因为三种情况求得的r都是最大r,也就是说r再大一些的话就不满足0.7overlap的要求了,那么要同时满足三种情况,r只能取三个中的最小一个!从而保证在所有情况下,均能符合要求。
相应代码如下[2]:
def gaussian_radius(det_size, min_overlap):height, width = det_sizea1 = 1b1 = (height + width)c1 = width * height * (1 - min_overlap) / (1 + min_overlap)sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1)r1 = (b1 - sq1) / (2 * a1)a2 = 4b2 = 2 * (height + width)c2 = (1 - min_overlap) * width * heightsq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2)r2 = (b2 - sq2) / (2 * a2)a3 = 4 * min_overlapb3 = -2 * min_overlap * (height + width)c3 = (min_overlap - 1) * width * heightsq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3)r3 = (b3 + sq3) / (2 * a3)return min(r1, r2, r3)
第二种计算方式
正文中所提到的计算方式,实际上是模糊了半径r和其在x、y轴分量的区分。还记得上面说的两者关系么?
→注意,此处公式中的r并不是真正的r,只是r在x、y轴上的分量d=rcosθ。但实际上d和r在(0°, 90°)范围内单调性相同,可能是为了简便,统一把d写作r。最终比较三个d的大小,也就比较了三个r的大小。
所以在Github issues[3]中,网友进行了区分,也就是在固定r的情况下,清楚比较了三种情况下的r大小关系。
1)两点在外计算公式
2)两点在内计算公式
3)一点在外,一点在内计算公式
,S1,S2均表示面积
最后,根据sinθ、cosθ与w、h的关系,如1)中图例可以看出,
,
代入上述1)-3)式中,分别求的r1-r3如下:
因此,r2<r3<r1,故选择r2。
两种计算方式的比较
其实我认为两种方式是殊途同归,为什么这么说呢?还记得上面反复提到的一句话么?
“→注意,此处公式中的r并不是真正的r,只是r在x、y轴上的分量d=rcosθ。但实际上d和r在(0°, 90°)范围内单调性相同,可能是为了简便,统一把d写作r。最终比较三个d的大小,也就比较了三个r的大小。”也就是说正文方法一计算公式中的r其实是d,如果严格进行替换的话,结果估计会一样?(我只是这样想的,没经过验证
CornerNet Guassian radius高斯半径的确定-数学公式详解相关推荐
- 高斯滤波GaussianBlur()中参数详解
高斯滤波GaussianBlur()中参数详解: 高斯滤波是应用于图像处理,对图像进行滤波操作(平滑操作.过滤操作,去噪操作) 在python中的格式为: cv2.GaussianBlur( SRC, ...
- vue引入Echarts画折线图、平滑曲线图、转化数学公式详解
目录 1 引入Echarts 1.1 安装 1.2 引入 1.3 基本使用 2 基本折线图 3 复杂折线图 3.1 多条折线 3.2 动态变化折线图 4 笛卡尔坐标系中的折线图 5 平滑曲线图 6 折 ...
- Markdown 数学公式详解
文章目录 1 概述 1.1 行内与独行 2 运算 2.1 四则运算 2.2 逻辑运算 2.3 上标.下标 2.4 高级运算 3 符号 3.1 括号 3.2 百分号 3.3 箭头 3.4 省略号 1 概 ...
- numpy中的高斯分布函数 normal 的具体详解
1.高斯分布的概率密度函数为: 2. 在numpy中: numpy.random.normal(loc=0.0, scale=1.0, size=None) 3.具体参数详解 loc:float此概率 ...
- 详解高斯混合模型与EM算法
详解高斯混合模型与EM算法 详解高斯混合模型与EM算法 高斯混合模型 单高斯模型(Gaussian single model, GSM) 一维高斯分布 多维高斯分布 混合高斯模型(Gaussian m ...
- matlab中用imnoise向图像中加入特定高斯半径的噪声
最近需要做图像仿真,感觉用C++编写速度有点慢,也是为了省事,就用了matlab做前期的处理,后期到发布版本时,再用C++. 由于是初接触到图像仿真,有些问题没有很好的深入.这里就针对对某个图像中,加 ...
- 【问题描述】定义一个Circle类,有数据成员radius(半径),成员函数getArea()计算圆的面积。构造一个Circle的对象进行测试(注:圆周率取值3.14)。
[问题描述] 定义一个Circle类,有数据成员radius(半径),成员函数getArea()计算圆的面积.构造一个Circle的对象进行测试(注:圆周率取值3.14). [输入形式] 程序参考的输 ...
- 设计一个圆类(circle),内有私有成员radius代表半径, 函数get_radius( )用于获得半径、area( )用于计算圆的面积; (2)定义一个桌子类table,内有私有数据h
1.(1)设计一个圆类(circle),内有私有成员radius代表半径, 函数get_radius( )用于获得半径.area( )用于计算圆的面积: (2)定义一个桌子类table,内有私有数据h ...
- 曲率高斯滤波去噪python实现(附代码详解)
曲率高斯滤波去噪python实现(附代码详解) 曲率滤波的理论基础可以参考下曲率滤波的理论基础和应用,这篇博客介绍的思想完美的避开了一大堆数学公式,简直是我的福音,但还是要细看的,不然很容易忽略重点, ...
最新文章
- 均方差误差函数(使用函数方式实现MSE计算)
- 90后售楼人员的肺腑之言:再便宜你也不能买的房子(转)
- 20161228阅读笔记
- strust2控制标签(二) merge标签,generator标签,subset标签,sort标签
- 老王说ros的tf库
- Windows游戏编程大师技巧笔记(一些基础)
- Winform读报工具
- Ext.apply与Ext.applyIf
- 18个黑科技网站,你想要的软件都能找到,请收藏!!!
- crf的实现 keras_keras 解决加载lstm+crf模型出错的问题
- android视频播放器卡顿,Android,_ExoPlayer循环播放本地视频,偶尔出现视频卡顿。,Android - phpStudy...
- WSO2 ESB 5.0.0 配置消息存储
- shadowdocksc错误;端口已被占用
- Rxjava Subject分析
- 你有哪些独到的识人技巧?
- 寻求任意颜色转CMY的方法,帮个忙
- OpenResty 在又拍云容器平台中的应用
- 填词作文:新的一年,新的梦想
- Java核心技术之Comparator和Comparable在排序中的应用
- 什么是DNS?DNS的作用?