(CVPR20)D3Feat:JointLearningofDenseDetectiona。。。
想要了解深⼊了解D3Feat产⽣的原因,建议可以先去看⼀下D2Net[1],再来看D3Feat.
D3Feat核⼼优势:
1. D3Feat提供了⼀种联合框架,在学习描述⼦的同时进⾏关键点的检测,传统匹配可能是detect and describe,⽽本⽂遵循describe
to detect的范式,即不需要额外显式预测关键点,在提取描述⼦的同时进⾏关键点的选取。
2. 采⽤KPConv作为特征提取backbone,全卷积的⽹络架构能够使整个⽹络前向传播速度很快,作⼀次inference基本在1s以内。
3. 最终⽤来做RANSAC配准的点不再是随机选取,⽽是选取⽹络学习出来的关键点。(其实关键点这种策略在3DMatch中效果并不是
特别明显,原因是3DMatch benchmark作过2.5cm下采样后,基本点数在20K左右,随机选取5K点和选取5K关键点,最后RANSAC出来效果其实相差不⼤,或者说并没有很显著的优势,但在⼩点数⽐如250点时优势会⽐较明显)
Work Flow:
1. 采⽤KPConv作为backbone进⾏特征提取,本⽂中不作重点介绍,需要的可以去看原⽂。(代码⽅⾯不得不说原作者Hugues
THOMAS真的很强,但是会相对⽐较难理解⼀些,建议上⼿KPConv代码可以先从⽩博的⼊⼿)
KPConv在这⾥可以粗浅的理解为⼀个Encoder-Decoder结构:输⼊点云,输出feature map , = 32.
2. 重要假设:可以认为,关键点的特征是具有⼀些特殊属性,即与领域点的特征会有较⼤差别的,因此使⽤这⼀点来进⾏关键点的选
取:
⾸先约定⼀些符号:
,即代表feature map的第列
,即代表feature map的第⾏
判断⼀个点是否为关键点的标准:
即:是关键点中最⼤的那⼀维(假设是第维,即第⾏列)特征同时在的所有邻域点在第维上特征中是最⼤的。
描述会有些绕,上⾯的式⼦其实还是⽐较好看懂的。
3. 如何把上述关键点选取的准则soften以进⾏训练呢,作者定义两个score来描述上述两个
操作:
其实看懂了第⼆步,这⼀步也不难理解,与分别对应第⼆步中的两个操作。
depth_wise_max_score
local_max_score
接着两个相乘,得到最终的saliency score map
,代表每个点是否为关键点的置信度。
在代码中就是这样操作的:
⾄此,⽹络输出⼀个dense descriptor,⼀个saliency score map.
Loss:
Descriptor Loss:⾸先为了监督提取的特征,⽂中说⽤Hardest Contrastive Loss,其实代码中使⽤的是Circle Loss[2],这个loss现在在metric learning中⽤的也⽐较多了,效果⾮常好,这⾥不作展开。 Detector Loss:本⽂主要是看detector loss的设计,由于缺少哪些点是关键点的这种ground truth信息,因此使⽤on-the-fly技术对关键点信息进⾏监督: 从式⼦来分析(这⾥还是假设⽤的是Contrastive Loss),当 d p o s ( i ) < d n e g ( i ) {d_{pos}}(i) < {d_{neg}}(i) dpos(i)<dneg(i)时,说明此时若在特征空间中作KNN query,点 i i i是⼤概率被视作correspondence的,这时就希望点 i i i的saliency score越⼤越好,因此两者相乘,⼀负⼀正,正好是loss降低的⽅向。反过来也是如此。
Training:
P∈R N×3F∈R N×c c D=
k F,D∈
:k
k R N D k k
d=
i F,d∈
i:i R c d i i
x i⇔d i k i k x i N x i k
argmax
βi kαi k argmax
βi k⇔
αi k⇔
∈R N×1
∈R N×32∈R N×1
默认150 epochs,总时长:
在训练集上circle loss和detector loss的收敛曲线:
可以看到整体收敛曲线⾮常平稳,接着分别在5000、2500、1000、500、250个点上进⾏evaluate,reported metrics是inlier ratio 与feature match recall (registration recall在D3Feat的pytorch版本上的测试代码中没有写,tensorflow版本有,但我⽐较懒就没⾃⼰去写registration recall的scripts).
Keypoints500025001000500250 Feature Matching Recall95.7695.7495.6194.6493.31 Inlier Ratio43.0642.7642.4540.7337.86
⽂中结果:
可以看到整体复现性还是⾮常⾼的。
tensorflow版本选择可视化250个关键点:
Summary:
从上图也可以看到,关键点基本都避免选取在平坦区域,说明detector策略还是⽐较成功的,只不过和之前的分析⼀样,在结果⽅
⾯,D3Feat在⼤点数时⼏乎没有什么优势,registration recall没有随机选点的FCGF⾼,但是在⼩点数⽐如250点时优势会⽐较明显。
个⼈感觉是数据集3DMatch的限制,导致关键点策略会不那么亮眼,毕竟从2w个点⾥选5k个点,也选不出什么花来,后⾯还有RANSAC 给你兜底…
Pretrained Model can be found at here:
Done

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。