介绍:
人工智能的力量超出了我们的想象。我们都知道机器人在世界上一些强国已经进入了测试阶段。政府、大公司正在花费数十亿美元开发这种超智能生物。机器人的出现引起了世界上许多研究机构的关注。
它也让你兴奋吗?就我个人而言,学习机器人和人工智能的发展始于我内心深处的好奇和兴奋!今天让我们学习计算机视觉。
计算机视觉的最早研究始于20世纪50年代,从那时起,我们已经走了很长的路,但发现自己仍然离最终目标很远。但有了神经网络和深度学习,我们变得前所未有的强大。
深度学习在视觉上的应用将这项技术提升到了一个不同的水平,并使像自动驾驶汽车这样的复杂事物在不久的将来成为可能。在本文中,我还将向你介绍卷积神经网络,它是计算机视觉中深度学习应用的关键。
目录
1.计算机视觉的挑战
2.传统方法概述
3.神经网络基础介绍
4.卷积神经网络(CNN)介绍
5.案例学习:IMAGENET比赛中CNN效果的提高
6.用GraphLab实现CNN
1.计算机视觉的挑战
顾名思义,计算机视觉(CV)的目的是模仿人类眼睛和大脑中负责视觉的部分的功能。
对人类来说,识别动物、描述风景、区分可见物体等行为真是小菜一碟。你会惊讶地发现,经过几十年的研究,才发现并赋予计算机以合理的精度探测物体的能力。
在过去的五年里,计算机视觉领域不断发展。卷积神经网络(CNNs)是其中一个最著名的进展。如今,深层CNN已成为最复杂的计算机视觉应用的关键,例如自动驾驶汽车、自动标记facebook图片中的好友、面部安全功能、手势识别、自动车牌识别等。
目标检测
目标检测被认为是计算机视觉最基本的应用。计算机视觉的其他发展是通过在此基础上做一些小的改进来实现的。在现实生活中,每次我们(人类)睁开眼睛,都会无意识地检测物体。
因为这对我们来说是很直观的,所以当我们试图设计类似于我们眼睛的系统时,我们没有意识到所涉及的关键挑战。让我们先看一些关键的障碍:
1.观察点的变化
同一物体在图像中可以有不同的位置和角度,这取决于物体和观察者的相对位置。
物体可以有不同的位置。例如,请看以下图片:
虽然我们很明显知道它们是同一个物体,但要把这方面的知识传授给计算机(机器人或机器)并不容易。
2.光照差异
不同图像会有不同的光照条件。比如:
虽然这张照片很暗,但我们仍然能认出它是一只猫。把这个教给计算机是另一个挑战。
3.图像的隐藏部分
图像不一定要完整。小部分或大部分的图像可能被隐藏,这使得检测任务变得困难。例如:
在这里,只有小狗的脸是可见的,这给计算机识别提出了另一个挑战。
4.背景干扰
有些图像融合在背景中。比如:
如果你仔细观察,你会在图像中发现一个人。虽然看起来很简单,但对于计算机来说,这是一项很难学习的任务。
这些只是我提出的一些挑战,这样你就可以体会到,你的眼睛和大脑组合轻松完成的任务有多复杂。在今天的计算机视觉中,分解这些挑战并单独解决仍然是可能的。但是,我们离一个可以接近人类眼睛的系统还有几十年的路要走(它可以做任何事情!)。
人类身体的这种智能致使研究人员试图通过分析人类或其他动物的视觉机制来破解计算机视觉之谜。Hubel和Weisel 在1959年进行了著名的猫实验,这方面最早的工作有一些是由他们完成的。
这是第一个强调边缘检测对于解决计算机视觉问题的重要性的研究。他们因为这项工作而获得诺贝尔奖。
在深入研究卷积神经网络之前,让我们先简要地了解一下在深度学习普及之前,计算机视觉中使用的传统技术或基本技术。
2.传统方法概述
除了深度学习之外,还有各种技术可以用来提升计算机视觉的能力。虽然,它们对简单的问题很有效,但随着数据量变得庞大,任务变得复杂,它们无法替代深层CNN。让我们简要讨论两种简单的方法。
1.KNN
每个图像与训练数据中的所有图像进行匹配。选择具有最小距离的K张图像。其中,K张图像中的大多数图像的类别被预测为图像的输出类。
可以使用各种距离度量,如L1距离(绝对距离之和)、L2距离(平方和)等。
缺点:
即使我们用相同的光照和方向拍摄同一物体的图像,物体也可能位于图像的不同位置,即图像的左、右或中心。例如:
在这里,同样的狗在第一张图片的右侧和第二张图片的左侧。虽然它是同一个图像,KNN却给这两张图赋予很高的距离。
与上述类似,KNN将面临第1节中提到的其他挑战。
2.线性分类器
它们使用参数化方法,将每个像素值视为一个参数。
这就像是像素值的加权和,权重矩阵的维数取决于输出的数量。
直观地说,我们可以用模板来理解这一点。像素的加权和形成与每幅图像匹配的模板图像。这在克服第1节中讨论的挑战时也将面临困难,因为很难为所有不同的情况设计单个模板。
我希望这能给我们提供一些直观的理解,让我们了解除深度学习以外的其他方法所面临的挑战。请注意,可以使用比上面讨论的更复杂的技术,但它们很少能打败深度学习模型。
3.神经网络基础介绍
我们来讨论一下神经网络的一些性质。我将在这里跳过神经网络的基础知识,因为我已经在上一篇文章 Fundamentals of Deep Learning – Starting with Neural Networks中介绍过了。
激活函数
有各种各样的激活函数可以使用,这是一个活跃的研究领域。让我们来讨论一些常用的选择:
1.Sigmoid Function
sigmoid激活函数,也被用在logistic回归中,它把输入从(-inf,inf)压缩至(0,1)。
但是它也存在很多问题,所以几乎不被用在CNN中。
(1)饱和神经元使梯度消失
如果仔细观察上图,如果输入超过-5或5,输出将分别非常接近0和1。而且,在这个区域,梯度几乎为零。请注意,此区域中的切线几乎平行于x轴,因此梯度为0。
正如我们所知,梯度在后向传播中会相乘,所以这个梯度实际上会阻止后向传播进入更多的层。
(2)输出不是以0为中心的
如您所见,所有输出都在0和1之间。当这些成为下一层的输入时,下一层的所有梯度将是正的或负的。因此,通往最佳解的道路将是曲折的。
(3)exp()计算量太大
虽然不是一个很大的缺点,但它有轻微的负面影响。
2.tanh激活函数
人们总是更喜欢tanh函数,因为它解决了上述sigmoid函数的第二个问题,它的输出在(-1,1)之内。
但它仍会造成梯度消失,因此不推荐使用。
3.ReLU
ReLU是CNN最常用的激活函数。它有以下优点:
梯度不会在正区域饱和
由于只需要简单的阈值处理,因此计算效率非常高
根据经验发现,收敛速度比sigmoid或tanh高。
但它也有下述缺点:
输出不是以零为中心的,总是正的。
当x<0时,梯度消失。少部分技术像leaky ReLU和parametric ReLU被用来克服这个问题。
x=0时未定义梯度。但是使用sub-gradient可以解决,而且x=0是很罕见的情况。
总之,ReLU是主要选择的激活函数。如果牢记这些注意事项,就可以非常有效地使用它们。
数据预处理
对于图像来说,通常会使用如下预处理步骤:
(1).统一图像尺寸:
所有图像都转换为相同的大小,通常为正方形。
(2).中心化
对于每个像素,可以从其中减去其在所有图像中的平均值。有时(但很少)可以在红,绿,蓝三通道中实现。
注意:图像中通常不进行标准化。
权值初始化
有很多种初始化权值的方法。
(1).全0
这通常是个坏主意,因为在这种情况下,所有神经元最初都会产生相同的输出,类似的梯度会在反向传播中不断传播。
这种结果通常是不理想的,因为网络不能正常训练。
(2).高斯随机数
权重可以用0均值和小标准差(0.1到1e-5)的随机高斯分布初始化。
这适用于浅层网络,即1~5个隐藏层,但不适用于深层神经网络。
在深度神经网络的情况下,较小的权值会使输出变小,并且向输出端移动时,值会变得更小。因此,梯度也会变小,最终导致梯度消失。
请注意,你需要使用标准差适合该网络的高斯分布。
(3).Xavier初始化
每个神经元权值的高斯分布的方差应取决于输入到该层的数量。
建议的方差是输入的平方根。因此,初始化具有n个输入的层的权重的numpy代码是:np.random.randn(n_in,n_out)*sqrt(1/n_in)
最近的一项研究表明,对于ReLU神经元,建议的更新是:np.random.randn(n_in,n_out)*sqrt(2/n_in)。
当使用ReLU作为激活函数时,还必须记住一件事。权重初始化可能导致一些神经元因为负输入而不能被激活。这是应该被确认的。你可能会惊讶地发现,10-20%的ReLUs可能在训练期间甚至最后的某个特定时间不起作用。
这些只是我在这里讨论的一些概念。一些更重要的概念,如批量归一化,随机梯度下降等等,我鼓励你自己阅读。
4.卷积神经网络介绍
在讨论细节之前,让我们先尝试直观地理解为什么深层神经网络工作得更好。
我们从早期方法的缺点中了解到,它们无法满足图像中的大量变化。深层CNN的工作方式是连续地对少量信息进行建模,并将它们在网络中更深层地结合起来。
理解它们的一种方法是,第一层将尝试检测边缘并形成用于边缘检测的模板。然后,后续层将尝试将它们组合成更简单的形状,并最终组合成具有不同对象位置、光照条件、比例等的模板。最终层将输入图像与所有模板匹配,并且最终预测就像所有模板的加权和。因此,深层CNN能够模拟复杂的变化和行为,给出高度准确的预测。
有一篇关于CNNs深层特征可视化的有趣论文,你可以通过它获得更多的直观理解—— Understanding Neural Networks Through Deep Visualization。
为了解释CNNs并最终展示一个例子,我将在这里使用CIFAR-10数据集进行解释,可以从这里https://www.cs.toronto.edu/~kriz/cifar.html下载数据集。这个数据集有60000个图像,有10个标签,每种类型有6000个图像。每个图像都是彩色的,大小为32×32。
CNN通常由3种类型的层组成:
卷积层
池化层
全连接层
你可能会在一些旧的CNN中发现一些层用于批量归一化,但它们现在不再被使用。我们会逐一解释这些层。
卷积层
由于卷积层是卷积神经网络的关键,我将首先考虑它们。每一层都可以用块或长方体的形式进行可视化。例如,对于CIFAR-10数据,输入层将具有以下形式:
在这里你可以看到,这是原来的图像,是32×32的高度和宽度。这里的深度是3,对应于红色、绿色和蓝色,它们构成了彩色图像的基础。现在一个卷积层是通过在上面移动一个滤波器形成的。滤波器是另一个高度和宽度较小但深度相同的块或长方体,扫过这个原始块。让我们考虑一个尺寸为5x5x3的滤波器。
我们从左上角开始,一直移动到左下角。在每个位置,像素的加权和被计算为 W’X +b,并且获得新的值。如上图所示,单个滤波器输出的尺寸为28x28x1。
请注意,通常每个步骤都会运行多个滤波器。因此,如果使用10个滤波器,输出将如下所示:
这里,滤波器权重是在反向传播步骤中学习的参数。你可能已经注意到,当输入为32×32时,我们得到一个28×28的输出。为什么会这样?让我们看一个更简单的例子。
假设初始图像的大小为6x6xd,而滤波器的大小为3x3xd。在这里,我把深度保持为d,因为它可以是任何数值,它是无关紧要的,因为它在两者中保持不变。由于深度相同,我们可以查看滤波器工作原理的前视图:
在这里我们可以看到结果将是4x4x1的块。请注意,滤波器每个位置的整个深度都有一个单独的输出。但是你不需要一直这样做。让我们定义一个通用的情况,其中image具有维度NxNxd,filter具有FxFxd。另外,让我们在这里定义另一个术语“步幅”,即每一步移动的单元格数(在上面的矩阵中)。在上面的例子中,我们的步幅是1,但也可以是更高的值。所以输出的大小是:(N – F)/S + 1
您可以验证第一种情况,其中N=32,F=5,S=1。输出有28个像素,这也是我们从这个公式得到的。请注意,某些S值可能会导致非整数结果,我们通常不使用此类值。
让我们考虑一个例子来巩固我们的理解。从32×32大小的相同图像开始,我们需要连续应用2种过滤器,前10个过滤器的大小为7,步幅为1,后6个过滤器的大小为5,步幅为2。在查看下面的解决方案之前,只需考虑两件事:
每个过滤器的深度应该是多少?
在每一步中产生的图像大小将是多少。
答案如下:
请注意,图像的大小正在连续缩小。如果深度网络的尺寸过早变小,这将是不可取的。此外,这将限制大尺寸滤波器的使用,因为它们将导致更快的尺寸缩减。
为了防止这种情况,我们通常使用1作为步幅以及大小为(F-1)/2的零填充。零填充只是向图像的边界添加额外的零值像素。
考虑一下我们在上面看到的带有6×6图像和3×3滤波器的示例。所需的填充为(3-1)/2=1。我们可以将填充可视化为:
在这里你可以看到,由于每侧的填充为1,图像现在变成了8×8。因此,现在输出的大小将是6×6,与原始图像相同。
现在让我们总结一下卷积层:
输入尺寸:
W1 x H1 x D1
超参数:
K:滤波器个数
F:滤波器尺寸
S:步幅
P:填充量
输出尺寸:
W2 x H2 x D2
参数:((F.F.D).K + K))个
F.F.D:每个滤波器参数的个数
需要考虑的其他几点:
为了提高计算效率,K应设为2的幂
F一般取奇数。有时可能会使用F=1,这是有意义的,因为涉及到深度分量。
滤波器有时被称为内核。
理解了卷积层之后,让我们继续讨论池化层。
池化层
当我们在卷积层中使用填充时,图像大小保持不变。因此,池化层被用来减小图像的大小。它们通过使用滤波器在每一层进行采样来工作。考虑以下4×4层。因此,如果我们使用一个2×2的过滤器,使用步长2和最大池化,我们得到以下响应:
这里你可以看到4个2×2矩阵被合并成1个,分别取它们的最大值。通常,使用最大池化,但可以考虑其他选择,如平均池化。
全连接层
在卷积层和池化层的末尾,网络通常使用完全连接的层,其中每个像素被视为一个独立的神经元,就像一个常规的神经网络一样。最后一个完全连接的层将包含与要预测的类数一样多的神经元。例如,在CIFAR-10中,最后一个完全连接的层将有10个神经元。
5.案例学习:AlexNet
我建议你多读几次前面的章节,先掌握一些概念。
在本节中,我将详细讨论AlexNet结构。为了给你一些背景知识,AlexNet是2012年IMAGENET挑战赛的获胜方案。这是最著名的计算机视觉挑战之一,2012年是第一次使用深度学习网络来解决这个问题。
此外,与以前的解决方案相比,这获得了显著的好结果。我将在这里分享网络架构,并回顾上面学习的所有概念。
文中给出了具体的AlexNet解决方案。我将在这里解释网络的总体架构。AlexNet由11层CNN组成,具有以下体系结构:
在这里你可以看到在输入和输出之间有11层。让我们分别讨论其中的每一层。注意,每一层的输出将是下一层的输入。所以你应该记住这一点。
第0层:输入图像
尺寸:227x227x3
第1层:卷积层
(96个滤波器,尺寸为11X11,步幅为4,填充为0)
尺寸:55x55x96((227-11)/4+1=55)(深度为96是因为有96个滤波器)
第2层:最大池化
(滤波器3x3,步幅为2)
尺寸:27x27x96((55-3)/2+1=27)
(深度不变,池化在每一层单独实现)
第3层:卷积层
(256个滤波器,尺寸为5x5,步幅为1,填充为2)
尺寸:27x27x256
第4层:最大池化
(滤波器3x3,步幅为2)
尺寸:13x13x256
(深度不变,池化在每一层单独实现)
第5层:卷积层
(384个滤波器,尺寸为3x3,步幅为1,填充为1)
尺寸:13x13x384
第6层:卷积层
(384个滤波器,尺寸为3x3,步幅为1,填充为1)
尺寸:13x13x384
第7层:卷积层
(256个滤波器,尺寸为3x3,步幅为1,填充为1)
尺寸:13x13x256
第8层:最大池化
(滤波器3x3,步幅为2)
尺寸:6x6x256
第9层:全连接
(4096个神经元)
在这一层,6x6x256=9216像素中的每一个被馈入4096个神经元中的每一个,并且通过反向传播确定权重。
第10层:全连接
(4096个神经元)
和第9层类似
第11层:全连接
(1000个神经元)
这是最后一层,有1000个神经元,因为IMAGENET数据有1000个类需要预测。
我知道这是一个复杂的结构,但一旦你了解各层,你会更好地了解架构。请注意,如果查看AlexNet论文,您会发现结构的不同表示形式。这是因为当时GPU不是很强大,他们使用2个GPU来训练网络。所以工作过程被分为两部分。
我强烈建议你通过2012年之后ImageNet挑战的其他解决方案了解更多关于人们如何设计这些网络的想法。一些有趣的解决方案包括:
ZFNet:2013挑战赛获胜方案
GoogleNet:2014挑战赛获胜方案
VGGNet:2014挑战赛中的一个较好的方案
ResNet:2015挑战赛获胜方案,由Microsoft Research Team设计
6.用GraphLab实现CNN
理解了理论概念之后,让我们转到有趣的部分(实践),并在之前下载的CIFAR-10数据集上制作一个基本的CNN。
我将使用GraphLab来运行算法。您可以自由地使用其他工具代替GraphLab,如Torch、Theano、Keras、Caffe、TensorFlow等。但是GraphLab允许快速实现,因为它自己完成权重初始化和网络架构。
我们将研究CIFAR-10数据集,您可以从这里https://www.cs.toronto.edu/~kriz/cifar.html下载。
总结:
在这篇文章中,我们讨论了深度卷积神经网络(CNNs)的计算机视觉基础知识。我们首先了解了设计模仿眼睛的人工系统所面临的挑战。然后,在深入学习之前,我们研究了一些传统的技术,并对它们的缺点有了一些直观感受。
我们继续了解训练神经网络的一些方面,如激活函数、权值初始化和数据预处理。接下来,我们对为什么deep CNN比传统方法工作得更好有了一些了解,并且我们理解了deep CNN中存在的不同组成部分。
随后,我们通过分析ImageNet 2012挑战赛的获奖解决方案AlexNet的体系结构,巩固了我们的理解。最后,我们获取了CIFAR-10数据,并使用预先训练好的AlexNet深度网络在其上实现了CNN。