2019-02-24 20:18:22 fjsd155 阅读数 889
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40065 人正在学习 去看看 唐宇迪

本文转自:使用深度学习进行生存分析

相关资源

原论文地址:here

论文中使用的深度生存分析库:DeepSurv,是基于Theano 和 Lasagne库实现的,支持训练网络模型,预测等功能。

考虑到DeepSurv库中存在着一些错误以及未实现的功能,博主使用目前主流的深度学习框架Tensorflow实现了深度生存分析库:TFDeepSurv。欢迎有兴趣的同学Star和Fork,指出错误,相互交流!

TFDeepSurv简介:基于tensorflow的深度生存分析框架,经过模拟数据和真实数据的测试。支持生存分析数据事件时间出现ties的建模,自定义神经网络结构及参数,可视化训练过程,输入训练数据特征重要性分析,病人生存函数的估计。还有支持使用科学的贝叶斯超参数优化方法来调整网络参数。

博主有空会给出TFDeepSurv各个功能实现参考的源论文!

前言

本文主要的目的为了介绍深度学习是如何运用到生存分析中的,包括其基本原理。然后介绍目前实现了利用深度学习进行生存分析的开源软件包 DeepSurv,它实现了生存分析模型,使用Deep Neural Networks来训练学习参数,并且还实现了风险人群的划分。

还是一样的,强烈建议你去读一下原论文DeepSurv: Personalized Treatment Recommender System Using A Cox Proportional Hazards Deep Neural Network.,相信你会收获很大,至少比看我的好一万倍。写这篇文章的动力有几点,一是不想自己学过的知识什么很快就忘了,感觉记录一下比较重要(博主比较蠢),当作是看论文的笔记吧;二是看完文章之后,觉得我们平时还是要多思考,论文里的思想其实也不是完全原创的,神经网络不是,生存分析cox比例风险模型1972年就有了,但是别人就能洞察到使用深度学习的思想去学习COX模型中需要估计的参数,个人觉得这是一个有科学素养的人才能做到的吧;三是博主在为了PR收集生存分析资料的时候,深感不易,这方面的中文的介绍很少,所以为了方便大家的交流讨论,还是写一下吧。

博主知识水平有限,不吝赐教!欢迎提出错误!

问题来源

假设你已经知道了生存分析主要是在做哪些工作。我们都知道在进行生存分析的时候,有这么几种方法:

  • 参数法:当生存时间符合某一个已知分布时,知道了分布函数,那么剩下的就是求解该分布的参数了。
  • 非参数法:用KM估计去求生存函数,作生存曲线,这里面不涉及任何参数,主要思想就是频率代替概率。
  • 半参数法:也就是使用COX比例风险模型来求生存函数,这个也是本文的重点。

关于COX比例风险模型是怎么提出的,这个是1972年前辈的智慧,本文不打算介绍,这里给出一个链接:hazard-curve,可以帮助你快速了解生存分析和生存函数以及风险曲线的数学定义,然后你就可以去看COX比例风险模型是怎么提出来的了。确保自己懂了COX比例风险模型的原理,可以问自己几个问题:比例两个字是体现在那个地方?为什么风险函数会是h(t)=h0(t)eθxh(t) = h_0(t)\cdot e^{\theta \cdot x} 这种形式?

COX比例风险模型,直接给出了风险函数的数学表达式(假设你已经学会了懂了其背后的数学原理):
h(t)=h0(t)eθxh(t) = h_0(t)\cdot e^{\theta \cdot x}
其中,θ=(θ1,,θm)θ=(θ_1,…,θ_m)是线性模型的系数或未知参数,h0(t)h_0 (t)是基准风险函数。eθxe^{θx}描述了患者观察到回归变量xx时的死亡风险比例。对∀i∈N,θ_i>0,表示该协变量是危险因素,越大使生存时间越短。 ∀i∈N,θ_i < 0表示该协变量是保护因素,越大使得生存时间越长。

现在需要去求取参数θ\theta,其思想就是偏似然估计法。假定在某死亡时间没有重复事件发生,设t1t2tkt_1<t_2<⋯<t_k 表示在观察数据中有kk个不同的死亡事件。设xix_i的观察协变量。设R(ti)R(t_i)时间仍然处于观察研究的个体集合。则风险函数h(t)h(t)的参数估计可以用以下偏似然概率估计方法:
pl(θ)=i=1keθxijR(ti)eθxjpl(\theta) = \prod_{i=1}^{k}\frac{e^{\theta x_i}}{\sum_{j \in R(t_i)}e^{\theta x_j}}

其中qi=eθxijR(ti)eθxjq_i = \frac{e^{\theta x_i}}{\sum_{j \in R(t_i)}e^{\theta x_j}}个死亡个体,其死亡条件概率。其实通俗一点的解释就是:我已经观察到时间tit_i了,现在有一群人,我可以利用风险公式h(ti)h(t_i) 求出这群人每一个个体的死亡风险,其中有一个人恰好在tit_i时刻发生了死亡事件,那么这个人的死亡条件概率就写为:
qi=hi(ti)jR(ti)hj(ti)=eθxijR(ti)eθxjq_i = \frac{h_i(t_i)}{\sum_{j \in R(t_i)}h_j(t_i)} = \frac{e^{\theta x_i}}{\sum_{j \in R(t_i)}e^{\theta x_j}}

现在就是利用偏似然估计的思想,将所有死亡时刻t1,t2,...,tkt_1,t_2,...,t_k的死亡条件概率相乘,求取是这个乘积最大的参数值θ\theta,把它作为估计量。

注意COX模型给出的前提:假设协变量的总影响可以表示为它们的线性组合。例如,我评价一个人的颜值vv,你告诉我颜值可以这么计算v=2x1+9x2+1.3x3v=2x_1 + 9x_2+1.3x_3x1,x2,x3x_1,x_2,x_3表示眼睛大小,脸型,鼻子高度(当然,这里是打个比方QAQ)。事实上,很多情况下,协变量的线性组合不能准确衡量它们对某个目标值的影响! 关于这点例子很多(例XOR问题),就不一一介绍了。

问题根源就是在θx\theta \cdot x,我们把它记为rr。那么我们可不可以把它表示为非线性组合呢?但是好像它的数学表达式公式不太好给出,无论我们怎么表示rr,其目标都是使pl(θ)pl(\theta)最小。这个时候,神经网络的作用就显现出来了,它对于表示一组协变量的非线性组合简直太擅长了!假设网络的输入为一组协变量x=(x1,x2,...,xn)x=(x_1,x_2,...,x_n),那么网络的输出表示为r^w,b\hat r_{w,b}为神经网络的参数。然后,损失函数就很显而易见了:
L=log(pl(r^w,b))=log(i=1ker^w,bijR(ti)er^w,bj)L = -log(pl(\hat r_{w,b})) = -log(\prod_{i=1}^{k}\frac{e^{\hat r_{w,b}^i}}{\sum_{j \in R(t_i)}e^{\hat r_{w,b}^j}})
h(x)h(x)表示为网络的输出,那么上式可以化简为:
L=i=1k[hi(x)log(jR(ti)ehj(x))]L = -\sum_{i=1}^{k}[h_i(x)-log(\sum_{j\in R(t_i)}e^{h_j(x)})]
剩下的工作就交给神经网络去训练样本学习到这样的非线性组合&lt;r^w,b=f(x,θ)&lt;\hat r_{w,b}=f(x,\theta)。其实思路还是很好懂的嘛。

DeepSurv网络框架实现

DeepSurv 的工作就是实现了上面介绍的所有内容(最重要的是损失函数),还实现了一些其他的功能(比如划分风险人群)。下面介绍一下这个框架的实现。

这里是DeepSurv类下面定义的方法:

class DeepSurv:
    def __init__()
    # 计算Loss function值
    def _negative_log_likelihood()
    # 得到当前网络的loss值同时更新网络参数
    def _get_loss_updates()
    # 得到可调用的函数:训练集上,网络进行一次正向和反向传播
    #                验证集上,一遍正向传播,计算Loss function值
    def _get_train_valid_fn()
    # 计算评估指标:C Index
    def get_concordance_index()
    def _standardize_x()
    def prepare_data()
    def train()
    def to_json()
    def save_model()
    def save_weights()
    def load_weights()
    # 得到网络的输出值
    def risk()
    def predict_risk()
    # 划分风险人群
    def recommend_treatment()
    def plot_risk_surface()

