2019-03-29 15:03:55 weixin_43145361 阅读数 528
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16258 人正在学习 去看看 AI100讲师

这是作者经过几周的学习自己总结的深度学习的知识体系,这些知识基本是深度学习的部分必要知识,如果缺少某项知识,会对深度学习有所影响,建议对这些内容进行全面的理解。工具类,一般都是基于Python的库,当然也可以使用其他的语言进行。但是Python其简洁易用,能够极大地减少研究者的时间(通常我们认为研究者的时间比机器运行时间更宝贵),所以被广泛使用在人工智能领域。
在这里插入图片描述

理论基础

理论基础包括六块内容。

  • 初等数学
    基本的数学知识,包括代数学、方程和几何等基本的数学公式和表达的常识。
  • 高等数学
    主要是极限、微积分及一些高等数学的思想和理念。
  • 线性代数
    大学线性代码的相关内容,是卷积和神经网络的基础。
  • 概率与数理统计
    这一块在很多深度学习的内容,如分类,回归等算法中都会大量涉及。
  • 数值分析
    即数据理论在实际中的应用,如回归,降维等都会大量涉及。
  • 卷积神经网络
    这方面内容是深度学习的基础。

工具

  • Python 语言
    即 Python编程语言,作用实现的最基本工具。对很多人来说, Python编程语言拥有强大的吸引力。从1991年面世以来, Python, Perl, Ruby等语言成为最流行的解释型语言, Python和Ruby从2005年之后格外流行
    可以基于众多web框架,比如Rails (Ruby)和Django (Python)进行网站搭建。在解释型语言中,由于历史和文化上的原因, Python发展出了一个大型活跃的科学计算及数据分析社区。在过去十年里, Python已经从一个最前沿或者说“后果自负”的科学计算语言,成为数据科学、机器学习和学术/工业界通用软件开发等领在数据科学、交互式计算以及数据可视化等领域, Python经常被拿来和其他开源或商业。
  • NumPy 库
    NumPy(Numerical Python) 是Python中用于表示矩阵的基础,是Python能够进行人工智能的数据计算的基石。其底层使用C语言实现,所以可以以Python的简洁达到C语言的执行效率。
  • SciPy 库
    提供了强大的矩阵计算的功能。和 NumPy 一起,提供了强大了矩阵表示和计算功能。
  • pandas 库
    提供了一些高级数据结构和函数。从而能够和上面两个一起满足绝大部分的人工智能计算的需求。
  • matplotlib 库
    这是目前最流行的用于数据可视化的库。可以将各类数据依据一定的规则进行图形的展示
  • scikit-learn
    这是2010年才上线的基于BCD协议的一个开源项目。提供了深度学习六大领域的一些模型和算法,能够方便且免费地对其进行扩展。

深度学习的主要内容 [1]

  • 分类
    识别一个对象属于哪个分类。
    Identifying to which category an object belongs to.
  • 回归
    预测一个连续的属性与哪个值对应。
    Predicting a continuous-valued attribute associated with an object.
  • 聚集
    自动将对象进行分组合并到集合中。
    Automatic grouping of similar objects into sets.
  • 降维
    降低矩阵的维度,从而减少计算量加快计算速度。
    Reducing the number of random variables to consider.
  • 模型选择
    比较、确认和选择参数和模型。
    Comparing, validating and choosing parameters and models.
  • 预处理
    特征分离和标准化。
    Feature extraction and normalization.

参考文献
[1] scikit-learn 官网, https://scikit-learn.org/stable/

2019-05-21 16:32:26 weixin_40922555 阅读数 75
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16258 人正在学习 去看看 AI100讲师

深度学习应用在计算机视觉上。核心人物是猫还是车树
一张图片用三维数组表示
3001003 三个色彩通道 RGB计算机
看来是矩阵的形式,图像由像素点组成的,数组中每个元素都是像素点,每个像素点的取值范围【0,255】,像素点越大,亮度越高
做深度学习的任务步骤,跟机器学习是一样的。
1,收集数据 给定标签
2,训练一个分类器(神经网络)区别,分类0,1
3,测试,评估

k近邻算法作为深度学习的过渡
通过指定K值看距离谁比较近,谁的数目越多,属于谁
步骤
k近邻算法不需要训练。代码如下:

