深度特征点法SLAM进展

需求:

  1. 完整的SLAM框架
  2. 精度起码是主流水平上
  3. 深度学习要能实时

分析:

目前特征点法SLAM开源框架就是ORBSLAM了。基本上没得挑,PTAM太老更麻烦,自己写精度上比不过主流水平。

问题:

ORB-SLAM是二值化的特征点,而训练出来的特征点一般为浮点值,这个是主要矛盾。
要么将ORB前端改了,由于在ORBSLAM系统中其实只有第一次初始化用到了原始描述点,其后就是用的BoW找到的对应,这个改成浮点描述子是可以完成的,而且速度上损失不会太多。
要么将深度网络二值化。

待解决:

  • 有一个神经网络模型(成功)
  • 神经网络输出二值化(暂时搁置)
  • 修改网络以适应实时性(成功)
  • pytorch模型加载到c++中(成功)
  • 在c++中写NMS等函数来处理网络输出
  • 训练词袋模型对应的图片集
  • 训练对应网络的BoW
  • 修改ORBSLAM框架
  • 部署到实际硬件

神经网络二值化

目前研究二值化论文挺多的,我研究下这个问题的需要其实只用二值化激活层就可以,权重不需要二值化。
二值化本身都会有精度上损失(具体任务不同),而如果只是有限的得到二值输出其实损失应该不会很高。
所以主要关注点是二值化网络最后一层

所谓二值化激活层就是在那一层上对forward和backward使用不同的策略
forward时候使用sign()
backward时候保留梯度,其实就是hardTanh()
在此基础上又有很多的变形
class ActivationBinarizerFunction(Function):
    @staticmethod
    def forward(ctx, input):
        ctx.input = input
        return input.sign()

    @staticmethod
    def backward(ctx, grad_output):
        x = ctx.input.clamp(-1, 1)
        return (2 - 2 * x * x.sign()) * grad_output

class ActivationBinarizer(nn.Module):
    def forward(self, input):
        return ActivationBinarizerFunction.apply(input)

class HardNetNeiMask(nn.Module):
    def __init__(self, MARGIN, C):
        super(HardNetNeiMask, self).__init__()
        self.MARGIN = MARGIN
        self.C = C
        self.features = nn.Sequential(
            nn.Conv2d(1, 32, kernel_size=3, padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(32, 32, kernel_size=3, padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(128, 128, kernel_size=3,padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(128, 256, kernel_size=3, stride=2,  padding=1, bias=False),
            nn.ELU(),
            nn.Conv2d(256, 256, kernel_size=4, bias=False),
        )
    def forward(self, input):
        x_features = self.features(self.input_norm(input))
        x = x_features.view(x_features.size(0), -1)
        x = x / torch.norm(x, p=2, dim=-1, keepdim=True)
        x = ActivationBinarizer()(x)
        # pdb.set_trace()
        return x

loss 函数就是hanming距离

__C.LOSS.SCORE = 100000
__C.LOSS.PAIR = 0.001
# detector learning rate
__C.TRAIN.DET_LR = 0.1
# descriptor learning rate
__C.TRAIN.DES_LR = 0.01

训练十几个epoch的结果


outImg2.png

其实网络还是能学到对应的,但是就是这个上限有点低啊。

在提取特征点描述patch时候,直接把边界值复制扩展比较好,因为这里面涉及到假设就是边界之外同边界大概率是相似的。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 个人为了看的方便没有广告,转载自泡泡机器人:https://www.sohu.com/a/161346283_71...
    Maxsium阅读 39,580评论 0赞 8
  • 导语 毫无疑问,SLAM是当前最酷炫的技术.在这里,我给大家分享一些在学习SLAM的过程中的一些资料与方法(不断更...
    飞天小小猫阅读 2,889评论 1赞 38
  • SLAM for Highly Dynamic Environments用于高动态环境的单目语义SLAM [TOC...
    liampayne_66d0阅读 1,236评论 0赞 0
  • 摘要 回环是基于激光的同时定位和建图研究中的一个众所周知的问题,特别是对于大规模环境中的应用。 无论使用基于粒子滤...
    陌上尘离阅读 1,443评论 0赞 0
  • 2012年的时候,我遇到 了一个女孩子,让我动了心。 一段时间里,我特别特别地对她着迷。 我这人嘴很笨,我不知道怎...
    a87f4a0f66c7阅读 396评论 0赞 1

友情链接更多精彩内容