初始化函数:初始化网络结构,并且记录一些参数

def __init__(self, n_in,
    learning_rate, hidden_layers_sizes = None,
    lr_decay = 0.0, momentum = 0.9,
    L2_reg = 0.0, L1_reg = 0.0,
    activation = "rectify",
    dropout = None,
    batch_norm = False,
    standardize = False,
    ):

按照给定hidden_layers_sizes的搭建指定的网络结构:
输入层:network = lasagne.layers.InputLayer(shape=(None,n_in),input_var = self.X)
隐藏层:network = lasagne.layers.DenseLayer(network, num_units = n_layer, nonlinearity activation_fn, W = W_init)(参数决定该层是否dropout或者BatchNorm)
输出层:network = lasagne.layers.DenseLayer(network, num_units = 1, nonlinearity = lasagne.nonlinearities.linear, W = lasagne.init.GlorotUniform())

训练函数:在给定的训练数据上进行训练,并且在验证集上进行评估

def train(self,
    train_data, valid_data= None,
    n_epochs = 500,
    validation_frequency = 250,
    patience = 2000, improvement_threshold = 0.99999, patience_increase = 2,
    logger = None,
    update_fn = lasagne.updates.nesterov_momentum,
    verbose = True,
    **kwargs):

训练函数里的内容就是通用的一套了:

  • 准备好训练数据
  • 每个epoch迭代训练网络
  • 计算Loss,反向传播更新网络参数

具体地,源代码里还有很多细节的地方,自己亲身学习一下还不错啊!

原博客作者另外还写了一篇实战的总结:【论文笔记】Deep Survival: A Deep Cox Proportional Hazards Network ,值得借鉴。

2019-05-11 20:20:09 H_hei 阅读数 230
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40065 人正在学习 去看看 唐宇迪

dataScience

闲话 ?:每个人都应在学习的方向一定是需要经过各方面的考虑、斟酌、权衡的。

这里旨在分享一些我在学习的过程中所收集使用到的一些书籍和资料,其中包括 数据挖掘 、算法、数据分析、机器学习、深度学习、深度学习框架、和一些大牛的笔记以及老师们的讲义供大家学习。

github地址https://github.com/mmkliuzhiliang/dataScience

这方面的学习实则为交叉学科下面分类仅仅供参考

机器学习

数据挖掘

数据分析

深度学习

python

链接:https://pan.baidu.com/s/1t_kwkidQ1dLALhQq3sZjtg
提取码:ew4a

插入一张图谱 供大家参考
在这里插入图片描述


如有侵权,请及时联系、谢谢(。・_・。)ノI’m sorry~

2018-07-15 10:50:49 xiaoxiaowenqiang 阅读数 6990
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40065 人正在学习 去看看 唐宇迪

深度学习结合SLAM 研究现状总结

深度学习结合SLAM 语义slam 语义分割 端到端SLAM CNN-SLAM DenseSLAM orbslam2 + ssd LSD-SLAM + CNN SemanticFusion Mask

博文末尾支持二维码赞赏哦 _
本文github链接

1. 用深度学习方法替换传统slam中的一个/几个模块:

            特征提取,特征匹配,提高特征点稳定性,提取点线面等不同层级的特征点。
            深度估计
            位姿估计
            重定位
            其他
    目前还不能达到超越传统方法的效果,
    相较传统SLAM并没有很明显的优势(标注的数据集少且不全,使用视频做训练数据的非常少。
    SLAM中很多问题都是数学问题,深度学习并不擅长等等原因)。

2. 在传统SLAM之上加入语义信息

            图像语义分割
            语义地图构建
    语义SLAM算是在扩展了传统SLAM问题的研究内容,现在出现了一些将语义信息集成到SLAM的研究,
    比如说用SLAM系统中得到的图像之间的几何一致性促进图像语义分割,
    也可以用语义分割/建图的结果促进SLAM的定位/闭环等,前者已经有了一些研究,
    不过还是集中于室内场景,后者貌似还没有什么相关研究。
    如果SLAM和语义分割能够相互促进相辅相成,应该能达到好的效果。
    另:使用SLAM帮助构建大规模的图像之间有对应关系的数据集,
    可以降低深度学习数据集的标注难度吧,应该也是一个SLAM助力深度学习的思路。

3. 端到端SLAM

    其实端到端就不能算是SLAM问题了吧,SLAM是同步定位与地图构建,端到端是输入image输出action,没有定位和建图。 
    - 机器人自主导航(深度强化学习)等

1. 用深度学习方法替换传统slam中的一个/几个模块:

A. CNN-SLAM: Real-time dense monocular SLAM with learned depth prediction

论文

基于CNN的单张图深度估计,语义SLAM,半稠密的直接法SLAM.
将LSD-SLAM里的深度估计和图像匹配都替换成基于CNN的方法,取得了更为robust的结果,并可以融合语义信息.

鉴于卷积神经网络(CNN)深度预测的最新进展,
本文研究了深度神经网络的预测深度图,可以部署用于精确和密集的单目重建。
我们提出了一种方法,其中CNN预测的稠密深度图与通过直接单目SLAM获得的深度测量自然地融合在一起。
我们的融合方案在图像定位中优于单目SLAM方法,例如沿低纹理区域,反之亦然。
我们展示了使用深度预测来估计重建的绝对尺度,从而克服了单眼SLAM的主要局限性之一。
最后,我们提出一个框架,从单个帧获得的语义标签有效地融合了密集的SLAM,从单个视图产生语义相干的场景重构。
两个基准数据集的评估结果显示了我们的方法的鲁棒性和准确性。

B. DenseSLAM 使用CNN+DeCNN+RNN

它接受当前RGB图像 It,以及来自迁移级的隐藏状态 h(t-1),通过LSTM单元进行内部转移。
网络的输出是稠密地图 Zt, 以及相机的姿态 Rt, Tt.

网络结构:

网络结构的另一个参数是时间窗口的大小N=10.

2. Vision Semantic SLAM 视觉分割SLAM 语义SLAM

语义SLAM参考

    SLAM的另一个大方向就是和深度学习技术结合。
    到目前为止,SLAM的方案都处于特征点或者像素的层级。
    关于这些特征点或像素到底来自于什么东西,我们一无所知。
    这使得计算机视觉中的SLAM与我们人类的做法不怎么相似,
    至少我们自己从来看不到特征点,也不会去根据特征点判断自身的运动方向。
    我们看到的是一个个物体,通过左右眼判断它们的远近,
    然后基于它们在图像当中的运动推测相机的移动。

    很久之前,研究者就试图将物体信息结合到SLAM中。
    例如文献[135-138]中就曾把物体识别与视觉SLAM结合起来,构建带物体标签的地图。
    另一方面,把标签信息引入到BA或优化端的目标函数和约束中,
    我们可以结合特征点的位置与标签信息进行优化。
    这些工作都可以称为语义SLAM。

    语义和SLAM看似是两个独立的模块,实则不然。
    在很多应用中,二者相辅相成。
    一方面,语义信息可以帮助SLAM提高建图和定位的精度,特别是对于复杂的动态场景。
    传统SLAM的建图和定位多是基于像素级别的几何匹配。
    借助语义信息,我们可以将数据关联从传统的像素级别升级到物体级别,提升复杂场景下的精度。
    
    另一方面,借助SLAM技术计算出物体之间的位置约束,
    可以对同一物体在不同角度,
    不同时刻的识别结果进行一致性约束,从而提高语义理解的精度。

    综合来说,SLAM和语义的结合点主要有两个方面:

    1、 语义帮助SLAM。
      传统的物体识别、分割算法往往只考虑一幅图,
      而在SLAM中我们拥有一台移动的相机。
      如果我们把运动过程中的图片都带上物体标签,就能得到一个带有标签的地图。
      另外,物体信息亦可为回环检测、BA优化带来更多的条件。
      
    2、 SLAM帮助语义。
      物体识别和分割都需要大量的训练数据。
      要让分类器识别各个角度的物体,需要从不同视角采集该物体的数据,然后进行人工标定,非常辛苦。
      而SLAM中,由于我们可以估计相机的运动,可以自动地计算物体在图像中的位置,节省人工标定的成本。
      如果有自动生成的带高质量标注的样本数据,能够很大程度上加速分类器的训练过程。

    在深度学习广泛应用之前,我们只能利用支持向量机、条件随机场等传统工具对物体或场景进行分割和识别
    或者直接将观测数据与数据库中的样本进行比较[108,140],尝试构建语义地图[138,141-143]。
    由于这些工具本身在分类正确率上存在限制,所以效果也往往不尽如人意。
    随着深度学习的发展,我们开始使用网络,越来越准确地对图像进行识别、检测和分割[144-149]。
    这为构建准确的语义地图打下了更好的基础[150]。我们正看到,逐渐开始有学者将神经网络方法引入到SLAM中的物体识别和分割,
    甚至SLAM本身的位姿估计与回环检测中[151-153]。
    虽然这些方法目前还没有成为主流,但将SLAM与深度学习结合来处理图像,亦是一个很有前景的研究方向。

    语义slam应用:

    首先,目前理解的语义的定义的先明确下:
      1)图像的标注,即特定目标的识别定位与三维重建,
         并将定位信息与识别标签与SLAM的位置信息结合,
         实现基于SLAM的三维空间的场景物体打标与模型构建,即图像的内容结构化;
      2)标注图像与场景其他物体之间的关系,即所说的场景理解,
         将整个场景的图像内容以故事描述的方式串联起来,
         构成完成的图像场景信息,及图像内容的语义化。
    第二部分基本属于纯粹的语法语义理解的范畴,脱离图像信息的研究内容,目前工作涉及不多,
    
    暂就第一部分及受邀内容涉及的结合点简单讲述下:

      1)SLAM对应的是3维点云信息;

      2)图像语义信息的低层级信息,即为特定对象的目标识别定位;

      3)特定对象的分割、识别定位信息与3DSLAM点云信息的结合,实现3D模型跟踪与重建;

      4)将3D目标对象插入到SLAM得到的空间位置序列中。

A. orbslam2 + ssd物体检测实现3d物体分割

场景映射 semantic Mapping :  SLAM定位和建图
目标检测和场景分割 bject Detection and Semantic Segmentation : RCNN\YOLO\SSD


    基本框架图如下: 
            输入RGB-D图像 -> ORB-SLAM2应用于每一帧->
            SSD(Single Shot MultiBox Detector)用于每一个关键帧进行目标检测,3D无监督分割方法对于每一个检测结果生成一个3D点云分割 ->
            使用类似ICP的匹配值方法进行数据关联,以决定是否在地图中创建新的对象或者跟已有对象建立检测上的关联 -> 
            地图对象的3D模型(3D点云分割,指向ORB-SLAM2中位姿图的指针,对每个类别的累计置信度)
   

    利用现在检测速度很快的SSD,以及基本上可以达到实时定位的ORB-SLAM2相互促进。
    然后通过把深度图进行划分,物体检测,最终输出带有语义信息的语义地图。
    个人觉得,本文的难点在数据的融合,也就是流程图的第三部分,两者之间怎么去相互配合。

    其次本文作者比较谦虚的承认:
    为什么没有取名为语义SLAM,是因为该工作只是用SLAM促进分割,并没有用语义分割去促进定位。
    实际上两者应该是相辅相成的,只不过貌似后者还没有人做罢了。

    本文在实时性和计算量应该算是比较合理的,一般GPU应该能跑起来;缺点是地图可读性比较差。
    
    由于需要非常精确的图像分割,所以本文利用Depth图来帮助分割。
    所以需要对Depth进行分割的算法,本文采用了文章@Felzenszwalb2004@Pham2016Geometrically等人的算法。
    也是涉及到基于图的分割的过程。
    
    数据关联 Data Association
      当完成了把3D Point投影到识别的物体后,数据关联要做的事:
      判断检测到的物体是否已经在已经构建的地图中存在了呢,
      如果不存在的话,就需要新增这个物体。
      
    通过一个二阶的流程来实现:
      对于每一个检测到的Object,根据点云的欧式距离,来选择一系列的Landmarks(已经检测到并在地图里面已经有的Object)
      对Object和Point Cloud of landmark进行最近邻搜索,使用了k-d tree来提高效率,
      其实这一步也就是判断当前图像检测到的Object与已有的地图中的Landmark(Object)是否相匹配。
      
      在第二步中,如果多余50 % 的Points的都距离小于2cm的话,就说明这个检测到的Object已经存在了。
      这个也就是把CNN的分割结果与地图中的Object进行关联起来,并用颜色表示Map中Object的类别。
    
      在上一篇SematicFusion中,采用的Recursive Bayesian 的更新规则来完成地图更新的!
      看来,这个是CNN与传统的SLAM框架结合的时候的一个需要解决的问题,
      那就是如何把新来的物体与已有的地图中的物体相互关联起来,并更新!

Meaningful Maps With Object-Oriented Semantic Mapping

B. 单目 LSD-SLAM + CNN卷积网络物体分割

    基本框架图如下: 
    输入RGB图像->选择关键帧并refine->2D语义分割->3D重建,语义优化 

    东南大学的一个同学做的,算是参考文献就6页的神文,CVPR2016最佳论文之一。

论文

    大致思路:
            利用LSD-SLAM作为框架,结合CNN进行有机融合,
            选择关键帧进行做深度学习实现语义分割,之后选择相邻的几帧做增强。

C. 数据联合RNN语义分割+ KinectFusion跟踪(rgbdslam) =3d Semantic Scene

  看得出来,RNN在帮助建立相邻帧之间的一致性方面具有很大的优势。

  本文利用可以实现Data Associate的RNN产生Semantic Label。然后作用于KinectFusion,来插入语义信息。

  所以本文利用了RNN与KinectFusion来实现语义地图的构建!

DA-RNN 代码

论文

高层特征具备更好的区分性 , 同时帮助机器人更好完成数据关联 . DARNN [66] 引入数据联合
(Data association, DA) 下的 RNN (Recurrent neural network), 
同时对 RGBD 图像进行语义标注和场景重建 . 
将 RGB 图像 和 深度图像 分别输入全卷积网络 , 在反卷积层加入 数据联合 RNN 层 , 
将不同帧图像的特征进行融合 , 同时能够融合 RGBD 图像和深度图像 . 
该文章使用 KinectFusion [67] 完成相机的跟踪 , 估计当前相机的 6DOF 位姿 , 
将 3D 场景表示为 3D 体素 , 保存于 TSDF (Truncated signed distance function).

本文利用可以实现Data Associate的RNN产生Semantic Label。然后作用于KinectFusion,来插入语义信息。
所以本文利用了RNN与KinectFusion来实现语义地图的构建!

本文采用了DA-RNN与KinectFusion合作的方式来产生最终的Semantic Mapping,
而文章采用的则是ORB-SLAM与CNN结合,他们有一些共同的结构,如Data Associate,虽然我现在还不明白这个DA具体得怎么实现!?

D. SLAM++

语义地图表示为一个图网络 , 其中节点有两种 : 
  1) 相机在世界坐标系的位姿 ; 
  2) 物体在世界坐标系的位姿 . 
物体在相机坐标系的位姿作为网络中的一个约束 , 连接相机节点和物体节点 . 
另外网络中还加入了平面结构等约束提高定位的精度 .

E. MO-SLAM (Multi object SLAM)

对于场景中重复出现的物体进行检测 , 该方法不需要离线训练以及预制物体数据库 . 
系统将重建的路标点分类 , 标记该点所属的物体类别 . 
一个物体表示为一个路标点集合 , 相同的物体的不同实例的路标点之间存在如下关系:
P2 = E * P1
系统对于生成的关键帧建立 ORB 描述子的单词树 , 在新的关键帧和候选关键帧之间进行汉明距离匹配 . 
如果匹配点的数量不够 , 那么识别线程停止处理当前帧 , 等待下一个关键帧 . 
使用 RANSAC (Random sample consensus, 随机采样序列一致性) 框架初始化一个位姿变换 ,

F. SemanticFusion: 卷积-反卷积语义分割cnn(基于caffe) + ElasticFusion(稠密SLAM) + CRF融合

Dense 3D Semantic Mapping with Convolutional Neural Networks 论文

ElasticFusion: Real-Time Dense SLAM and Light Source Estimation 论文

ElasticFusion 代码

SemanticFusion代码

主要框架,用到了ElasticFusion和CNN来产生稠密的Semantic Mapping.

偏重怎样结合CNN搭建一套稠密语义SLAM的系统。SemanticFusion架构上主要分为三部分:

1) 前面提到过的ElasticFusion这种稠密SLAM来计算位姿并建出稠密地图;
     稠密SLAM重建目前也相对比较成熟,
     从最开始的KinectFusion(TSDF数据结构 + ICP),
     到后来的InfiniTAM(用哈希表来索引很稀疏的voxel), 
     ElasticFusion(用surfel点表示模型并用非刚性的图结构),
     DynamicFusion(引入了体翘曲场这样深度数据通过体翘曲场的变换后,
         才能融入到TSDF数据结构中,完成有非刚性物体的动态场景重建)都做的比较成熟。
     工业界实现非常好的是微软的HoloLens,在台积电的24核DSP上把mesh simplification这些操作都搞了上去。

2) CNN用RGB或RGBD图来生成一个概率图,每个像素都对应着识别出来的物体类别;

3)通过贝叶斯更新(CRF,条件随机场)来把识别的结果和SLAM生成的关联信息整合进统一的稠密语义地图中。

本文的算法,利用SLAM来实现2D Frame与3D Map之间的匹配(Corresponding)。
通过这种方式,可以实现把CNN的语义预测以概率的方式融合到Dense semantically annotated map.

为什么选择ElasticFusion呢,是因为这种算法是surfel-based surface representation,可以支持每一帧的语义融合。

比较重要的一点是,通过实验说明,引入SLAM甚至可以提高单帧图像的语义分割效果。
尤其在存在wide viewpoint variation,可以帮助解决单目2D Semantic中的一些Ambiguations.

之前存在方法使用Dense CRF来获得语义地图。

本文的主要不同是:利用CNN来产生语义分割,然后是在线以 Incremental 的方式生成Semantic Map。即新来一帧就生成一帧的语义地图。

G. Pop-up SLAM: Semantic Monocular Plane SLAM for Low-texture Environments

论文

代码

概述

好像用LSD SLAM的双目图像 得到深度信息 然后直接构建三维环境(反正是低纹理地区 很好建)

在低纹理条件下(这里可能已经是3D图了?)提取边界线,然后选择地线(这个例子里面分割出地面和门 ) ,
然后构建三维建模 感觉只适用于室内的没什么杂物的环境内,规格化场景可以使用。

H. ros_object_analytics 单帧点云(pcl模型平面分割+欧氏距离聚类物体分割) + Yolo_v2(GPU) / MobileNet_SSD(VPU NCS加速棒) 物体检测

代码

使用pcl算法提供的点云 多平面模型分割 和 多目标欧氏距离聚类分割算法 对单帧 RGBD相机捕获的点云 进行分割, 得到3d分割
使用 Yolo_v2(GPU) / MobileNet_SSD(VPU NCS加速棒) 物体检测算法对 RGB图像进行物体检测, 得到2d检测框
两者根据位置信息进行融合,得到物体的 3d标注框

I. Co-Fusion CRF图像分割 + ElasticFusion(RGBD-SLAM)

论文 Co-Fusion: Real-time Segmentation, Tracking and Fusion of Multiple Objects

代码

J. MaskFusion ElasticFusion(RGBD-SLAM) + 语义分割mask-rcnn

论文 MaskFusion: Real-Time Recognition, Tracking and Reconstruction of Multiple Moving Objects

本文提出的MaskFusion算法可以解决这两个问题,首先,可以从Object-level理解环境,
在准确分割运动目标的同时,可以识别、检测、跟踪以及重建目标。

分割算法由两部分组成:
 1. 2d语义分割: Mask RCNN:提供多达80类的目标识别等
 2. 利用Depth以及Surface Normal等信息向Mask RCNN提供更精确的目标边缘分割。
 
上述算法的结果输入到本文的Dynamic SLAM框架中。
   使用Instance-aware semantic segmentation比使用pixel-level semantic segmentation更好。
   目标Mask更精确,并且可以把不同的object instance分配到同一object category。
 
本文的作者又提到了现在SLAM所面临的另一个大问题:Dynamic的问题。
作者提到,本文提出的算法在两个方面具有优势:
    相比于这些算法,本文的算法可以解决Dynamic Scene的问题。
    本文提出的算法具有Object-level Semantic的能力。
    
    
所以总的来说,作者就是与那些Semantic Mapping的方法比Dynamic Scene的处理能力,
与那些Dynamic Scene SLAM的方法比Semantic能力,在或者就是比速度。
确实,前面的作者都只关注Static Scene, 现在看来,
实际的SLAM中还需要解决Dynamic Scene(Moving Objects存在)的问题。}

每新来一帧数据,整个算法包括以下几个流程:

1. 跟踪 Tracking
    通过 分割获取 独立的 模型对象
   每一个Object的6 DoF通过最小化一个能量函数来确定,这个能量函数由两部分组成:
      a. 几何的ICP Error;  3d-3d匹配点对误差
      b. Photometric cost。2d-2d 像素点 直接法 匹配误差
   此外,作者仅对那些Non-static Model进行Track。
   仅仅对运动的模型进行跟踪,怎么 判断 模型 是否运动 ???
   光流?? 跟踪??
   最后,作者比较了两种确定Object是否运动的方法:
      a. Based on Motioin Incosistency
      b. Treating objects which are being touched by a person as dynamic
      
3. 分割 Segmentation
   使用了Mask RCNN和一个基于Depth Discontinuities and surface normals 的分割算法。
   前者有两个缺点:物体边界不精确、运行不实时。
   后者可以弥补这两个缺点, 但可能会Oversegment objects。
   
4. 融合 Fusion
   就是把Object的几何结构与labels结合起来。

K. DeLS-3D 全深度卷积 语言SLAM CNN+RNN 预测相机位姿态 + CNN+DECNN(卷积+反卷积)2d语义分割

DeLS-3D: Deep Localization and Segmentation with a 2D Semantic

在Localization中,传统的做法是基于特征匹配来做,但这样的坏处是,如果纹理信息较少,那么系统就不稳定,会出错。
一种改进办法是利用深度神经网络提取特征。实际道路中包含大量的相似场景以及重复结构,所以前者实用性较差。

相机的姿态信息可以帮助3D语义地图与2D标签地图之间的像素对应。反过来,场景语义又会帮助姿态估计。 

总的工作流程:

从图中可以看出,RGB Images 以及 根据GPS/IMU获得的semantic label map被输入到Pose CNN,
然后输出的Pose信息输入到 Pose RNN来对Pose进一步提高,这里用RNN来获得前后帧的一致性!
然后在利用新得到的Pose来获取更精确的Semantic Label Map,
最后,这个label Map以及RGB图像输入到Segment CNN来进一步提高语义地图的精度。
这里标签地图被用于提高语义地图的空间精度以及时间一致性。

网络的训练是基于非常精确地相机姿态以及语义分割,所以可以采用监督学习。

Pose Network包含一个Pose CNN以及一个Pose GRU-RNN。
其中Pose CNN的输入是RGB图像I以及一个标签地图L。
输出是一个7维的向量,表示输入图像I与输入标签地图L之间的位姿关系,从而得到一个在3D Map中更精确的姿态.

分割网络结构:

首先基于RGB图像对该网络训练,然后加入标签地图数据进行微调(Fine Tune).
需要注意的是,当标签地图加入框架时,需要经过编码,即每一个像素经One-hot操作得到一个32维的Feature Representation。
然后得到的32维特征加入到RGB图像的第一层卷积输出中,且该层的Kernel数也是32个,从而平衡了两种数据的通道数(Channel Number)。

3. 端到端SLAM 结合深度增强学习 DRL

A. 使用DRL深度加强学习实现机器人自主导航

论文 Target-driven Visual Navigation in Indoor Scenes using Deep Reinforcement Learning

深度强化学习中有两个较少被提及的问题:
  1. 对于新的目标泛化能力不足,
  2. 数据低效,比如说,模型需要几个(通常开销较大)试验和误差集合,使得其应用于真实世界场景时并不实用。 
在这篇文章中,解决了这两个问题,并将我们的模型应用于目标驱动的视觉导航中。
为了解决第一个问题,我们提出了一个actor-critic演员评论家模型,它的策略是目标函数以及当前状态,能够更好地泛化。
为了解决第二个问题,我们提出了 AI2-THOR框架,它提供了一个有高质量的3D场景和物理引擎的环境。
我们的框架使得agent智能体能够采取行动并和对象之间进行交互。因此,我们可以高效地收集大量训练样本。
我们提出的方法 
  1)比state-of-the-art的深度强化学习方法收敛地更快,
  2)可以跨目标跨场景泛化,
  3)通过少许微调就可以泛化到真实机器人场景中(尽管模型是在仿真中训练的)
  4)不需要特征工程,帧间的特征匹配和对于环境的特征重建,是可以端到端训练的。

B. 用于视觉导航的感知建图和规划

论文 Cognitive Mapping and Planning for Visual Navigation

博客笔记

  我们提出了一个用于在陌生环境中导航的神经网络结构。
  我们提出的这个结构以第一视角进行建图,并面向环境中的目标进行路径规划。
  The Cognitive Mapper and Planner (CMP)主要依托于两个观点:
    1.一个用于建图和规划的统一的联合架构中,建图由规划的需求所驱动的。
    2. 引入空间记忆,使得能够在一个并不完整的观察集合的基础之上进行规划。
  CMP构建了一个自上而下的belief map置信地图,
  并且应用了一个可微的神经网络规划器,在每一个时间步骤中决策下一步的行动。
  对环境积累的置信度使得可以追踪已被观察到的区域。
  我们的实验表明CMP的性能优于reactive strategies反应性策略 和standard memory-based architectures 
  标准的基于记忆的体系结构 两种方法,
  并且在陌生环境中表现良好。另外,CMP也可以完成特定的语义目标,
  比如说“go to a chair”到椅子那儿去。 

C. DeepVO:基于深度循环卷积神经网络的端到端视觉里程计 CNN+RNN

论文 End-to-end, sequence-to-sequence probabilistic visual odometry through deep neural networks

DeepVO: Towards End-to-End Visual Odometry with Deep RecurrentConvolutional Neural Networks

本文使用深度递归卷积神经网络(RCNNs),提出了一种新颖的端到端单目VO的框架。
由于它是以端到端的方式进行训练和配置的,
因此它可以直接从一系列原始的RGB图像(视频)中计算得到姿态,而无需采用任何传统VO框架中的模块。

基于RCNN,一方面它可以通过卷积神经网络(Convolutional Neural Network)自动学习VO问题的有效特征表示,
另一方面可以通过递归神经网络(Recurrent Neural Network)对时序模型(运动模型)、数据关联模型(图像序列)进行隐式建模。

在这里插入图片描述

2017-08-22 13:47:29 heyc861221 阅读数 4582
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40065 人正在学习 去看看 唐宇迪

编者按:本文选自图书《Keras快速上手:基于Python的深度学习实战》第七章,本书覆盖当前最热门的传统数据挖掘场景和四个深度学习应用场景,据市场调研,是目前唯一一本以应用为导向的介绍机器学习和深度学习的专业书籍,具备很高的参考价值和学术价值。

自然语言情感分析简介

情感分析无处不在,它是一种基于自然语言处理的分类技术。其主要解决的问题是给定一段话,判断这段话是正面的还是负面的。例如在亚马逊网站或者推特网站中,人们会发表评论,谈论某个商品、事件或人物。商家可以利用情感分析工具知道用户对自己的产品的使用体验和评价。当需要大规模的情感分析时,肉眼的处理能力就变得十分有限了。情感分析的本质就是根据已知的文字和情感符号,推测文字是正面的还是负面的。处理好了情感分析,可以大大提升人们对于事物的理解效率,也可以利用情感分析的结论为其他人或事物服务,比如不少基金公司利用人们对于某家公司、某个行业、某件事情的看法态度来预测未来股票的涨跌。

进行情感分析有如下难点:

  • 第一,文字非结构化,有长有短,很难适合经典的机器学习分类模型。
  • 第二,特征不容易提取。文字可能是谈论这个主题的,也可能是谈论人物、商品或事件的。人工提取特征耗费的精力太大,效果也不好。
  • 第三,词与词之间有联系,把这部分信息纳入模型中也不容易。

本章探讨深度学习在情感分析中的应用。深度学习适合做文字处理和语义理解,是因为深度学习结构灵活,其底层利用词嵌入技术可以避免文字长短不均带来的处理困难。使用深度学习抽象特征,可以避免大量人工提取特征的工作。深度学习可以模拟词与词之间的联系,有局部特征抽象化和记忆功能。正是这几个优势,使得深度学习在情感分析,乃至文本分析理解中发挥着举足轻重的作用。