曼哈顿距离 欧几里得距离比较常用 前者没有平方开根号

当所有参数确定之后才能去用测试集!!非常宝贵!!
调节参数用交叉验证,把训练集分成5分,其中的一份是验证集。如下图:
在这里插入图片描述
为了保险起见,分成5分:1234 5;2345 1;1235 4;1345 2;1245 3.。
比如只拿1作为验证集,说不定1当中的数据存在误差或异常值,使得最终结果偏低。比如只拿5这个数据,可能它的数据比较简单,使得结果偏高。所以综合在一起,进行5次迭代,求sum,继续求一个平均值。通过交叉验证的方式来消除一些偏高或偏低的结果,用交叉验证而不是经验进行模型的建立。

K近邻结果不准确
因为把大部分背景考虑进来了。比如汽车和飞机图片中都有蓝天,结果就可能不准确。某些场景下k近邻不准确。下图中就是欧式距离与原始图片都是100,但是明显三个图是不一样的。所以用神经网络来进行分类。
在这里插入图片描述

神经网络
彩色图颜色通道等于3 灰度图是1,用输入和权重组合,来输出得分值 判断属于哪一个类别。
图像时32 32 3也就是3072.(1)首先转换成列向量 30721,得到的输出比如有10类,得到的是属于某一类的概率值,为101向量。所以什么样的参数才能和输入的30711的向量组合才能得到101的概率值向量呢?
WX=H
W:103072
X:3072
1
H:101
X有3072个像素点,W也是有3072个像素点,但是这是一组权重值,每一组权重值和X相乘,得到一个概率值。W一组权重参数是一个行向量,和一个列向量相乘,得到一组得分值,十个W行向量得到十组向量。再加上b 10
1。大的权重值使得结果偏大 小的权重值使得结果偏小。当前的模型认为某一个像素点他的影响程度比较大,对应的权重值就比较大。权重值不仅有大小也有正负。这个特征是积极消极作用通过正负号决定。
如下 得到了三个得分值:哪个类别得分值大,就判断属于哪个类别
权重矩阵输入和最终得分

用权重参数和输入进行线性组合。线性分类就是先找到这样一个决策边界,通过W找到倾斜程度,b确定与y轴的交点。
上图的输入样本得到一个得分值,但是是错误的类别预测错误。如何解决?这个错误呢?
损失函数
+1是定义的容忍程度

通过对比正确分类和错误分类的差值,再加1,表示容忍程度,数值越大容忍程度越大。然后与0进行比较。比0大就是有损失,比0小无损失。都是用错误的减去正确的得到结果+1。错误分类与正确分类结果差的越多 损失值越大。

2020-01-06 11:04:01 renyuzhuo0 阅读数 14
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16258 人正在学习 去看看 AI100讲师

image

还是这一张图,我们前几天见过了,人工智能包括机器学习,机器学习包括深度学习,那究竟什么是深度学习呢?我们先看一张图:

image

图中在以 x 轴和 y 轴组成的坐标系中,有一些点,可以看到,其中有一些是白点,有一些是黑点,这些点可以用(x,y)这样的坐标表示,我们现在要做的任务就是根据 x 和 y 这些点的坐标,找到一些规律,或者是找到一个比较好的办法、公式等去描述这些点,你是否可以根据找到的规律或者公式,判断这个点是白点还是黑点。

你已经看出来了,从左上到右下,可以画一条线,线的右上方是黑色的点,线的左下方是白色的点,没错,你可能很容易就求出这条线,但是这样描述这个问题,不够好,看下面的图:

image

除了上面那条线外,我们还可以画一条与其垂直的线,就像上图中间这样,同时我们把坐标系也转换一下,原始的坐标系不够“好”,我们将新的两条垂直的线定义为新的 x 轴和 y 轴,这时就得到了上图中的图三,这次是不是就漂亮了一些。这两个坐标系的转换比较简单,坐标的(x,y )的转换也是很简单,在后来的坐标系中,我们可以得出结论,x 大于零是黑点,x 小于零是白点。如果这是问题的一部分,这样的坐标系也会很大的简化问题。

这是一种类型的数据转换,也是比较简单的一种。我们把这种转换包装成一个盒子,我们输入一个点的坐标值,这个盒子经过上述的转换,会告诉我们结果是黑点还是白点。

