7 月 8 日,英伟达深度学习学院 DLI 线下训练营即将来到深圳,主题是图像分类、目标检测与图像分割的零基础开发入门。
虽然是全球范围内顶级的 AI 培训项目,但 DLI 进入中国的时间太晚,中文网页也才上线没多久,导致国内开发者只知英伟达的显卡,却不知道英伟达有线上、线下的 AI 技术培训。此前雷锋网曾撰文介绍过 DLI,详情戳这里。
闲话少说,本期深圳 DLI 训练营主要用到 DIGITS 和 TensorFlow 两个工具。TensorFlow 大家都知道,不必介绍。但对 DIGITS 就很陌生了,它是什么呢?
DIGITS 是英伟达为普及深度学习开发的图形化操作界面,简单易用,旨在帮助初学者跨越入门障碍,迅速上手。因此,DLI 的入门培训均建议学员从 DIGITS 起步。
说白了, DIGITS 就是一个新手工具。但由于 DLI 刚刚进入中国,关于 DIGITS 的教程和信息并不充足,为初学者带来信息鸿沟。 因此,雷锋网对这篇英伟达博客发布的官方教程进行了编译。该教程指导读者用 DIGITS 5 和 Caffe 进行图像分割,它脱胎于 DLI 的线上实验室(online labs)培训课。后者收费且只用英文授课,并不对非会员开放。但大家能从这篇教程对其了解一个大概。
更重要的,7 月 8 日深圳的 DLI 线下训练营,三场主要培训分别是用 DIGITS 进行图像分类,用 DIGITS 目标检测,以及用 TensorFlow 进行图像分割(了解详情请点此)。虽然前两场的内容与本教程并不一致,最后一场的难度比本文高出许多,而且用的是 TensorFlow 而非 Caffe,但这篇教程与 DLI 付费培训的内容已十分接近。
感谢三位童鞋朱婷、彭艳蕾与马晓培编译本文花费的心血。
去年底,英伟达发布了 DIGITS 5,为 DIGITS又增添了新功能,其中两个是这篇教程非常感兴趣的,分别是:
1. 完全集成的分割工作流,它能让你创建图像分割数据集,并将分割网络的输出结果可视化;
2. DIGITS模型商店,它是一个公共的在线资源库,你可以从中下载网络说明以及预训练的模型。
本文将探索图像分割这一主题。对于SYNTHIA数据集里合成图像中的汽车、行人、路标以及各种其他城市物体,我将用DIGITS 5 训练神经网络进行识别和定位 。
图1 是预览,这就是你将通过本教程学着做的东西:
图1: 使用 DIGITS 5.0作图像分割的示例可视化。这交替显示了输入图像、 FCN-Alexnet 预测结果的叠加、 FCN-Alexnet预测结果与ground truth的叠加。
假设你想为自动驾驶车设计图像理解软件。你可能已经听说过Alexnet [1], GoogLeNet [2], VGG-16 [3]以及其他的图像分类神经网络架构,所以你可能从这些着手。假如有一个小狗的照片,图像分类,就是一个让计算机告诉你图中的旺就是旺的过程。
图像分类模型的输出是一个离散的概率分布; 其值介于0、1之间,用来表示每个训练类别的概率。图2是在DIGITS中使用Alexnet对一张猫的图像做分类的示例。其结果非常好:要知道Alexnet是在1000不同类别的对象上训练的,包括动物、乐器、蔬菜、交通工具等等。令人震撼的是,在99%的置信区间内,机器能够将图像主题正确归类为猫。即便是我己,恐怕也不过如此,无法进一步分辨出这只猫是埃及猫、花斑猫还是虎斑猫。
图2:来自PASCAL VOC数据集的猫图像的Alexnet分类。
如果一张图片里同时有猫和狗,对它进行分类会发生什么?从常识来看,你可能会相信神经网络对我们最喜欢的这两种宠物图像分类时,将其归为每类的概率相同。我们来试试:图3所示是结果。在预测结果中有猫和狗的混合,但是AlexNet并没有给出50/50分的希望。在中间图像中,在前5名的预测中事实上并没有猫。这真令人失望,但是从另一方面来看,AlexNet是在120万张图像的“小”世界上训练的,在这些图像中只有一个对象,所以不能想当然的期望在多个对象存在的情况下执行良好。
图3 来自 PASCAL VOC 数据集的猫狗图像的Alexnet分类。
分类网络的另一个限制是它们不能分辨出图像中对象的位置。这是可以理解的,因为它们不是被训练来做这个的。尽管如此,这却是计算机视觉的一个主要障碍:如果一辆自动驾驶车不能检测到道路的位置,它没法行驶很远!
图像分割解决了部分弊端。它并不是预测整幅图像的单一概率分布,而是将图像分成多块,预测每块的概率分布。最常见的情况是,图像被划分到像素级别,对每个像素做分类:对于图像中的每个像素,训练网络来预测指定像素的类别。这使得网络不仅能鉴别出每张图像中多个主题类别,还能检测出对象的位置。图像分割通常生成标签图像,该图像的大小与输入图像的大小相等,其像素按照各类类标用颜色编码。图4 所示是示例,在一幅图像中分割出4个不同类别:桌子、椅子、沙发和盆栽。
图4:来自 PASCAL VOC数据集的图像分割示例(白色区域标记未定义的像素,例如对象轮廓和未分类对象)。
在图像分割的进一步细化中,即实例感知图像分割(IAIS),神经网络要学习识别图像中每个对象的轮廓。这在应用中特别有用,它一定能识别出单个类别每一次的出现,甚至在各类之间界限不清晰时也是如此。例如在图5中:中间的图像是图像分割类标,而最右边图像是IAIS类标(注意颜色编码是如何唯一地识别每个人的)。我不会深入讨论IAIS的主题,我将重点讨论实例分割;但是我很鼓励你看看Facebook在IAIS上的SharpMask 工作。
图5: 图像分割(中)vs.实例感知图像分割(右)。图像来自PASCAL VOC数据集。
让我们看一下如何设计能分割图像的网络。
前一节对图像分类模型和图像分割模型作了区分,前者对每个图像做概率分布预测,后者对每个像素做概率分布预测。原则上,这听起来很相似,你可能觉得它们会使用相同的技术。毕竟,仅仅是问题的空间维度得到了增加。在本文中,我将向你展示,仅仅一些小小的调整就足够将一个分类神经网络变成一个语义分割神经网络。我将使用在这篇论文( this paper)[4]里面世的技术(我将之称为FCN论文)。
开始之前,先说一些术语:我将典型的分类网络,例如Alexnet,称为卷积神经网络(CNN)。这有点滥用,毕竟卷积神经网络除了图像分类之外还有很多其他用途,但这是一种常见的近似。
CNN中,常见的做法是将网络分为两部分:前一部分做特征提取,数据通过若干个卷积层逐步提取到越来越复杂、抽象的特征。卷积层之间通常有非线性转移函数和池化层。每个卷积层可被看作是一系列图像滤波器,它们在特定模式下触发高响应。例如,图6所示是来自Alexnet第一个卷积层的滤波器的表达以及在虚拟图像,包括简单的形状上的激活结果(输出)(有趣的是,AlexNet将图像分类成一个挂钟!)这些滤波器触发了在比如水平和垂直边缘和角这些形状上的高响应。例如,看下左下角的滤波器,它看起来像黑白相间的竖条纹。现在看一下相应的激活结果以及在垂直线上的高响应。类似地,在右边的下一个滤波器在斜线上显示了高响应。网络更深的卷积层将能够在更加复杂的形状上例如多边形上触发高响应,最后学习检测纹理和各种各样自然对象的组成成分。在卷积层中,每个卷积输出都是通过通过将每个滤波器应用到输入中的窗口上(也叫感受野)计算而来,按该层的步长滑动窗口直到遍历整个输入为止。感受野尺寸大小与滤波器相同。如图7所示,是卷积计算的说明示例。注意,输入窗口跨越了输入图像的所有通道。
图6:Alexnet conv1 l层在DIGITS中的表现。从上到下:数据层(输入);conv1层滤波器的可视化;conv1层的激活结果(输出)。
图7:左:红色表示的输入量示例和第一个卷积层的神经元体示例。卷积层中的每个神经元只与输入空间中的局部区域相连接,但是却连接了全部深度(即所有的颜色通道)。注意,沿深度方向有多个神经元(示例中是5个),所有都连接着输入的相同区域;右:神经元仍然是计算其权值与输入的点乘,然后是非线性函数,但是它们的连接现在被限制在局部空间上。来源:斯坦福大学CS231 课程。
在CNN的第二部分即最后一部分,分类器包含若干个全连接层,第一个全连接层的输入来自特征提取器。这些层学习特征间复杂的关系,使网络对图像内容有高水平的理解。例如,如果有大眼睛和皮毛,网络可能倾向于猫。神经网络能正确理解这些特征,在某种程度上很神奇,但这也是深度学习的魅力所在。这种可解释性的缺乏有时会受到批评,但在这方面,它和人类大脑的工作方式其实有点像:关于你是怎么知道某张图片是一只猫不是狗,你能解释吗?
全卷积网络(FCN),顾名思义,就是只包含卷积层和上面提到的临时非参数层。怎样消除全连接层来建立看起来更强大的模型呢?为回答这个问题,我们来思考另一个问题。
图8:DIGITS中显示的 Alexnet 第一个全连接层(fcn6)的输入、权值和激活函数。
关键问题是:全连接层和全卷积层之间的区别是什么呢?
这很简单,在全连接层,每个输出神经元计算输入中的数据的加权和。相比之下,每个滤波器计算感受野中的数据的加权和。等一下,这难道不是同一件事情吗?——是的,但这仅发生在该层输入的大小与感受野的大小相同时。如果输入比感受野大,接下来卷积层会滑动其输入窗口,计算另一个加权和。这个过程重复进行,直到输入图像被从左到右,从上到下扫描一遍。最后,每个滤波器生成一个激活矩阵;每个这样的矩阵被称作特征图谱。
这提供了一个线索:使用等效的卷积层替换全连接层,把该层滤波器的大小设为与输入的大小相同,并且使用与全连接层中神经元个数相同的滤波器。我将在Alexnet的第一个全连接层(fcn6)上演示这一点:图8所示是感兴趣层的DIGITS的可视化。你可以看到fcn6从pool5中获得输入,输入的形状是256个的6*6的图像。除此之外,在fcn6的激活结果是4096维的长矩阵,这意味着fcn6有4096个输出神经元。由此可见,如果我想用等价的卷积层替换fcn6,我必须设置滤波器大小为6*6,输出的特征图谱的个数为4096.说一个小小的题外话,你认为该层会有多少可训练的参数?对于每个滤波器,都有一个偏置项加上感受野中每个数值的一个权重。感受野的深度是256,大小为6*6,因此每个滤波器有256x6x6+1=9217个参数。因为这里有4096个滤波器,该层共有37,752,832个参数。这正是DIGITS中fcn6拥有的参数个数。到目前为止,一切都很顺利。
在实践中,很容易替换该层。如果你使用Caffe,仅仅用表1中右边的定义替换左边的定义即可。
有了这些知识,现在你可以开始将Alexnet中的所有全连接层转换为相应的卷积层。注意,你没必要使用DIGITS计算这些层的输入的形状;你可以手动计算出它们。尽管这听起来很有趣,我确信如果你在VGG-16的16个层(加上中间的池化层)上做这些,你将失去耐心。更不要说你会不可避免地丢掉你的演算纸。此外,作为一个深度学习爱好者,你应该习惯让机器来做这些工作。所以让DIGITS为你效力吧。
由此产生的FCN与基础的CNN有着相同数量的可学习参数,相同的表达能力和相同的计算复杂度。鉴于输入相同,产生的输出也相同。你可能会想:为什么要转换模型这么麻烦呢?是这样的,CNN的基础“卷积”引入了太多的灵活性。模型不再受限于在固定输入大小上(在Alexnet中224*224的像素尺寸大小)操作。它可以像滑动窗口一样,通过扫描整个输入来处理更大的图像,不是对整个输入产生一个单一的概率分布,而是对每个224*224的窗口,模型会生成一个概率。网络的输出是一个形状为KxHxW的张量,这里,K表示类别的个数,H表示沿纵轴的滑动窗口的数量,W表示沿横轴的滑动窗口的数量。
在计算效率方面:理论上,你可以通过重复选择图像的块以实现简单的窗口滑动,然后将这些块输入CNN进行处理。在实践中,这在计算中非常低效:当你逐渐滑动窗口时,在每一步上仅仅能看到少量新的像素值。然而,每个块都必须由CNN完全处理,即使连续的块之间存在大量的重叠。每个像素值最终会重复处理很多次。在FCN中,由于那些计算都发生在网络内部,仅仅只有最少量的操作需要执行,整个处理速度要快的多。
总而言之,这是一个里程碑:在分类网络的输出上增加两个空间维度。在下一节,我将展示如何进一步改进模型。
(未完待续)
via nvidia,雷锋网编译
相关文章: