回顾了一下比赛的问题
我们这个slam针对的场景是什么?这个需要分析下优缺点。
直觉:
1、ORB更稳定,rfnet更准确。
可能原因:
- orbslam对于orb特征点选择问题,特征点选择方式使得系统更加稳定
- 系统参数没调整好
- rfnet特征点本身的问题
2、Orb,rfnet,lfnet在什么场景会好?什么场景会不好?
较难比较
3、ORB与SIFT之类的在keypoints上有什么差异?
keypoints对比:
ORB
ORBSLAM系统中的ORB
RFNET
直观上RFNET更稀疏,倾向于物体的轮廓,似乎能感知到图片中高层语义信息,比如电脑和桌子的轮廓非常清晰,不仅仅是图像灰度变化就会相应。
匹配效果上:
ORB
RFNET
感觉比orb匹配成功的更多
Fast与Sift的比较
4、SURF之类的加速策略?
5、能不能在RFNET网络中引入在无纹理区域加特征点机制。使得密集地方还是很密,但是在空白地方也要有至少达到一定数量的特征点,尽管要保持不均匀性,但是要兼顾稳定性
6、RFNet直觉上光照更稳定
当我们都提取1000个特征点时候,RFNet能得到的正确匹配比ORB要多很多
RFNET
ORB
7、 能不能也安LIFT学习SIFT流程学习一遍ORB?
不太可能,因为detector本质上就是fast,orb是描述方法通过学习的,改成深度学习意义不是很大。
8、 ORBSLAM系统上希望得到的特征点
均匀,并且要有一定表现能力
9 、ORBSLAM系统提取特征点策略:
整个特征提取部分涉及到的对象结构如下:
特征点提取策略
每一帧图像共提取1000个特征点,分布在金字塔8层中,层间尺度比例1.2,计算下来金字塔0层大约有217个特征点,7层大约有50个特征点。
9.1 建立金字塔
为了得到尺度不变性,使用金字塔结构。
9.2 在每层金字塔上划分网格提取fast角点
-
ComputeKeyPointsOctTree()
这一步要对图像每一层来计算特征点,具体步骤就是将图像划分成小网格区域(orbslam2里使用的是30大小的窗口),然后对每个小网格单独使用FAST角点检测。值得注意是,为了尽可能使得每个小网格都能有点被检测到,这里使用了两种不同的阈值,如果没有检测到角点则使用更低阈值检测。//计算FAST关键点 vector<cv::KeyPoint> vKeysCell; FAST(mvImagePyramid[level].rowRange(iniY,maxY).colRange(iniX,maxX), vKeysCell,iniThFAST,true); // 如果没有找到关键点,就降低阈值重新计算FAST if(vKeysCell.empty()) { FAST(mvImagePyramid[level].rowRange(iniY,maxY).colRange(iniX,maxX), vKeysCell,minThFAST,true); }
得到角点后对每一层都调用一下DistributeOctTree()
9.3 使用四叉树均匀角点
- DistributeOctTree()
其实是四叉树均匀分布算法的实现。
为了提取出的特征点在图像中分布比较均匀(实际情况中,特征点通常分布得比较集中,这样不利于进行匹配,也不利于精确地求解相机间的位姿从而得到精确的VO轨迹),使用了八叉树(其实是平面上的四叉树)的数据结构来存储提取出的特征点。
这个树结构除了根节点其实只实现了3层,最顶层的node数量由图像的横纵比决定(例如2);下面两层最多产生64个叶子。因此,对于前面提到的特征点数,平均每个分割节点中分布一两个特征点,如果该叶子中含有较多特征点,则选取其中Harris响应值(是由OpenCV的KeyPoint.response属性计算的)最大的,其他的抛弃!
10 初步设想
- end-to-end学出来这种orbslam2的特征选择方式,甚至要更稳定
- 速度要提升上来
- lfnet在尺度上来说是失败的,rfnet提高了很多,但是角度上反而变差了,应当具有更好的尺度角度信息
- 实际应用场景更加鲁棒,如光线明暗、模糊、动态场景