上面就是一种概念上的“学习”,下面我们分析什么叫做“深度学习”。机器学习中很典型的问题就是手写数字识别,即一张手写数字的图片上,这个手写数字是几,在深度学习的模型中,会有如下的一个网络模型:

image

歪歪扭扭的一个数字图片,给了一个黑盒子,最后给出的结果是手写数字 4,这是如何得出来的结果呢?我们在这个黑盒子中,会对图片进行一些信息提取处理和加工,然后根据处理的结果进行判定,但是这个过程是复杂的,一次信息提取和加工达不到要求,因此会一步一步深入加工和处理,每处理一次,原始信息被更改的越大,信息变形越大越模糊,但是对结果有用的判定信息越来越多,将这种处理分成好多层,最终会得到最后的结果,如下图:

image

我们知道,在整个数据流中,本质上都是一些数字,不同的层次上,设置的权重数值是不一样的,因此每一层处理处的结果也是不一样的,并且会逐步接近最终的结果:

image

对于最终判定出来的结果,我们还要确定这个结果是否是正确的,这就涉及到了数据集的概念。数据集就是一些已经标记好的数据,比如十万张手写数字图片,每个图片上具体是数字几,要有人工提前标记好,这样,我们通过这个网络得出的结果与人工标记好的结果进行对比,我们就很容易得出这个网络是否是一个有效的网络,这样就可以得出一个分数或正确率,这下图中就是 Loss score:

image

有了这个 Score 究竟有什么用的?我们假设分数高代表正确率高,那么我认为设置不同权重或参数的网络,最后分数高的参数设置的比分数低的参数设置的更好或更有效,因此我可以认为我通过调整参数,就可以提高最终的正确率,这在很多情况下是一个繁琐无聊简单但是很有意义的工作,一般这种工作作为程序员都会把它交给系统去做,这就引出了下面的模型,即反馈信号,我把最终的结果反馈给中间层的参数去进行调参,直到最终的结果达到预期要求或阈值,这时的参数就是满足需求的参数,要固定下来,这就是网络训练出来的模型,下次拿来一张图片,在这个模型下,得出的结果,就有 Loss score 概率是正确的。

image

上面这个过程,就是典型的深度学习网络工作过程原理。对于一个网络,我们最初设置的参数是一个随机的值,大量的数据输入网络,网络通过反馈的机制,就会训练出一个效果还不错的模型。这样我们就可以理解一个问题,为什么神经网络是在近些年才大规模发展起来的,因为我们以前没有足够“好”的数据,近些年随着互联网的飞速发展,尤其是一些巨头公司,掌握着海量的优质数据,则进行学习训练出的模型自然会更加有效,同时由于这个过程繁琐而运算量极大,因此也是近些年硬件性能提高后提供了条件。

一般情况下,进行深度学习的网络叫做神经网络,这明显是一个生物学上的词汇,但其实人类大脑的思考过程与计算机中的神经网络,并没有那么明显的相像之处,这个问题就不深究了,了解一下就好了。

现在你理解了什么叫深度学习了吗?理解什么叫神经网络了吗?
公众号原文

2016-01-28 08:05:49 GarfieldEr007 阅读数 3612
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16258 人正在学习 去看看 AI100讲师

基于多尺度深度网络的单幅图像深度估计

原文地址http://blog.csdn.net/hjimce/article/details/50569474

作者:hjimce

一、相关理论

本篇博文主要讲解来自2014年NIPS上的一篇paper:《Depth Map Prediction from a Single Image using a Multi-Scale Deep Network》,属于CNN应用类别的文章,主要是利用卷积神经网络进行单幅图像的深度估计。我们拍照的时候,把三维的图形,投影到二维的平面上,形成了二维图像。而深度估计的目的就是要通过二维的图片,估计出三维的信息,是一个逆过程,这个在三维重建领域相当重要。

这个如果是利用多张不同视角的图片进行三维重建,会比较简单,研究的也比较多,比如:立体视觉。然而仅仅从一张图片进行三维深度估计,确实是一个很艰难的事。因为从三维到二维,肯定会丢失掉物体的深度值;因此从二维到三维本来就是一个信息缺失的、不可逆过程。然而大牛们依旧想方设法去尝试估计深度值,其中比较牛逼的算法当属Make3D,不过再牛逼的算法也是那样,因为本来就是一个信息缺失的问题,所以深度估计的精度,依旧很烂。

