shape_based_matching
shape_based_matching copied to clipboard
关于LUT和ResponceMap分数计算的疑惑
作者在#10 中答复 LUT 的生成原理,贴了这个代码:LUT_gen.cpp,代码里的分数选择好像是根据夹角呈线性分布,而且只有0-4分。
但在论文Gradient Response Maps for Real-Time Detection of Textureless Objects中,分数取的是夹角的余弦的绝对值:
夹角 | 余弦 | 放缩到0-255 | 放缩到0-4 |
---|---|---|---|
0 | 1 | 255 | 4 |
22.5 | 0.92387953 | 236 | 4 |
45 | 0.70710678 | 180 | 3 |
67.5 | 0.38268343 | 98 | 2 |
90 | 0 | 0 | 0 |
论文里保留了1位小数,即1、0.9、0.7、0.4、0分。那么按理来说,这个单点的分数,取整可以取10、9、7、4、0分?
不过论文好像也没有解释为啥取余弦而不是其他函数...
在#69 如何将64个特征点增加到8192个特征点中 作者答复
一个点最高4分,int16_t类型最大值32767,所以不能超过8192。一般也不会这么多。
但是,在 #79 匹配得分的计算问题 中
float score = (score_int * 100.f) / (4 * numFeatures);
为什么在计算分数的时候, 除数要乘以4?
作者答复
因为单点得分最高为4,需要*100 / 4 缩放到100
总分数都设置成float了,为什么还要被int16_t类型限制?而且如果一开始就把分数取0-10,这里是不是可以不用乘100?
另外,我在作者的知乎中看到:
一个特征点就是三个量,x,y坐标跟一个8位的方向(180/8)。匹配的时候,如果同样位置上的方向一致,加4分;方向差22.5度,加3, 45度加2,67.5度加1,90度加0,超90度自动减180,所以就这4个情况。
也就是说,我就算乱给方向,那么得分的期望也有2分,占最高分的一半,给分这么宽容难怪阈值低的时候出现这么多错误匹配。比如遮挡了物体的1/3,现在的实际得分应该是67。但是,由于给分过于宽松,随机物体的分数可以认为是50分的一个正态分布,要超过67分实在是太容易了,所以降低阈值虽然能把部分遮挡的物体检测到,同时会引入大量误匹配。
所以,一个自然的想法就是把误匹配的分布压下去:方向一致给4分,差22.5度给1分,不然不给分。为什么要这样给呢,因为这样一个特征点的期望得分是1分,随机物体的期望得分是25分(而且试了试其他给分都没这样好);至于不一致还给一分是因为方向有可能在交界处左右摇摆,这也是quantization的一个缺点吧,可以用16位来进一步提升效果(待实现)。这样的话,误匹配只会出现在跟实际物体部分相似的地方,比如大家都有圆圆的头之类的。(更新:这里是从focal loss得到的启发;从之前的观点看,这样可以大大降低average pooling的坏处)
如果用cos分数是不是也能解决这个问题,毕竟cos的图像略凸,也能把误匹配的分布压下去。
各位朋友有看懂的也可以指点一下~
好问题,这样确实可以达到一样的效果。
当时最大值选4是考虑到得分之和是一个8bit变量,最255,所以选4并同时把特征点数量限制到63,用10的话特征点就太少了。
后来突破了这个限制,扩展到16bit,但是原来的分数设置也没出现什么问题,所以就沿用最大得分4.
当然,改成这个得分是否在某些case下更好也说不定,有兴趣的话可以尝试一下。
@meiqua 我一直没看明白 LUT 的生成原理: LUT_gen.cpp,能否详细讲下代码原理呢?有示意图最好啦。
可基本参照博文理解https://blog.csdn.net/weixin_41864918/article/details/124324107