顺便说一句,推特已经公开了他们的情感分API(http://help.sentiment140.com/api)。读者可以把其整合到自己的应用程序中,也可以试着开发一套自己的API。下面通过一个电影评论的例子详细讲解深度学习在情感分析中的关键技术。

首先下载http://ai.stanford.edu/~amaas/data/sentiment/中的数据。

输入下文安装必要的软件包:

pip install numpy scipy
pip install scikit-learn
pip install pillow
pip install h5py

下面处理数据。Keras 自带了imdb 的数据和调取数据的函数,直接调用load.data()就可以了。

import keras
import numpy as np
from keras.datasets import imdb
(X_train, y_train), (X_test, y_test) = imdb.load_data()

先看一看数据长什么样子的。输入命令:

X_train[0]

我们可以看到结果:

图片描述

原来,Keras 自带的load_data 函数帮我们从亚马逊S3 中下载了数据,并且给每个词标注了一个索引(index),创建了字典。每段文字的每个词对应了一个数字。

print(y[:10])

得到array([1, 0, 0, 1, 0, 0, 1, 0, 1, 0]),可见y 就是标注,1 表示正面,0 表示负面。

print(X_train.shape)
print(y_train.shape)

我们得到的两个张量的维度都为(25000,)。

接下来可以看一看平均每个评论有多少个字:

avg_len = list(map(len, X_train))
print(np.mean(avg_len))

可以看到平均字长为238.714。

为了直观显示,这里画一个分布图(见图7.1):

import matplotlib.pyplot as plt
plt.hist(avg_len, bins = range(min(avg_len), max(avg_len) + 50, 50))
plt.show()

注意,如果遇到其他类型的数据,或者自己有数据,那么就得自己写一套处理数据的脚本。大致步骤如下。

图片描述

图7.1 词频分布直方图

  • 第一,文字分词。英语分词可以按照空格分词,中文分词可以参考jieba。
  • 第二,建立字典,给每个词标号。
  • 第三,把段落按字典翻译成数字,变成一个array。

接下来就开始建模了。

文字情感分析建模

词嵌入技术

为了克服文字长短不均和将词与词之间的联系纳入模型中的困难,人们使用了一种技术——词嵌入。简单说来,就是给每个词赋一个向量,向量代表空间里的点,含义接近的词,其向量也接近,这样对于词的操作就可以转化为对于向量的操作了,在深度学习中,这被叫作张量(tensor)。用张量表示词的好处在于:第一,可以克服文字长短不均的问题,因为如果每个词已经有对应的词向量,那么对于长度为N 的文本,只要选取对应的N 个词所代表的向量并按文本中词的先后顺序排在一起,就是输入张量了,其中每个词向量的维度都是一样的。第二,词本身无法形成特征,但是张量就是抽象的量化,它是通过多层神经网络的层层抽象计算出来的。第三,文本是由词组成的,文本的特征可以由词的张量组合。文本的张量蕴含了多个词之间的组合含义,这可以被认为是文本的特征工程,进而为机器学习文本分类提供基础。

词的嵌入最经典的作品是Word2Vec,可以参见:https://code.google.com/archive/p/word2vec/。通过对具有数十亿词的新闻文章进行训练,Google 提供了一组词向量的结果,可以从http://word2vec.googlecode.com/svn/trunk/获取。其主要思想依然是把词表示成向量的形式,而不是One Hot 编码。图7.2展示了这个模型里面词与词的关系。

图片描述

图7.2 词向量示意图(图片来源:https://deeplearning4j.org/word2vec

多层全连接神经网络训练情感分析

不同于已经训练好的词向量,Keras 提供了设计嵌入层(Embedding Layer)的模板。只要在建模的时候加一行Embedding Layer 函数的代码就可以。注意,嵌入层一般是需要通过数据学习的,读者也可以借用已经训练好的嵌入层比如Word2Vec 中预训练好的词向量直接放入模型,或者把预训练好的词向量作为嵌入层初始值,进行再训练。Embedding 函数定义了嵌入层的框架,其一般有3 个变量:字典的长度(即文本中有多少词向量)、词向量的维度和每个文本输入的长度。注意,前文提到过每个文本可长可短,所以可以采用Padding 技术取最长的文本长度作为文本的输入长度,而不足长度的都用空格填满,即把空格当成一个特殊字符处理。空格本身一般也会被赋予词向量,这可以通过机器学习训练出来。Keras 提供了sequence.pad_sequences 函数帮我们做文本的处理和填充工作。

先把代码进行整理:

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
import keras
import numpy as np
from keras.datasets import imdb
(X_train, y_train), (X_test, y_test) = imdb.load_data()

使用下面的命令计算最长的文本长度:

m = max(list(map(len, X_train)), list(map(len, X_test)))
print(m)

从中我们会发现有一个文本特别长,居然有2494 个字符。这种异常值需要排除,考虑到文本的平均长度为230 个字符,可以设定最多输入的文本长度为400 个字符,不足400 个字符的文本用空格填充,超过400 个字符的文本截取400 个字符,Keras 默认截取后400 个字符。

maxword = 400
X_train = sequence.pad_sequences(X_train, maxlen = maxword)
X_test = sequence.pad_sequences(X_test, maxlen = maxword)
vocab_size = np.max([np.max(X_train[i]) for i in range(X_train.shape[0])]) + 1

这里1 代表空格,其索引被认为是0。

下面先从最简单的多层神经网络开始尝试:

首先建立序列模型,逐步往上搭建网络。

model = Sequential()
model.add(Embedding(vocab_size, 64, input_length = maxword))

第一层是嵌入层,定义了嵌入层的矩阵为vocab_size 64。每个训练段落为其中的maxword 64 矩阵,作为数据的输入,填入输入层。

model.add(Flatten())

把输入层压平,原来是maxword × 64 的矩阵,现在变成一维的长度为maxword × 64的向量。

接下来不断搭建全连接神经网络,使用relu 函数。relu 是简单的非线性函数:f(x) =max(0; x)。注意到神经网络的本质是把输入进行非线性变换。

model.add(Dense(2000, activation = 'relu'))
model.add(Dense(500, activation = 'relu'))
model.add(Dense(200, activation = 'relu'))
model.add(Dense(50, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

这里最后一层用Sigmoid,预测0,1 变量的概率,类似于logistic regression 的链接函数,目的是把线性变成非线性,并把目标值控制在0~1。因此这里计算的是最后输出的是0 或者1 的概率。

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
2 print(model.summary())

这里有几个概念要提一下:交叉熵(Cross Entropy)和Adam Optimizer。

交叉熵主要是衡量预测的0,1 概率分布和实际的0,1 值是不是匹配,交叉熵越小,说明匹配得越准确,模型精度越高。

其具体形式为

图片描述

这里把交叉熵作为目标函数。我们的目的是选择合适的模型,使这个目标函数在未知数据集上的平均值越低越好。所以,我们要看的是模型在测试数据(训练时需要被屏蔽)上的表现。

Adam Optimizer 是一种优化办法,目的是在模型训练中使用的梯度下降方法中,合理地动态选择学习速度(Learning Rate),也就是每步梯度下降的幅度。直观地说,如果在训练中损失函数接近最小值了,则每步梯度下降幅度自然需要减小,而如果损失函数的曲线还很陡,则下降幅度可以稍大一些。从优化的角度讲,深度学习网络还有其他一些梯度下降优化方法,比如Adagrad 等。它们的本质都是解决在调整神经网络模型过程中如何控制学习速度的问题。

Keras 提供的建模API 让我们既能训练数据,又能在验证数据时看到模型测试效果。

model.fit(X_train, y_train, validation_data = (X_test, y_test), epochs = 20,batch_size = 100, verbose = 1)
score = model.evaluate(X_test, y_test)

其精确度大约在85%。如果多做几次迭代,则精确度会更高。读者可以试着尝试一下多跑几个循环。

以上提到的是最常用的多层全连接神经网络模型。它假设模型中的所有上一层和下一层是互相连接的,是最广泛的模型。

卷积神经网络训练情感分析

全连接神经网络几乎对网络模型没有任何限制,但缺点是过度拟合,即拟合了过多噪声。全连接神经网络模型的特点是灵活、参数多。在实际应用中,我们可能会对模型加上一些限制,使其适合数据的特点。并且由于模型的限制,其参数会大幅减少。这降低了模型的复杂度,模型的普适性进而会提高。

接下来我们介绍卷积神经网络(CNN)在自然语言的典型应用。

在自然语言领域,卷积的作用在于利用文字的局部特征。一个词的前后几个词必然和这个词本身相关,这组成该词所代表的词群。词群进而会对段落文字的意思进行影响,决定这个段落到底是正向的还是负向的。对比传统方法,利用词包(Bag of Words),和TF-IDF 等,其思想有相通之处。但最大的不同点在于,传统方法是人为构造用于分类的特征,而深度学习中的卷积让神经网络去构造特征。

以上便是卷积在自然语言处理中有着广泛应用的原因。

接下来介绍如何利用Keras 搭建卷积神经网络来处理情感分析的分类问题。下面的代码构造了卷积神经网络的结构。

from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv1D, MaxPooling1D
model = Sequential()
model.add(Embedding(vocab_size, 64, input_length = maxword))
model.add(Conv1D(filters = 64, kernel_size = 3, padding = 'same', activation= 'relu'))
model.add(MaxPooling1D(pool_size = 2))
model.add(Dropout(0.25))
model.add(Conv1D(filters = 128, kernel_size = 3, padding = 'same',activation= 'relu'))
model.add(MaxPooling1D(pool_size = 2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation = 'relu'))
model.add(Dense(32, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics =['accuracy'])
print(model.summary())

下面对模型进行拟合。

model.fit(X_train, y_train, validation_data = (X_test, y_test), epochs = 20,batch_size = 100)
scores = model.evaluate(X_test, y_test, verbose = 1)print(scores)

精确度提高了一点,在85.5% 左右。读者可以试着调整模型的参数,增加训练次数等,或者使用其他的优化方法。这里还要提一句,代码里用了一个Dropout 的技巧,大致意思是在每个批量训练过程中,对每个节点,不论是在输入层还是隐藏层,都有独立的概率让节点变成0。这样的好处在于,每次批量训练相当于在不同的小神经网络中进行计算,当训练数据大的时候,每个节点的权重都会被调整过多次。另外,在每次训练的时候,系统会努力在有限的节点和小神经网络中找到最佳的权重,这样可以最大化地找到重要特征,避免过度拟合。这就是为什么Dropout 会得到广泛的应用。

循环神经网络训练情感分析

下面介绍如何用长短记忆模型(LSTM)处理情感分类。

LSTM 是循环神经网络的一种。本质上,它按照时间顺序,把信息进行有效的整合和筛选,有的信息得到保留,有的信息被丢弃。在时间t,你获得到的信息(比如对段落文字的理解)理所应当会包含之前的信息(之前提到的事件、人物等)。LSTM 说,根据我手里的训练数据,我得找出一个方法来如何进行有效的信息取舍,从而把最有价值的信息保留到最后。那么最自然的想法是总结出一个规律用来处理前一时刻的信息。由于递归性,在处理前一个时刻信息时,会考虑到再之前的信息,所以到时间t 时,所有从时间点1 到现在的信息都或多或少地被保留一部分,也会被丢弃一部分。LSTM 对信息的处理主要通过矩阵的乘积运算来实现的(见图7.3)。

图片描述

图7.3 长短记忆神经网络示意图(图片来源:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

构造LSTM 神经网络的结构可以使用如下的代码。

from keras.layers import LSTM
model = Sequential()
model.add(Embedding(vocab_size, 64, input_length = maxword))
model.add(LSTM(128, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(64, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32))
model.add(Dropout(0.2))
model.add(Dense(1, activation = 'sigmoid'))

然后把模型打包。

model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics =['accuracy'])
print(model.summary())

最后输入数据集训练模型。

model.fit(X_train, y_train, validation_data = (X_test, y_test), epochs = 5,batch_size = 100)
scores = model.evaluate(X_test, y_test)
print(scores)

预测的精确度大致为86.7%,读者可以试着调试不同参数和增加循环次数,从而得到更好的效果。

总结

本章介绍了不同种类的神经网络,有多层神经网络(MLP),卷积神经网络(CNN)和长短记忆模型(LSTM)。它们的共同点是有很多参数,需要通过后向传播来更新参数。CNN 和LSTM 作为神经网络的不同类型的模型,需要的参数相对较少,这也反映了它们的一个共性:参数共享。这和传统的机器学习原理很类似:对参数或者模型加的限制越多,模型的自由度越小,越不容易过度拟合。反过来,模型参数越多,模型越灵活,越容易拟合噪声,从而对预测造成负面影响。通常,我们通过交叉验证技术选取最优参数(比如,几层模型、每层节点数、Dropout 概率等)。最后需要说明的是,情感分析本质是一个分类问题,是监督学习的一种。除了上述模型,读者也可以试试其他经典机器学习模型,比如SVM、随机森林、逻辑回归等,并和神经网络模型进行比较。


图片描述

CSDN AI热衷分享 欢迎扫码关注

2017-12-12 16:42:39 u010821666 阅读数 19903
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40065 人正在学习 去看看 唐宇迪

整理了部分近两年深度学习结合SLAM的一些研究成果(参考知乎帖子https://www.zhihu.com/question/66006923 和泡泡机器人公众号,附上论文链接和已找到的源代码/数据集链接,大多简单看了一下摘要。仅为自己学习所用,确实翻译得很烂…………

1. 深度学习跟SLAM的结合点

深度学习和slam的结合是近几年比较热的一个研究方向,具体的研究方向,我简单分为三块,如下。


1.1 深度学习结合SLAM的三个方向

用深度学习方法替换传统SLAM中的一个/几个模块

  • 特征提取,特征匹配,提高特征点稳定性,提取点线面等不同层级的特征点。
  • 深度估计
  • 位姿估计
  • 重定位
  • 其他

在传统SLAM之上加入语义信息

  • 图像语义分割
  • 语义地图构建

端到端的SLAM

其实端到端就不能算是SLAM问题了吧,SLAM是同步定位与地图构建,端到端是输入image输出action,没有定位和建图。
- 机器人自主导航(深度强化学习)等



1.2 相关的部分论文整理

1.2.1 用深度学习方法替换传统SLAM中的一个/几个模块。

替换多个模块
  • Tateno K, Tombari F, Laina I, et al. CNN-SLAM: Real-time dense monocular SLAM with learned depth prediction[J]. arXiv preprint arXiv:1704.03489, 2017.
    * 在有预测深度下的实时单目稠密SLAM*
    (输入:彩色图 LSD-SLAM NYUDv2数据集 ICL-NUIM数据集)
    摘要:
    基于使用卷积神经网络CNN进行深度预测的最新进展,本文研究了深度神经网络生成的深度预测地图,如何用于精确而稠密的重建,我们提出了一种直接法单目SLAM中得到的深度度量,如何与CNN预测得到的稠密深度地图自然地融合在一起的方法。我们的融合方法在图像定位这一单目SLAM方法效果不佳的方面有优势。比如说低纹理区域,反之亦然。我们证明了深度预测在估计重建的绝对尺度中应用可以克服单目SLAM的主要限制。最后,我们提出了高效融合稠密SLAM中单帧得到的语义标签的方法 ,从单视角中得到了语义连贯的场景重建。基于两个参照数据集的评测结果表明我们的方法有良好的鲁棒性和准确性。
    这里写图片描述
    注:
    NYUDv2数据集 数据集下载链接
    用于室内场景语义分割的RGB-D图像数据集,来自Kinect,1449对已标注的RGB-Depth图像,40万张未标注图像。
    ICL-NUIM数据集 数据集下载链接
    包含两个场景的图像:起居室和办公室 与TUM RGB-D 数据集的评测工具兼容。帧率30,每段大概几十秒,所以一共几千张图吧。

  • Li R, Wang S, Long Z, et al. UnDeepVO: Monocular Visual Odometry through Unsupervised Deep Learning[J]. arXiv preprint arXiv:1709.06841, 2017.
    UnDeepVO:使用无监督深度学习的单目视觉里程计
    (双目图像训练数据集 单目图像测试 KITTI数据集)
    摘要:
    我们在本文中提出了一种名叫UnDeepVO的新型的单目视觉里程计系统,UnDeepVO可以估计单目相机的6自由度位姿以及使用深度神经网络估计单目视角的深度。UnDeepVO有两个显著的特性:一个是无监督深度学习方法,另一个是绝对尺度回复。特别的,我们使用了双目的图像对训练UnDeepVO来恢复尺度,然后使用连续的单目图像进行了测试。因此,UnDeepVO是一个单目系统。训练网络的损失函数是基于时间和空间稠密信息定义的。图一是系统的概览图。基于KITTI数据集的实验表明UnDeepVO在位姿估计方面,准确性高于其他的单目VO方法。
    这里写图片描述


特征相关(特征提取匹配等)
  • DeTone D, Malisiewicz T, Rabinovich A. Toward Geometric Deep SLAM[J]. arXiv preprint arXiv:1707.07410, 2017.
    面向几何的深度SLAM
    (两个CNN,角点提取和匹配 ,实时,单核CPU30FPS)
    摘要:
    我们展示了一个使用了两个深度卷积神经网络的点跟踪系统。第一个网络,MagicPoint,提取单张图像的显著性2D点。这些提取出来的点可以用作SLAM,因为他们在图像中相互独立且均匀分布。我们比较了这个网络和传统的点检测方法,发现两者在图像有噪声存在是存在明显的性能差异。当检测点是几何稳定的时候,转换估计会变得更简单,我们设计了第二个网络,名为MagicWarp,它对MagicPoint的输出,一系列点图像对进行操作,然后估计跟输入有关的单应性。这种转换引擎和传统方法的不同在于它只是用点的定位,而没有使用局部点的描述子。两个网络都使用了简单的合成数据进行训练,不需要安规的外部相机建立ground truth和先进的图形渲染流水线。系统速度快且轻量级,可以在单核CPU上达到30帧每秒的速度。
    这里写图片描述

  • Lecun Y. Stereo matching by training a convolutional neural network to compare image patches[M]. JMLR.org, 2016.
    通过训练比较图像块的卷积神经网络进行立体匹配
    (输入:左右图 KITTI数据集 Middlebury数据集)
    摘要:
    我们提出了一种从已校正过的图像对中提取深度信息的方法。我们的方法侧重于大多数stereo算法的第一步:匹配开销计算。我们通过使用卷积神经网络从小图像块中学习相似性度量来解决这个问题。训练采用有监督方式,使用相似和不相似的成对图像块构建了一个二分类数据集。我们研究了用于此项任务的两种网络架构:一个针对速度进行调整,另一个针对精度。卷积神经网络的输出被用来初始化stereo立体匹配开销。在这之后,进行一系列后处理操作:基于交叉的开销聚合,半全局匹配,左右图一致性检验,亚像素增强,中值滤波和双边滤波。我们在KITTI2012,KITTI2015数据集,Middlebury双目数据集上评测了自己的方法,结果显示我们的方法优于此三个数据集上的其他同类方法。

这里写图片描述
注:Middlebury Stereo Datasets
数据集下载链接


  • Kwang Moo Yi, Eduard Trulls, Vincent Lepetit, et al. LIFT: Learned Invariant Feature Transform[J]. 2016:467-483.
    LIFT:通过学习生成的不变特征变换
    (比SIFT特征更加稠密,已开源)
    摘要:
    我们提出了一种新型的深度网络架构,实现了完整的特征点处理流水线:检测,方向估计和特征描述。虽然之前的工作已经分别成功地解决了这几个问题,但我们展示了如何将这三个问题结合起来,通知保持端到端的可微性。我们证明了我们的深度流水线方法,性能优于许多基准数据集的state-of-the-art的方法,且不需要再训练。

这里写图片描述
这里写图片描述
左边是SIFT,右边是LIFT
源代码 https://github.com/cvlab-epfl/LIFT



位姿估计,深度估计
  • Clark R, Wang S, Wen H, et al. VINet: Visual-Inertial Odometry as a Sequence-to-Sequence Learning Problem[C]//AAAI. 2017: 3995-4001.
    VINet:将视觉-惯性里程计看做一个序列到序列的学习问题(……这个怎么翻)
    (使用了图像和IMU数据,CNN和RNN)
    摘要:
    本文中我们提出了一种使用视觉和惯性数据做运动估计的,流形上的?序列到序列的学习方法。在中间特征表示这一级别上融合数据的视觉-惯性里程计进行端到端训练,是我们已知的最好的方法(?)。我们的方法相比传统方法有很多优势。具体来说,它不需要相机和IMU数据之间进行冗长乏味的人工同步,也同样不需要IMU和相机数据之间进行人工标定。另一个优点是我们的模型可以自然且巧妙地结合特定区域的信息,可以显著减少漂移。在标定数据准确的情况下,我们的方法跟传统的state-of-the-art的方法效果旗鼓相当,在存在标定和同步误差的情况下,我们的方法可以通过训练达到比传统方法更好的的效果。
    这里写图片描述

  • Garg R, Vijay K B G, Carneiro G, et al. Unsupervised CNN for Single View Depth Estimation: Geometry to the Rescue[J]. 2016:740-756.
    用于单视角深度估计的无监督CNN:??
    (KITTI数据集 无监督学习)
    摘要:
    当前深度卷积神经网络的一个显著缺点就是需要使用大量人工标注的数据来进行训练。本项研究中,我们提出了一种无监督的框架来使用深度卷积神经网络进行单视角深度预测,不需要先行训练和标注过的ground-truth深度。我们通过一种类似于自编码的方式训练网络。训练过程中,我们认为有着微小且已知的相机运动的源图像和目的图像是一个stereo对。我们训练卷积编码器来预测源图像的深度图。为此,我们显式构造了一个使用预测深度和已知的视角间位移的目的图像的inverse warp反变换?,用于重建源图像。重建过程中的光测误差是编码器的重建损失。以这样的方法获取训练数据比同类系统要简单得多,不需要人工标注和深度传感器与相机之间的标定。在KITTI数据集上,执行单视角深度估计任务时,我们的网络,在保证相同性能情况下,训练时间比其他state-of-the-art的有监督方法少一半。

这里写图片描述


  • Xu J, Ranftl, René, Koltun V. Accurate Optical Flow via Direct Cost Volume Processing[J]. 2017.
    光流法不太关注,这个名字也是翻译不出来…………
    英文摘要:
    We present an optical flow estimation approach that operates on the full four-dimensional cost volume. This direct
    approach shares the structural benefits of leading stereo matching pipelines, which are known to yield high accuracy. To this day, such approaches have been considered impractical due to the size of the cost volume. We show that the full four-dimensional cost volume can be constructed in a fraction of a second due to its regularity. We then exploit this regularity further by adapting semi-global matching to the four-dimensional setting. This yields a pipeline that achieves significantly higher accuracy than state-of-the-art optical flow methods while being faster than most. Our approach outperforms all published general-purpose optical flow methods on both Sintel and KITTI 2015 benchmarks.
    这里写图片描述

  • Liao Y, Huang L, Wang Y, et al. Parse Geometry from a Line: Monocular Depth Estimation with Partial Laser Observation[J]. 2017.
    一条线上的解析几何:使用部分激光观测的单目深度估计
    (输入:单目图像和2D激光距离数据 NYUDv2数据集 KITTI数据集)
    激光的也不太关注。
    Abstract— Many standard robotic platforms are equipped with at least a fixed 2D laser range finder and a monocular camera. Although those platforms do not have sensors for 3D depth sensing capability, knowledge of depth is an essential part in many robotics activities. Therefore, recently, there is an increasing interest in depth estimation using monocular images. As this task is inherently ambiguous, the data-driven estimated depth might be unreliable in robotics applications. In this paper, we have attempted to improve the precision of monocular
    depth estimation by introducing 2D planar observation from the remaining laser range finder without extra cost. Specifically, we construct a dense reference map from the sparse laser range data, redefining the depth estimation task as estimating the distance between the real and the reference depth. To solve the problem, we construct a novel residual of residual neural network, and tightly combine the classification and regression losses for continuous depth estimation. Experimental results suggest that our method achieves considerable promotion compared to the state-of-the-art methods on both NYUD2 and KITTI, validating the effectiveness of our method on leveraging the additional sensory information. We further demonstrate the potential usage of our method in obstacle avoidance where our methodology provides comprehensive depth information compared to the solution using monocular camera or 2D laser range finder alone。
    这里写图片描述
    这里写图片描述

  • Zhou T, Brown M, Snavely N, et al. Unsupervised learning of depth and ego-motion from video[J]. arXiv preprint arXiv:1704.07813, 2017.
    视频深度和自运动的无监督学习 SFM-learner
    (训练使用未标注单目视频片段,已开源)
    摘要:我们提出了一个用非结构化视频序列进行单目深度和相机运动估计的无监督学习网络。和最近的几项研究相同的是,我们使用了端到端的方法,用视图合成作为监督信号,不同的是,我们的方法是完全无监督的,只需要少量的单目视频序列即可训练。我们的方法使用了单视角深度和多视角位姿两个网络,使用计算出的深度和位姿将附近视图变换为目标视图生成损失函数(?)。因此,训练过程中网络通过损失函数连接在一起,但是测试时,两个网络可以独立用于应用。KITTI数据集上的经验评测证明我们的方法有以下优点:1)与使用ground-truth位姿或深度进行训练的有监督方法相比,在估计单目深度是效果相当。2)与有可比较输入设置的现有SLAM系统相比,位姿估计性能良好。
    这里写图片描述
    源代码 https://github.com/tinghuiz/SfMLearner

  • Vijayanarasimhan S, Ricco S, Schmid C, et al. SfM-Net: Learning of Structure and Motion from Video[J]. arXiv preprint arXiv:1704.07804, 2017.
    SFM-Net:从视频中学习结构与运动
    SfM-Net是SfM-learner的升级版
    摘要:
    我们提出了SfM-Net,一个geometry-aware几何敏感?的神经网络用于视频中的运动估计,此网络分解了基于场景和对象深度的帧间像素运动,相机运动,3D对象旋转和平移。给定一个帧的序列,SfM-Net预测深度,分割,相机和刚体运动,然后将这些转换为稠密帧间运动场(光流),可微的扭曲帧最后做像素匹配和反向传播。模型可以通过不同程度的监督方法进行训练:1)自监督的投影光测误差(photometric error)(完全无监督)的方式,2)用自运动(相机运动)进行有监督训练的方式,3)使用深度(比如说RGBD传感器提供的)进行有监督训练的方式。SfM-Net提取了有意义的深度估计并成功地估计了帧间的相机运动和评议。它还能在没有监督信息提供的情况下,成功分割出场景中的运动物体。
    这里写图片描述
    这里写图片描述



重定位

可能重定位用深度学习比较难做吧,毕竟是个偏几何的问题,暂时不太关注
- Wu J, Ma L, Hu X. Delving deeper into convolutional neural networks for camera relocalization[C]// IEEE International Conference on Robotics and Automation. IEEE, 2017.
- Alex Kendall, Matthew Grimes, Roberto Cipolla. PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization[J]. 2015, 31:2938-2946.
PoseNet:用于实时六自由度相机重定位的卷积神经网络。
PoseNet是2015年的研究成果,算是SLAM跟深度学习结合的比较有开创性的成果。
这里写图片描述
源代码 https://github.com/alexgkendall/caffe-posenet


另有一篇很有意思的论文
- Vo N, Jacobs N, Hays J. Revisiting IM2GPS in the Deep Learning Era[J]. 2017.
深度学习时代图像-GPS的重定位
思路很有意思,使用一张照片在全世界范围内进行定位。
这里写图片描述

深度学习总结

阅读数 26860

没有更多推荐了,返回首页