然而本篇paper,通过深度学习的方法,从大量的训练数据中,进行学习,一口气提高了35%的相对精度,超出了传统方法十几条街。这个就像我们人一样,我们看一张照片中的物体的时候,虽然深度信息缺失,但是我们依旧可以估计它的形状,这是因为我们的脑海中,保存了无数的物体,有丰富的先验知识,可以结合这些先验,对一张图片中的物体做出形状估计。因此我的观点是,利用深度学习进行一张图片的深度估计,也是差不多一样的道理,通过在大量的训练数据上,学习先验知识,最后就可以把精度提高上去。

有点啰嗦了,回归正题吧,估计都等得不耐烦了,我们下面开始讲解文献:《Depth Map Prediction from a Single Image using a Multi-Scale Deep Network》的算法原理,及其实现。

二、网络总体架构

先贴一下,网络架构图:


网络分为全局粗估计和局部精估计,这个跟人脸特征点的DCNN网络有点类似,都属于deep network。全局粗估计CNN:这个网络包含了五个特征提取层(每层包好了卷积、最大池化操作),在这五个卷积层后面,有链接了两个全连接层,我们最后的输出图片的宽高变为原来的1/4。

不管是粗还是精网络,两个网络的输入图片是一样的,输出图片的大小也是一样的。对于粗网络和精网络的训练方法,paper采用的方法是,先训练粗网络,训练完毕后,固定粗网络的参数,然后在训练精网络,这个与另外一篇paper:《Predicting Depth, Surface Normals and Semantic Labels》的训练方法不同,这篇paper前面两个scale的训练是一起训练的,参数一起更新。

三、coarse的网络结构

网络结构方面,基本上是模仿Alexnet的,具体可以看一下,上面的表格。我们以NYU数据集上,为例,进行下面网络结构讲解。

1、输入图片:图片大小为304*228

2、网络第一层:卷积核大小为11*11,卷积跨步大小为4,卷积后图片大小为[(304-11)/4+1,(228-11)/4+1]=[74,55],特征图个数为96,即filter_shape = (96, 3, 11, 11)。池化采用最大重叠池化size=(3,3),跨步为2。因此网络输出图片的大小为:[74/2,55/2]=[37,27]。为了简单起见,我们结合文献作者给的源码进行讲解,paper主页:http://www.cs.nyu.edu/~deigen/depth/,作者提供了训练好的模型,demo供我们测试,训练部分的源码没有提供,后面博文中贴出的源码均来自于paper的主页。本层网络的相关参数如下:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. [imnet_conv1]  
  2. type = conv  
  3. load_key = imagenet  
  4. filter_shape = (9631111)  
  5. stride = 4  
  6. conv_mode = valid  
  7. init_w = lambda shp: 0.01*np.random.randn(*shp)  
  8. learning_rate_scale_w = 0.001  
  9. learning_rate_scale_b = 0.001  
  10. weight_decay_w = 0.0005  
  11.    
  12. [imnet_pool1]  
  13. type = maxpool  
  14. load_key = imagenet  
  15. poolsize = (3,3)  
  16. poolstride = (2,2)  

3、网络第二层:卷积核大小为5*5,卷积跨步为1,接着进行最大重叠池化,得到图片大小为[18,13](需要加入pad)。网络结构设计方面可以参考Alexnet网络。源码如下:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. [imnet_conv2]  
  2. type = conv  
  3. load_key = imagenet  
  4. filter_shape = (2569655)  
  5. conv_mode = same  
  6. stride = 1  
  7. init_w = lambda shp: 0.01*np.random.randn(*shp)  
  8. learning_rate_scale_w = 0.001  
  9. learning_rate_scale_b = 0.001  
  10. weight_decay_w = 0.0005  
  11.    
  12. [imnet_pool2]  
  13. type = maxpool  
  14. load_key = imagenet  
  15. poolsize = (3,3)  
  16. poolstride = (2,2)  

4、细节方面:除了网络的最后一层输出层之外,其它的激活函数都是采用Relu函数。因为最后一层是线性回归问题,因此最后一层的激活函数应该是线性函数。在全连接层layer6,采用Dropout。

