几个世纪以来,人类一直是自然进化模式的一部分。根据弗林效应,近代出生的普通人的智商高于上个世纪出生的普通人。人类智能使我们能够学习、决定并根据我们的学习做出新的决定。我们使用 IQ 分数来量化人类智力,但机器呢?机器也是这一进化之旅的一部分。我们如何将注意力转移到机器上并使它们变得智能,就像我们今天所知道的那样?让我们快速回顾一下这段历史。
一个突破出现在 1940 年代,当时可编程数字计算机问世,随之而来的是可以衡量机器智能的图灵测试的概念。感知器的概念可以追溯到 1958 年,当时它作为一个可以学习和预测的强大逻辑单元被引入。感知器相当于帮助人类运作的生物神经元。20 世纪 70 年代,人工智能领域快速发展,自那时以来呈指数级增长。
人工智能是机器展示的智能,通常是在对历史事件进行训练时。人类一生都在接受训练和调节。例如,我们知道离火太近会导致我们被灼伤,这对我们的皮肤来说是痛苦和有害的。同样,可以训练系统根据特征或历史证据来区分火和水。人类智能正在被机器复制,这就产生了我们所知的人工智能。
人工智能包括机器学习和深度学习。机器学习可以被认为是帮助算法从数据/历史事件中学习并制定决策过程的数学模型。机器学习数据的模式并使算法能够创建一个自我维持的系统。它的性能可能会受到限制,例如在处理大量复杂数据的情况下,这就是深度学习发挥作用的地方。深度学习是人工智能的另一个子集。它使用感知的概念,将其扩展到神经网络,并帮助算法从各种复杂的数据中学习。尽管我们有许多建模技术可供使用,但最好从最简单的技术中找到良好且可解释的结果,正如奥卡姆剃刀所说(最简单的答案通常是最好的)。
现在我们已经探索了一些历史,让我们浏览一下适用的领域。有两个领域——自然语言处理(NLP)和计算机视觉(CV)——使用大量的深度学习技术来帮助解决问题。NLP 迎合了我们的语言定义的问题集,本质上是最重要的交流方式之一。另一方面,CV 解决与视觉相关的问题。世界上充满了人类可以用感官破译的数据。这包括眼睛的视觉、鼻子的气味、耳朵的声波、舌头的味觉和皮肤的感觉。使用这种感官输入,我们大脑中连接的神经元解析和处理信息以决定如何做出反应。计算机视觉是解决机器学习问题的视觉方面的一个领域。
本文带您了解基础知识,并为您提供计算机视觉的应用知识。
什么是计算机视觉
计算机视觉处理依赖于图像和视频的特定问题集。它试图破译图像/视频中的信息,以便做出有意义的决定。就像人类解析一幅图像或一系列按顺序放置的图像并对其做出决策一样,CV 帮助机器解释和理解视觉数据。这包括对象检测、图像分类、图像恢复、场景到文本生成、超分辨率、视频分析和图像跟踪。这些问题中的每一个都以其自身的方式很重要。在并行计算的力量发挥作用后,研究与视觉相关的问题获得了很大的吸引力。
应用
计算机视觉的应用因所讨论的行业而异。以下部分介绍了其中的一些任务。
分类
涉及决策过程的图像相关问题的最简单形式是监督技术,称为分类。分类只涉及将类别分配给不同的图像。该过程可以像具有一个类的图像一样简单,也可以更复杂,当同一图像中有多个类时。见图1-1和1-2。
![](https://i-blog.csdnimg.cn/blog_migrate/9ed844cace2a39e5ab41d300d776944e.jpeg)
图 1-1 本例中的类是一只猫
![](https://i-blog.csdnimg.cn/blog_migrate/ee01225506056e00a8cbf8332649d676.jpeg)
图 1-2 本例中的类是一只狗
我们可以根据它们是猫还是狗的图像来区分这些图像的内容。这是我们的眼睛如何感知差异的一个例子。我们试图分类的对象的背景无关紧要,因此我们需要确保它在算法中也无关紧要。例如,如果我们在所有狗图像前面包含某个汽车公司的徽标,则图像分类器网络可能会学习根据该徽标对狗进行分类并将其用作快捷方式。我们稍后将详细描述如何将此信息合并到模型中。分类可用于识别制造单元生产线中的对象。
目标检测和定位
一个经常遇到的有趣问题是需要在另一个图像中定位特定图像,甚至检测它可能是什么。假设有一大群人,有些人戴着口罩,有些人没有。我们可以使用视觉算法来学习面具的特征,然后使用该信息来定位面具相对于图像的位置并检测面具。见图1-3和1-4。
![](https://i-blog.csdnimg.cn/blog_migrate/0a38daaa1b78b729b4d0eab04fbd2173.jpeg)
图 1-3 类别:未检测到口罩
![](https://i-blog.csdnimg.cn/blog_migrate/a2e95adfaed27bab8179f29824b66728.png)
图 1-4 类别:图像中检测到遮罩
这种分析有助于从交通摄像头检测移动车辆的牌照。有时,由于摄像机的分辨率和移动的交通,图像质量不是很好。超分辨率是一种有时用于提高图像质量并帮助识别车牌上数字的技术。
图像分割
此过程用于确定放置在一起的相似对象的边缘、曲线和梯度,以便分离图像中的不同对象。这里可以使用经典的无监督技术,而不必担心找不到高质量的标记数据。处理后的数据可以进一步用作对象检测器的输入。参见图1-5。
![](https://i-blog.csdnimg.cn/blog_migrate/ed836b45749979436d91ab5a170e206d.jpeg)
图 1-5 在拓扑图中分离地形
异常检测
另一种经典的、无监督的确定变化的方法是将图像与来自某些训练数据的通常的预期模式进行比较。例如,与训练数据相比,异常检测可用于确定钢管中的缺陷。如果机器发现异常,它会检测到异常并通知生产线工程师进行处理。参见图1-6a和1-6b。
![](https://i-blog.csdnimg.cn/blog_migrate/1e2f93dae07ee86370a4705ea7e9d634.jpeg)
图 1-6a 钢管的完美例子
![](https://i-blog.csdnimg.cn/blog_migrate/fbd7dc621b394c12dbb573c365fdf7de.jpeg)
图 1-6b 管道中出现异常
视频分析
视频或图像序列有很多用例。运行图像上的目标检测任务可以帮助处理 CCTV镜头。它还可用于检测每个视频部分的帧内的异常情况。
我们将在接下来的章节中详细介绍所有这些应用程序。在此之前,让我们先了解一些为进一步理解计算机视觉奠定基础的内在概念。
Channels
![](https://i-blog.csdnimg.cn/blog_migrate/acba16ef230447512e0a54e2ee14df90.jpeg)
图 1-7 演奏音乐家
围绕计算机视觉的最基本和最典型的想法之一是通道. 想想用多种乐器演奏的音乐;我们听到所有乐器一起演奏的组合,这基本上构成了立体声音乐(见图1-7)。如果我们将音乐分解为单个组件,我们可以将声波分解为来自电吉他、原声吉他、钢琴和人声的单独声音。将音乐分解成它的组件后,我们可以调制每个组件以获得所需的音乐。如果我们学习了所有的音乐转调,就可以有无限多的组合。
![](https://i-blog.csdnimg.cn/blog_migrate/67a2c209bf0777a59ffb430af7718bd1.png)
图 1-8a 白色图片对应的像素值
![](https://i-blog.csdnimg.cn/blog_migrate/b7db3cc2c55ad6e6f27a5fccc60f8f7d.png)
图 1-8b 样本白页
![](https://i-blog.csdnimg.cn/blog_migrate/85e315c67daaf00477e16bf4bec92ac3.png)
图 1-8c草图对应的代表性像素值
![](https://i-blog.csdnimg.cn/blog_migrate/c91d7ed54f24354e25a7517e3d65ef21.jpeg)
图 1-8d 在一个通道中表示的示例草图
我们可以将这些概念外推到图像,我们可以将其分解为颜色的组成部分。像素是颜色的最小容器。如果我们放大任何数字图像,我们会看到构成图像的小框(像素)。任何一个像素点,一个通道的强度一般范围是0-255,这也是八位定义的范围。考虑图1-8b。我们有一个白页。如果我们将该页面转换为数组,它将为我们提供一个包含所有 255 个像素的矩阵,如图1-8a所示。另一方面,图1-8d转换为矩阵后,也将只有一个通道,强度将由 0-255 范围内的数字定义,如图 1-8c所示. 接近 0 给我们黑色,接近 255 给我们白色。
让我们考虑一个彩色图像。我们可以将任何全彩色图像分解为三个主要成分(通道)的组合——红色、绿色和蓝色。我们可以将任何彩色图像分解为红色、绿色和蓝色的某种确定组合。因此,RGB(红、绿、蓝)成为彩色图像的通道。
![](https://i-blog.csdnimg.cn/blog_migrate/6d77ea415f530037c5c307e5d937fc8d.png)
图 1-9 蓝色(左)=0,绿色(中)=1,红色(右)=2 的示例图像
图1-9中的图像可以分成 RGB,第一个通道是蓝色,然后是绿色,最后是红色。图像中的每个像素都可以是RGB的某种组合。
我们不限于使用 RGB 作为颜色通道。我们还有 HSV(Hue、Saturation 和 Value)、LAB 格式和 CMYK(Cyan、Magenta、Yellow 和 Black),它们是图像通道的几种表示形式。颜色是一种特征,它的容器是一个通道,所以每张图像都是由边缘和渐变组成的。我们可以只用边缘和渐变创建世界上任何图像。如果放大一个小圆圈,它应该看起来像多条边和直线的组合。
总而言之,通道可以作为功能的容器被调用。特征可以是图像的最小个体特征。颜色通道是通道的一个具体例子。由于边缘可以是特征,因此仅迎合边缘的通道也可以是通道。深思——如果您要创建一个可以识别猫或狗的模型,动物的颜色是否会像边缘和渐变那样影响模型行为?
卷积神经网络
您现在知道图像具有特征,需要提取这些特征以更好地理解数据。如果我们考虑像素矩阵,则像素在所有四个方向上都是相关的。你如何有效地进行提取?机器学习或深度学习的传统方法会有帮助吗?让我们来解决一些问题:
图像可以有巨大的尺寸。例如,一张 2MP 的图像,如果允许拍摄 1600x1200 的图像,则每幅图像将具有 190 万像素。
如果我们通过图像捕获数据,则数据并不总是居中对齐。例如,一只猫可以在一个图像的一个角落,而在下一个图像中,它可以在中心。该模型应该能够捕获信息中的空间变化。
图像中的猫可以沿垂直维度或水平维度旋转,但它仍然是一只猫。因此,我们需要一个强大的解决方案来捕捉这些差异。
我们需要对常规表格数据方法进行重大升级。如果我们可以将问题分解成更小的可管理部分,那么任何事情都可以解决。在这里,我们使用卷积神经网络。我们尝试通过内核将图像分解成几个特征图,并按顺序使用它们来构建一个模型,然后该模型可用于任何下游或借口任务。
内核是特征提取器。特征可以是边缘、渐变、图案或本章前面讨论的任何小特征。方阵通常用于在第一步的图像和第二步的特征图上操作卷积任务。内核执行的卷积任务可以被认为是点积中最简单的任务。参见图1-10a和1-10b。
![](https://i-blog.csdnimg.cn/blog_migrate/9cee6da850bdfc683720baf62b6d6def.png)
图 1-10a 3x3 特征图矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/c9aea9da373336e007e3180a52a5567e.png)
图 1-10b 3x3内核
图1-10a是图像或特征图,图1-10b是内核。内核是特征提取器,所以它会在特征图上做点积,得到值 10。这是我们卷积的第一步。图像或特征图将变得很大,因此内核可能不会仅在 3x3 矩阵上运行,但它会向前迈出一大步来计算下一个卷积运算。让我们看一下这个想法的一个外推示例。
![](https://i-blog.csdnimg.cn/blog_migrate/5afee144616cffaab97e52b5da1765cd.jpeg)
图 1-11 特征图、内核和结果输出
如图1-11所示,一个 5x5 的特征图由一个 3x3 的内核进行卷积,得到一个 3x3 的特征图。该地图将再次被卷积或转换为下游任务的某些特征。
卷积过程还包含步幅的概念,这是一个超参数,告诉内核如何在特征图上移动。鉴于我们的卷积神经网络,我们的步幅为 1。步幅大于 1 会导致特征图中出现棋盘格问题,一些像素比其他像素更受关注。根据我们的业务需求,我们可能想要或不想要这种效果。较高的步幅值也可用于降低特征图尺寸。
这种卷积存在一个固有的问题。当卷积发生时,维度不断缩小。这在某种意义上或某些特定用例中可能是可取的,但在少数用例中,我们可能希望保留原始尺寸。我们可以在图像或后续的特征图上使用填充的概念来避免降维问题。填充是另一个超参数。我们在图像或特征图周围添加图层。
图1-12b显示了填充如何从根本上增加空间并使内核更好地注意到边缘像素值。卷积过程将不止一次通过边缘值,因此信息被传送到下一个更有效的特征图。在边缘具有像素值的情况下,无论当时的步幅值是多少,来自内核的卷积只会采用该值一次。
![](https://i-blog.csdnimg.cn/blog_migrate/4a7f6873d72113a1234152c4613b9157.png)
图 1-12a 边缘检测器
![](https://i-blog.csdnimg.cn/blog_migrate/719dc7b0512efd03a87e26780ece99bf.png)
图 1-12b 零填充特征图
非常有趣的是,简单的填充如何改变内核对边的识别。如果我们假设在特征图的角附近有一个重要的边缘并且不填充它,则不会检测到边缘。这是因为,要检测一条线或一条边,内核或特征提取器需要具有相似的模式。对于图1-12a中的内核,它是一个边缘检测器,它需要找到一个合适的梯度来检测实际的边缘。就是因为0到4、0到5、0到5的梯度,现在检测到了边缘。如果没有填充,这个梯度就不会存在,内核就会错过一个重要的部分。
感受野
当我们研究卷积的概念时,有一个特征图和内核步幅。内核正在提取空间中的特征,以便模型可以轻松地解释信息。现在我们将考虑一个具有一个通道的 56x56 图像示例。(这也写成 56x56x1。)如果我们尝试将整个图像转换为特征,则需要读取整个像素范围。让我们看一个图形示例来理清这个概念。
![](https://i-blog.csdnimg.cn/blog_migrate/bd8f64ff147dcb007f4f56935933f73d.png)
图 1-13 显示卷积运算的图表
图1-13显示了一个正常的 5x5 特征映射被另一个 3x3 内核卷积,得到一个 3x3 内核,假设没有填充并且步幅等于 1。特征图到特征图的下一个块。这意味着只有图1-13中最左边突出显示的角像素信息包含在 3x3 特征图中显示的最左边像素值中。这带来了一个问题,因为如果我们只有一层并且我们有一个 3x3 的内核,那么基本上一个像素在该层中将具有 3x3 的感受野。有趣的是,在那之后的层中,如果我们再次使用步幅为 1 和零填充的 3x3 内核,对于图1-13 ,接受层还是 3x3, 但 3x3 已经看到了整个图像。因此,它携带了原始图像的所有信息。这个概念被称为局部和全局感受野。
局部感受野
它是该步骤的内核卷积所传递的分层信息强度。在图1-13所示的示例中,我们有一个 3x3 内核,即九个像素。这将取决于直接步骤而不是全部。
全局感受野
这是传递到模型最后一层的累积信息。通常,为了简单起见,我们希望在最后将图像中的信息平均化为一个值。如果我们必须预测猫或狗,如果我们只得到一个相同的值而不是最后的矩阵,那将很容易。最后一个值 (1x1xn) 或像素应该在开始时基本上看到图像的所有像素,以便能够完美地破译信息。
图1-13中的示例按 3x3进行卷积,然后再按 3x3 进行卷积以达到最终的 1x1。现在 1x1 会看到 3x3 图形,而 1x1 又会看到 5x5 图形。它正在传递接力棒,内核正在提供帮助。这里的全局感受野是 5x5。
池化
卷积神经网络的一个初始优势是它可以并行工作。全连接层必须考虑 25 维的输入向量,即使图像尺寸小至 (5x5x1)。尽管 CNN 通过处理空间域来解决这个问题,但高维度仍然会导致 CNN 体系结构具有大量参数。池化试图通过帮助降维技术和过滤信息来解决这个问题。
仅在 CNN 中应用卷积层存在一个固有问题。空间特征由内核捕获,但输入特征图的微小变化会对输出特征图产生很大影响。为了避免这个挑战,我们可以使用池化。根据我们正在做的下游任务,我们可以使用最大池化、平均池化或全局平均池化。
池化可以被认为类似于卷积层应用于特征图的方式。但是,池化不是卷积,而是计算区域中所有值的平均值或最大值。它可以被认为是一个函数。池化部分没有学习任何参数。就是简单朴素的空间降维。建议在更高维度的特征图上使用 2x2 池化,至少需要大于 10x10。原因是 CNN 这个级别的信息集中度太高,通过合并快速减少它会导致巨大的损失。
最大池化
特征图将包含来自空间分布的图像的信息。如果我们考虑一个只需要边缘的下游任务,我们可以尝试最大化边缘,这样后续的特征图就会有一条过滤信息需要关注。选择最大池化后,突出的特征将被过滤并传递到下一层。当 stride 查看像素范围时,它会选择具有最高值的那个,也就是单词 max。
![](https://i-blog.csdnimg.cn/blog_migrate/2ce6350ab78a91e8ddf01a8c924e6d69.jpeg)
图 1-14 最大池的例子
图1-14左边是一个特征图;我们正在尝试获得步幅为 2 的最大池。生成的特征图从 4x4 减少到 2x2,只是突出的特征通过了。在某种程度上,如果图像或特征图中有一些边缘或梯度,那将优先于其他任何东西。
对于分类之类的任务,我们通常遵循最大池化过程,因为我们需要遵循重要的边和梯度,并且没有其他不相关的特征会扰乱架构。有趣的是,颜色在大多数分类任务中都不起作用。例如,一只猫可以是任何颜色,模型必须在不考虑颜色的情况下理解它是一只猫。
平均池化
我们已经建立了池化的基本概念。它为我们提供了一个过滤过程,而无需增加任何数量的可学习参数。对于 2x2 的平均池和 2x2 的步幅,一次处理一个 2x2 块的步幅将对整个部分进行平均,并在其之上计算平均值。平均值被传递到特征图的下一部分。
对于分类任务,一般不建议使用平均池化。但是,当图像较暗并且您想要提取黑白过渡时,可以使用它。
![](https://i-blog.csdnimg.cn/blog_migrate/ab33312229565526c8c8dcfee5ca2d1e.jpeg)
图 1-15 平均池的例子
图1-15显示了一个由步长为 2 的 2x2 块池化的特征图。池化区域的平均值反映在左侧显示的特征图中的每个 2x2 块上,映射到右侧的一个像素。
全局平均池化
全局平均池有时用于 CNN 架构的末尾,以将特征图汇总为一个值。假设,如果你留下了一个具有一定深度的 5x5 特征图(z 方向的通道,假设 x 和 y 是特征图的高度和宽度),你可以将这些值展平并使用完全连接的网络来映射那些喜欢获得模型的特征. 这是一个可行的选择,但采用 5x5,我们将 25 个特征转发到一个完全连接的网络,这将占用大量参数。相反,您可以尝试在这一步之后使用全局平均池化层并将其变为 1x1,本质上管理所有重要的特征并进行组合。我们通过不使用全连接网络保存的模型参数可以用来添加卷积层。这可以导致更好的准确性。
![](https://i-blog.csdnimg.cn/blog_migrate/668fd8624efd773a9b80deed0f4de68f.png)
图 1-16a 样本特征图
![](https://i-blog.csdnimg.cn/blog_migrate/ebcc254dbd320dadcad110cec605c9ad.png)
图 1-16b GAP 后的结果
图1-16a显示了一个 4x4 维度的特征图。池化后,我们只剩下一个值,如图1-16b所示。在所有情况下,我们都会有一个深度,它的值基于相应的池化和特征图。
计算:特征图和感受野
计算是本课程作业的一个重要方面。我们将使用它来制定我们的模型和各种实验。输出特征图的维度取决于多种因素,例如步幅、内核大小、池化、填充、输入和输出。让我们深入了解细节。
内核(Kernel)
内核_是特征图或图像的特征提取器。它在第一次前向传播中被初始化,但权重应该从反向传播中学习和改变,以使其成为更好的特征提取器。一旦训练开始,重量就会向高端移动。这可能意味着它提取的特征对成本函数很重要,因此对权重也很重要。让我们用K表示内核的维度。
步幅(Stride)
内核在特征图上移动的步长可以称为步幅。让我们用S表示它的值。
池化(Pooling)
传统卷积神经网络架构中的块尽量不做卷积,而是旨在从空间特征图中捕获某种信息,并为下一步快速降低特征图的维度。让我们用mp表示。
填充(Padding)
填充允许我们在卷积过程发生后保持维度不变。让我们用P表示。
输入输出
让我们按原样表示输入和输出,其中输入是指第一步的特征图,输出是指生成的特征图。
为图像启动架构的第一步是访问图像的大小并确定我们想要构建网络的深度,以便最后一层的感受野或输出将等于图像的大小图像。换句话说,它应该已经看到图像中的内容才能回答有关图像的任何问题。如果我们有一个大小为 56x56x3 的图像,则要使用的内核可以是 3x3x 3 x16。这意味着 3x3 内核具有三组不同的初始化,并与输入层或前一层中的通道相匹配。这是因为它必须知道混合需要在网络中提取和使用的特征的可能方式。公式变为:
HxWxC > KxKxCxC 接下来
这里的 H、W、C 是 输入图像/特征图的高度、宽度和通道。
K 是内核大小,C next是下一步的通道数或批量大小。当使用 CUDA 分数训练 CNN 时,我们需要推动内核大小等于 2^n 定义的某个数字。例如,如果我们使用 17 作为内核数,它最终仍将使用 32 而不是最接近的 2^n 数,即 16。
给定所有值和概念,让我们计算特征图输出:
![](https://i-blog.csdnimg.cn/blog_migrate/9be7864d724f93babeaf43ed4b535056.png)
给定,input = 12x12,
P = 0,K = 3x3,S = 1
![](https://i-blog.csdnimg.cn/blog_migrate/096a96073c8ba9c64bcec36bc84ede52.png)
output = 10 或 10x10
感受野的计算
第n层的receptive calculations将由一个统一的公式给出,如下
![](https://i-blog.csdnimg.cn/blog_migrate/321ca09feac83591a76c47c71bab1233.png)
假设我们正在计算第二层的感受野 K 1 , K 2 = 3。
两种情况下内核的步幅均为 1,感受野为 5。
了解 CNN 架构类型
了解架构类型
AlexNet
ILSVRC是一项致力于计算机视觉研究的竞赛,其著名的 ImageNet 数据集被用于评估该领域的模型和研究。首批获胜者之一是AlexNet,它在 2010 年和 2012 年的准确率很高。与该网络对应的论文发布揭示了卷积网络的使用,以及基本构建块。
![](https://i-blog.csdnimg.cn/blog_migrate/e178b8e53cf5106072a669e6a841bb43.png)
图 1-17 AlexNet架构
图1-17。描述了 AlexNet 中使用的概览架构。拍摄的图像尺寸为 224x224x3,并通过步幅为 4 的 11x11x3x96 卷积缩小为 55x55x96。使用 3x3 过滤器和步长 2 的最大池化。前两个卷积层使用了 LRN 和池化。接下来,接下来的三层只使用了卷积层和激活层,然后是全连接网络的两个块。然后将分数传递到 softmax 以对 1,000 个类别进行分类。
模型架构中最有趣的发明是 LRN(Local Response Normalization)。当时普遍使用sigmoid和tanh作为激活函数,但是AlexNet用的是ReLU。Sigmoid 和 tanh 在极值处会饱和,并且数据始终必须居中和归一化才能在反向传播过程中传递任何梯度。局部响应归一化可以被认为是亮度归一化器,然后是 ReLU 激活。
AlexNet 尝试使用多个 GPU 并行化训练过程以提高准确性。网络有两个部分相互平行,在某些部分交叉。
VGG
![](https://i-blog.csdnimg.cn/blog_migrate/eef4c1e888ac3940b60cfa5a684261ab.jpeg)
图 1-18 VGG架构
图1-18显示了 conv 1、conv 2、conv 3、conv 4 和 conv 5——具有 ReLU 激活的卷积块。每个块后跟一个最大池化,然后是 FC 6、FC 7 和 FC 8——一个完全连接的网络。
![](https://i-blog.csdnimg.cn/blog_migrate/be0ae4c39804d0637566f9e10fa9efd2.png)
图 1-19 VGG堆栈的逐层描述
该架构以基本的开发风格开始了长期深入的应用。在提出此架构时,未使用批量归一化,因此网络遭受内部协变量偏移和中途梯度丢失。该架构使用 3x3 的组合,然后是 1x1。堆叠三个 3x3 优于一个 7x7 的原因在于参数;如果我们有 C 通道,则 3x3 有 27C 2,但在 7x7 的情况下,我们最终将有 49C 2。然而,感受野最终是三个 3x3 的堆栈,相当于一个 7x7 的堆栈,所有堆栈都有更多的自适应函数在特征图上进行卷积。参见图1-19。
模型架构遵循卷积块式架构,该架构使用现代架构中使用的明确定义的优先级。我们有五个卷积块,当特征图的尺寸减小时,这会使信息损失最小化。每个块的通道数都会增加。每个卷积块后跟最大池化以减少特征图的维度。还添加了 1x1 卷积,它充当来自前一级别的特征图的所有特征的混合器。此卷积充当 z 轴降维技术。虽然连续使用 3x3 或 5x5 会增加特征图的通道数,但在某些时候,它需要减少,并通过适当的技术将信息损失降至最低。出于所有目的,1x1 用作跨通道池。它也可以用来增加通道的数量,但实际上并没有这样做。由于它是特征图上的逐元素乘法,因此可以很容易地总结内容。
VGG是对传统 CNN 架构的重大改进,是 2015 年发布的最先进算法。
ResNet
ResNet是一种用于图像下游任务的高级架构,并通过赢得 2015 年的 ILSVRC 竞赛而正式进入 CV 世界。它也是一些最先进的对象检测算法(如 YOLO 和更快的 RCNN。这篇论文是由微软的一个团队提出的。他们能够在残差学习框架的帮助下进行更深入的训练。
![](https://i-blog.csdnimg.cn/blog_migrate/302d27c322ed6ddaa7be1c2dad354faa.jpeg)
图 1-20 残差结构
图1-20展示了残差框架的基本结构。上一层的输出可以认为是X;它与身份函数一起传递给残差函数。因此,如果残差函数由函数 f(x) 给出,我们可以调用 f(x) + x 的结果。
该结构试图解决的问题是精度下降。实验表明,更深层次的网络在添加层后其准确度会饱和并最终下降。这些下降不是由于过度拟合,而是由于问题本身难以优化。在深度神经网络中,一个常见的线性问题可能很难训练。例如,如果想要构建一个仅对两个数字进行线性加法的模型,并且我们希望结果为总和,则非线性对应项通常很容易优化,例如仅将指数与结果相加。
![](https://i-blog.csdnimg.cn/blog_migrate/47539b20f49317505ca4d225d5c26675.jpeg)
图 1-21 ResNet 基本架构
![](https://i-blog.csdnimg.cn/blog_migrate/8d16acc4119c92f84b482ca50a73b814.png)
图 1-22
ResNet逐层卷积信息
除了我们从残差网络获得的内容之外,跳过残差网络产生的身份层还提供了第二组可用的局部感受野。通常被称为跳跃连接或高速公路网络,它们向深层网络提供图像的副本。跳过连接的输出和残差需要具有相同的维度。因此,在添加到残差函数之前,输出上会发生一个投影以匹配维度。图1-21描绘了一个ResNet-34架构,可以参考图1-22所示的表格. 该架构使用3,4,6,3的栈,64,128,256的栈,512个网络块。有两种类型的跳跃连接——一种是实线,另一种是虚线。在大多数情况下,如果输入维度与残差的输出匹配,则添加输入。这由实线表示。在虚线的情况下,如果不匹配,除了 1x1 和步幅为 2 之外,还通过填充来控制尺寸。无论哪种方式,都不会为模型添加任何参数来学习。
另一个需要注意的重点是,该模型使用具有动量的随机梯度下降作为优化器。具有动量的 SGD 是许多其他最先进模型中使用的另一种行之有效的方法。
Inception架构
Inception自 2014 年以来交付了几个版本。GoogLeNet(通常与 InceptionV1 相关联)是 ILSVRC 的获胜者。有多次迭代;让我们看看初始架构。
为了增加卷积块中的有效局部表示,该解决方案提出分解卷积。实际上,它建议在 1x1 之后使用 3x3,从而降低激活强度并降低相关性。他们使用一种方法将较重的卷积核分解为较小的卷积核,试图获得相同的结果。例如,一个 5x5 需要 25C 2 个参数,但它可以分成两组 3x3,仍然需要 18C 2 个参数。见图1-23. 根据研究,5x5 可能在一次卷积中获得更多像素点方面具有更好的表现力。因此,与 3x3 相比,它具有更好的鸟瞰图。然而,该架构声称在构建计算机视觉模型时,我们需要注意平移不变性,而较小的内核大小将有助于我们实现这一点。
![](https://i-blog.csdnimg.cn/blog_migrate/5bbe91d75c3ed1988fecaba5614b030f.jpeg)
图 1-23 卷积鸟瞰图
分解进一步分解为非对称卷积。3x3 仍然可以分解为 3x1 和 1x3 卷积,至少节省了9/6。这也可以用于更高级别的卷积,如图1-24所示。
![](https://i-blog.csdnimg.cn/blog_migrate/04e869b9128bdb99d1499da2c6e453d1.jpeg)
图 1-24 非对称卷积
模型架构的另一个重要补充是辅助分类器。它们旨在解决深度神经网络的梯度消失问题。除了使用的批量归一化和丢弃之外,这部分网络还充当模型的正则化器。与没有此类分支的模型相比,辅助分类器有助于模型在训练结束时提高准确性。图1-25显示了一个分支出来的辅助网络。
![](https://i-blog.csdnimg.cn/blog_migrate/27fca4099be0b484e1d76583106d3541.jpeg)
图 1-25 辅助网络
当池化应用于具有通道的信息网格时,建议我们根据我们正在寻找的缩减来增加特征图的数量。由于信息是空间分布的,我们可能希望固定信息量而不是切断它。想象一个半固体长方体会有所帮助。如果我们必须减少面部,我们必须在一个方向上拉长。在我们的例子中,它将是深度。图1-26显示了初始架构中使用的网格缩减技术。并行架构设想并行使用池化和卷积并将它们连接起来。
![](https://i-blog.csdnimg.cn/blog_migrate/6c52295bfaf307e1232d35b287aaa6e4.jpeg)
图 1-26 初始架构快照
Inception 架构首先使用带有动量的随机梯度下降,但后来使用 RMSProp 来训练模型,从而获得了更好的精度。
使用深度学习模型技术
到目前为止,我们已经介绍了广泛使用的基于 CNN 的模型。有多种方法可以为通用计算机视觉任务的架构建模。现在让我们讨论一些重要的概念,这些概念将在下一章我们动手探索多个问题时派上用场。
批量归一化
训练深度神经网络时会出现一个固有问题。在训练过程中,各层的输入分布受到一定程度的影响,因为输入流出的层不同而采用不同的分布。梯度会影响权重,而权重又会对分布产生级联效应。这种现象称为内部协变量偏移。为了使用 SGD 训练深度神经网络,通常使用小批量梯度下降。这个过程在一个层面上减少了计算需求,并且给小批量一个原始输入的表示,训练水平很好。
批量归一化通常在卷积操作之后使用。它可以在 ReLU 激活层之后或之前使用,但永远不会在架构的最后一层之后使用。它增强了每一层之后提取的特征。让我们看一个例子。考虑在一个批次中具有 64 个通道和 16 个图像的任意层。在这种情况下,我们将使用 16 个图像对 64 个通道中的每个通道进行归一化以获得我们的输出。
在批量归一化的第一步中,我们试图通过批量的均值移动数据,然后通过批量的标准偏差对其进行缩放,这对应于批量中的通道。在第二步中,我们将结果乘以 γ 并向其添加另一个参数 β 。这些参数帮助神经网络确定是否需要批量归一化以及这些特征在下一层中的重要性。这有助于梯度流动并最终有助于训练。
![](https://i-blog.csdnimg.cn/blog_migrate/d46ecb24865f99fb6311c3fbbf39cfe6.png)
x – 原始输入
μ - 小批量的平均值 - 不可训练的参数
σ – 与小批量的标准偏差 – 不可训练的参数
γ, β – 标准化效果的参数 – 可训练参数
因此,批量归一化将额外的可训练参数合并到模型架构中。
Ghost batch normalization 是与 batch normalization 相关的最新发展。当我们在单个 GPU 中训练并且单个 GPU 填充了一批时,这个概念是合理的。如果有人使用多个 GPU,训练可能会出现问题。幽灵批量规范化在这种情况下有所帮助。它将使用 GPU 作为支点,并计算样本均值和标准差以计算归一化。考虑到它在较小的样本量上工作,这也会对数据进行正则化。由于使用多个 GPU 而导致的图像分布的随机性会在一定程度上改变损失函数。批量归一化已被证明是让模型更深入的一个很好的机制;它为现代架构提供了多方面的好处。
Dropouts
Dropout一般用于一维网络。在卷积神经网络的情况下,一些模型确实有丢失,它们可以在除最后几层之外的每个卷积层之后使用。最后几层的尺寸较小,图像将被表示出来。它可以充当正则化器。
![](https://i-blog.csdnimg.cn/blog_migrate/d561dde6ee5b6d6b0314f4a86b1135b6.png)
图 1-27 全连接网络中的Dropout示例
图1-27显示了 dropout 应用程序。图像的左侧是一个通用的神经网络。右侧显示了除最后一层之外所有层的丢失。
数据增强技术
深度学习架构最适合处理大量数据,以便对成本函数进行概括。在现实场景中,通常无法获得足够的数据。数据增强用于在不影响图像的实际标签或基本可区分特征的情况下生成数据点。例如,如果我们想要增强一张猫的图片,我们必须为分类器提供的不仅仅是尾巴的图像。尾巴可以是同一物种内的可区分特征,但也可以属于其他物体。
训练数据需要代表人群。图像可以有很多变化、平移和亮度变化。这里列出了一些增强技术:
翻转:图像可以在水平轴或垂直轴上移动。
美白:用于增强已经可以区分的特征。CNN 试图捕捉边缘和梯度,因此这些可以提供帮助。
缩放:缩放图像像素值的过程。
随机裁剪:随机裁剪一部分图像可以作为 dropout 的替代方法,因为没有特定的图像部分得到优先考虑。
移动颜色:我们可以使用色调和饱和度值来移动以及 RGB 移动。
弹性变形:我们可以尝试计算位移插值,在垂直和水平轴上移动几个点。
混合:在一些分类的模型场景中,我们可以使用这种技术来创建两个类的混合,从而使 CNN 具有线性区分能力。
补丁高斯:此技术将随机噪声添加到图像中的选定补丁。这增强了模型的鲁棒性。
基于强化的增强:我们可以创建模型并决定增强策略。这是一个昂贵的过程,应谨慎使用。
有多种数据增强技术,其中大多数都根据我们想要的鲁棒性和测试数据所期望的鲁棒性进行调制。它是任何基于深度学习的建模的一个重要方面。
PyTorch 简介
深度学习建模需要高计算量和正确定义的优化框架。有一些现有框架在研究和开发人员社区中非常受欢迎。在所有框架中,他们都确保有用和重复的功能随时可用。框架实质上设置了包和功能,可帮助开发人员轻松创建端到端的深度学习模型。
PyTorch是用 C++ 和 Python 开发的框架,因此经过优化并且速度更快。它的大部分开发都使用张量。它还有助于在不同的处理器架构中操纵张量。支持在CUDA内核中并行处理和处理,加速计算机视觉模型的训练。
以下部分讨论如何使用 PyTorch。
安装
访问pytorch.org并选择要安装 PyTorch 的系统。例如,如果你想通过 conda 或 pip 安装包,最好安装 CUDA 并利用它。
<conda> / <pip> install pytorch/torch <configuration>
基本开始
import numpy as np
import torch
print(torch.__version__)
>> 1.9.0+cu102
以下是从 NumPy 转换为张量的基本操作。
x1 = [[1,1],[2,2]]
print("Type of data :{}".format(type(x1)))
print(x1)
x1 = np.array(x1)
print("Type of data :{}".format(type(x1)))
print(x1)
![](https://i-blog.csdnimg.cn/blog_migrate/eb0eee82a6e440ee19ef9916f0e3ed06.jpeg)
图 1-28a 将 NumPy 转换为张量
在这里,我们正在创建一个列表并将其转换为 NumPy 数组。
x_tensor = torch.tensor(x1)
print("Type of data :{}".format(type(x_tensor)))
print(x_tensor)
![](https://i-blog.csdnimg.cn/blog_migrate/393d2e8e324d7f9d5dbc626449bb74ed.jpeg)
图 1-28b 将列表转换为张量
在这里,我们使用torch.tensor将 NumPy 数据转换为张量。
x1 =np.array([[2,2],[2,2]])
x_tensor = torch.Tensor(x1)
print("Type of data :{}".format(type(x_tensor)))
print(x_tensor)
![](https://i-blog.csdnimg.cn/blog_migrate/a60cb9af383d31ae73ddb535a4c82c25.jpeg)
图 1-28c 从数组生成的张量示例
接下来,我们使用torch.Tensor将 Numpy 数组转换为 Torch 张量,这是一个将现有数据转换为张量或创建未初始化数据张量( torch.empty ) 的构造函数。
x1 =np.array([[1,2],[1,2]])
x_tensor = torch.from_numpy(x1)
print("Type of data :{}".format(type(x_tensor)))
print(x_tensor)
![](https://i-blog.csdnimg.cn/blog_migrate/6179845b38410c1edcd861b41bc5361a.jpeg)
图 1-28d 从数组生成的张量示例
此函数还用于从 NumPy 数组创建张量。现在让我们看一下矩阵乘法中的一些函数:
zero_t = torch.zeros((2,2))
print(zero_t)
one_t = torch.ones((2,2))
print(one_t)
rand_t = torch.rand(2,2)
print(rand_t)
![](https://i-blog.csdnimg.cn/blog_migrate/c9393b55086a33a9b1b0524c4f92d402.jpeg)
图 1-28e 几个张量生成器的例子
我们正在创建一个全零、全一的 Torch 张量和另一个随机值张量。我们可以将其用于基本的线性代数运算。
print(one_t + rand_t)
![](https://i-blog.csdnimg.cn/blog_migrate/4ff037c29ef2f230e8e52d8f35b7a45a.jpeg)
图 1-28f 张量加法例子
print(one_t*rand_t)
![](https://i-blog.csdnimg.cn/blog_migrate/819b137c18d468a500312fe60c876adb.jpeg)
图1-28g 张量乘法的例子
结果显示两个矩阵的加法和乘法,详细看矩阵运算。
array1 = torch.tensor([1,2,4])
array2 = torch.tensor([2,3,4])
print(torch.dot(array1,array2))
>> tensor(24)
torch.dot函数计算两个一维张量的点积。
array1 = torch.tensor([1,2,4]).reshape(1,-1)
print(array1.shape)
array2 = torch.tensor([2,3,4]).reshape(-1,1)
print(array2.shape)
print(torch.matmul(array2,array1))
![](https://i-blog.csdnimg.cn/blog_migrate/5fe6a977e9e8fa8a99adde889d51c6f5.jpeg)
图 1-28h 张量点积例子
概括
本章解释了进行点积和矩阵乘法的基本方法。我们可以将通道和输入视为三维张量。建模框架在计算机视觉模型中使用点积、逐元素乘法和其他线性代数运算。在接下来的章节中,我们将更深入地研究如何使用 Torch 进行建模。
我们了解了卷积神经网络的基础知识以及它们如何帮助理解图像。
至此,我们结束了对计算机视觉概念的讨论。我们从下一章的应用程序和项目开始。