5、参数初始化:参数初始化,采用迁移学习的思想,直接把Alexnet的网络训练好的参数的前面几层拿过来,进行fine-tuning。文章提到,采用fine-tuning的方法,效果会比较好。通过阅读源码可以判断,paper除了全连接层之外,粗网络卷积层的参数都是利用Alexnet进行fine-tuning。

四、精细化网络结构-Fine scale Network

精网络的结构,采用的是全连接卷积神经网络,也就是不存在全连接层,这个如果搞过FCN语义分割的,应该会比较明白。这个网络包含了三个卷积层。

通过上面粗网络的深度值预测,我们得到的深度图是比较模糊的,基本上没有什么边缘信息,接着接着我们需要精细化,使得我们的深度预测图与图像的边缘等信息相吻合,因为一个物体的边缘,也就是相当于深度值发生突变的地方,因此我们预测出来的深度值图像也应该是有边缘的。从粗到精的思想就像文献《Deep Convolutional Network Cascade for Facial Point Detection》,从粗估计到精预测的过程一样,如果你之前已经搞过coarse to refine 相关的网络的话,那么学习这篇文献会比较容易。为了简单起见,我这边把本层网络称之为:精网络。精网络的结构如下:

1、输入层:304*228 大小的彩色图片

2、第一层输入原始图片,第一层包含卷积、RELU、池化。卷积核大小为9*9,卷积跨步选择2,特征图个数选择64个(这个文献是不是中的图片是不是错了,好像标的是63),即:filter_shape = (64,3,9,9)。最大池化采用重叠池化采样size=(3,3),跨步选择2,即poolsize = (3,3),poolstride = (2,2)。这一层主要用于提取边缘特征。因为我们通过粗网络的输出可以看出,基本上没有了边缘信息,因此我们需要利用精网络,重构这些边缘信息。本层网络的相关参数:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. [conv_s2_1]  
  2. type = conv  
  3. load_key = fine_stack  
  4. filter_shape = (64,3,9,9)  
  5. stride = 2  
  6. init_w = lambda shp: 0.001*np.random.randn(*shp)  
  7. init_b = 0.0  
  8. conv_mode = valid  
  9. weight_decay_w = 0.0001  
  10. learning_rate_scale_w = 0.001  
  11. learning_rate_scale_b = 0.001  
  12. [pool_s2_1]  
  13. type = maxpool  
  14. poolsize = (3,3)  
  15. poolstride = (2,2)  

经过卷积层,我们可以得到大小为(110*148)的图片,然后在进行pooling,就可以得到55*74的图片了。这样经过这一层,我们就得到了与粗网络的输出大小相同的图片了。

3、第二层这一层的输入,除了第一层得到的特征图外,同时还额外添加了粗网络的输出图(作为特征图,加入网络输入)。

网络细节基本和粗网络相同,这里需要注意的是,我们训练网络的时候,是先把粗网络训练好了,然后在进行训练精网络,精网络训练过程中,粗网络的参数是不用迭代更新的。DCNN的思想都是这样的,如果你有看了我的另外一篇关于特征点定位的博文DCNN,就知道怎么训练了。

还有我们这一层的输入图片的大小,已经和输出层所要求的大小一样了,因此后面卷积的时候,卷积要保证图片大小还是一样的。

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. [conv_s2_2]  
  2. type = conv  
  3. load_key = fine_stack  
  4. filter_shape = (64,64,5,5)  
  5. init_w = lambda shp: 0.01*np.random.randn(*shp)  
  6. init_b = 0.0  
  7. conv_mode = same  
  8. weight_decay_w = 0.0001  
  9. learning_rate_scale_w = 0.01  
  10. learning_rate_scale_b = 0.01  

4、第三层:也就是连接到输出层去

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. [conv_s2_3]  
  2. type = conv  
  3. load_key = fine_stack  
  4. filter_shape = (64,1,5,5)  
  5. transpose = True  
  6. init_w = lambda shp: 0.01*np.random.randn(*shp)  
  7. init_b = 0.0  
  8. conv_mode = same  
  9. weight_decay_w = 0.0001  
  10. learning_rate_scale_w = 0.001  
  11. learning_rate_scale_b = 0.001  

五、缩放不变损失函数

这个是文献的主要创新点之一,主要是提出了缩放不变的均方误差函数:

 

其中y和y*就是我们的图片标注数据和预测数据了,本文指的是每个像素点的实际的深度值和预测的深度值。α的计算公式如下:

 

根据上面定义的损失函数,paper训练过程中采用如下的损失函数:

 

其中参数λ取值为0.5。具体的源码如下:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #定义损失函数 缩放不变损失函数,pred预测值,y0标准值、m0为mask(为0表示无效点,为1表示有效点)  
  2. def define_cost(self, pred, y0, m0):  
  3.     bsize = self.bsize  
  4.     npix = int(np.prod(test_shape(y0)[1:]))  
  5.     y0_target = y0.reshape((self.bsize, npix))  
  6.     y0_mask = m0.reshape((self.bsize, npix))  
  7.     pred = pred.reshape((self.bsize, npix))  
  8.   
  9.   
  10. #因为在mask中,所有的无效的像素点的值都为0,所以p、t中对应的像素点的值也为0,这样我们的损失函数,这些像素点的值也为0,对参数不起更新作用  
  11.     p = pred * y0_mask  
  12.     t = y0_target * y0_mask  
  13.   
  14.     d = (p - t)  
  15.   
  16.     nvalid_pix = T.sum(y0_mask, axis=1)#这个表示深度值有效的像素点  
  17.     #文献中公式4 ,参数λ取值为0.5.公式采用的是简化为(n×sum(d^2)-λ*(sum(d))^2)/(n^2)  
  18.     depth_cost = (T.sum(nvalid_pix * T.sum(d**2, axis=1))  
  19.                      - 0.5*T.sum(T.sum(d, axis=1)**2)) \  
  20.                  / T.maximum(T.sum(nvalid_pix**2), 1)  
  21.   
  22.     return depth_cost  

六、数据扩充

1、缩放:缩放比例s取(1,1.5),因为缩放深度值并不是不变的,所以文献采用把深度值对应的也除以比例s。(这一点我有点不明白,难道一张图片拍好了,我们把它放大s倍,那么会相当于摄像头往物体靠近了s倍进行拍照吗?这样解释的,让我有点想不通)。

2、旋转数据扩充,这个比较容易

3、数据加噪扩充:主要是把图片的每个像素点的值,乘以一个(0.8,1.2)之间的随机数。

4、镜像数据扩充,用0.5的概率,对数据进行翻转。

5、随机裁剪扩充,跟Alexnet一样。

在测试阶段,采用中心裁剪的方式,和Alexnet的各个角落裁剪后平均有所不同。

七、训练相关细节

这边我只讲解NYU数据集上的训练。NYU训练数据可以自己网上下载,NYU原始的数据中,每张图片的每个像素点label、depth值,其中label是物体标签,主要用于图像分割,后面paper的作者也发表了一篇关于语意分割、法矢估计的文献:《Predicting Depth, Surface Normals and Semantic Labels》。

NYU原始的训练数据有个特点,就是图片并不是每个像素点都有depth值,这个可能是因为设备采集深度值的时候,会有缺失的像素点。首先NYU数据是640*480的图片,depth也是640*480,因为每个像素点,对应一个深度值嘛,可是这些深度值,有的像素点是无效的,有效和无效的像素点我们可以用一个mask表示。那么我们如何进行训练呢?

我们知道网络采用的是对320*240的图片,进行random crop的,因此首先我们需要把image、depth、mask都由640*480缩小到320*240。这边需要注意的是这里的缩小,是采用直接下采样的方法,而不是采用线性插值等方法。因为我们需要保证图片每个像素点和depth、mask都是对应的,而不是采用插值的方法,如果采用插值,那么我们的mask就不再是mask了,这个小细节一开始困扰了我好久。还有需要再提醒一下,320*240不是网络的输入大小,我们还要采用random crop,把它裁剪成304*228,这个才是网络的输入。

另一方面就是depth的问题,我们知道我们输出的depth的大小是74*55。而网络输入数据image、depth、mask的大小是304*228,因此我们在构造损失函数,需要把标注数据depth、mask又采用直接下采样的方法缩小到74*55(下采样比例为4),这样才能与网络的输出大小相同,构造损失函数。相关源码如下:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. y0 = depths#深度值  
  2. m0 = masks#mask  
  3.   
  4. #图片采用的是直接下采样,而不是用双线性插值进行插值得到训练的depths,下采样的比例是4  
  5. m0 = m0[:,1::4,1::4]  
  6. y0 = y0[:,1::4,1::4]  

个人总结:这篇文献的深度估计,文献上面可以说是深度学习领域崛起的一个牛逼应用,相比于传统的方法精度提高了很多。不过即便如此,精度离我们要商用的地步还是有一段的距离要走。从这篇文献我们主要学习到了两个知识点:1、多尺度CNN模型 。2、标注数据部分缺失的情况下,网络的训练,这个文献给了最大的启发就是:在kaggle竞赛上面有个人脸特征点定位,但是有的图片的标注数据,是部分缺失的,这个时候我们就可以借用这篇文献的训练思路,采用mask的方法。3、文献提出了Scale-Invariant损失函数,也是文献的一大创新点。

参考文献:

1、《Depth Map Prediction from a Single Image using a Multi-Scale Deep Network》

2、《Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture》

3、http://www.cs.nyu.edu/~deigen/depth/

4、《Make3d: Learning 3-d scene structure from a single still image》

**********************作者:hjimce   时间:2016.1.23  联系QQ:1393852684   地址:http://blog.csdn.net/hjimce   原创文章,版权所有,转载请保留本行信息(不允许删除)

2019-11-14 21:50:54 czl441516589 阅读数 12
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16258 人正在学习 去看看 AI100讲师

深度学习笔记(一)简单的迁移学习

接触机器学习已经三个多月了,以此文做个小总结

机器人的视觉抓取

看了好多篇相关的文章,这个领域的研究已经比较深入了,大致上分为基于视觉检测的抓取和基于像素到动作映射的抓取

基于目标检测的抓取

这种方向又分两种不同的思路:

一种是结构化输出抓取配置,就是给定一张图片,直接输出机械臂配置(configuration),配置包括了机械臂末端的三维空间坐标、转角以及机械爪张开的大小等参数。这种方法通常使用sliding windows的方法对整张图像进行采样,通过将抓取问题转换成回归或者分类问题进行处理。习惯上用一种矩形表示法来表示这种配置,矩形的高度和宽度分别表征机械爪的宽度和机械爪两端点之间的距离,矩形的中心二维坐标表示机械爪两爪中心点的二维坐标。
另一种思路是让网络学习一种Robustness function,实际上是给定了图像和抓取的配置,在该抓取配置下抓取成功的成功率,实际上是一种二分类器

基于像素到动作映射的抓取

这种方法被称为是visual motor control,也被称作Image to action,简单地解释就是求取输入图像到动作的直接映射,而不经过生成抓取配置这一中间步骤,目前主要是强化学习的方法。

二维空间内的抓取

基于以上的调研,选择了一篇题为《Supersizing Self-supervision: Learning to Grasp from 50K Tries and 700 Robot Hours》的论文进行复现,该作者即论文的信息可参见
Lerrel Pinto
该项目的测试代码详见
grasp-detector
作者只给出了测试的代码,故将训练的代码进行了补全,并使用作者给出的数据集进行了训练,数据集的获取详见
dataset
本文使用的是12年提出的alexnet,源码比较容易找到,在训练过程中出现了一些问题,比如loss函数不下降等等,采用了加载Imagenet上预训练的模型可以很好地解决这一问题。

RGB图像到灰度图像的迁移

由于实验室机械臂的摄像头是黑白的,将原来在RGB图像上进行训练的模型迁移到灰度图像上以适应机械臂的使用。由于原输入是227×227×3,灰度图片只有一个通道,为了保持网络结构不变,将训练集转化为灰度图以后,将灰度图片拓展成三通道

def img2tensor(self, img):
    img_array = np.asarray(img)
    img_array = np.array([img_array,img_array,img_array])
    reshape = np.resize(img_array,(227,227))
    output = np.zeros((227,227,3))

    output[:,:,0] = reshape
    output[:,:,1] = reshape
    output[:,:,2] = reshape

    image_tensor = tf.convert_to_tensor(output)

训练过程中,我们希望保留网络提取的高层次特征,故将网络的第一层卷积层和全部的fc层设置为可训练,将剩余的卷积层冻结;训练适当的epoch以后,将训练得到的ckpt文件加载到测试模块中,得到比较好的测试结果,如下图:
预测抓取点的结果
可以看到fine-turning后的模型预测情况还是比较准确的,没有出现严重的过拟合现象。

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