Johanna Pingel, MathWorks
Gabriel Ha, MathWorks
概述
虽然深度学习可以在物体识别和物体检测方面达到最先进的精度,但训练、评估和比较深度学习模型可能很困难。深度学习还需要大量的数据和计算资源。
在本次网络研讨会中,我们将探讨MATLAB如何®解决最常见的深度学习挑战,并深入了解训练精确深度学习模型的过程。我们将介绍用于物体识别和物体检测的深度学习和计算机视觉的新功能。
突出了
我们将使用现实世界的例子来演示:
主讲人简介
Johanna Pingel于2013年加入MathWorks团队,专注于图像处理和MATLAB计算机视觉应用。她拥有伦斯勒理工学院的硕士学位和卡内基梅隆大学的文学学士学位。她在计算机视觉应用领域工作了5年多,专注于目标检测和跟踪。
记录日期:2017年8月2日
大家好,我是Johanna,和Gabriel在一起,我们要谈谈计算机视觉的深度学习。我们有一些很棒的新演示和功能向您展示。让我们开始吧。
好的,我们将从设置一些上下文开始。我们的网站上还有其他深度学习视频,比这个网络研讨会要短得多,你也应该看看。但最重要的是,与其他视频相比,我们将在本次网络研讨会上进行更深入的讨论。我们谈论的是计算机视觉的深度学习。什么是深度学习?这是一种机器学习,可以直接从数据中学习特征和任务,数据可以是图像、文本或声音。
既然我们在讨论计算机视觉,我们自然会看到图像数据。但请记住,深度学习适用于许多其他不处理图像的任务。
正确的。让我们来看看深度学习如何工作的快速工作流。假设我们有一组图像,其中每张图像包含一个或四个不同类型的物体。我们想要一种能自动识别每张图像中是哪个物体的东西。我们从标记的图像开始,这意味着我们告诉深度学习算法图像包含什么。有了这些信息,它开始理解物体的特定特征,并将它们与相应的类别联系起来。
您会注意到,任务是直接从数据中学习的,这也意味着我们对正在学习的特征没有任何影响。你可能听说过这被称为端到端学习,但无论如何,只要记住深度学习是直接从数据中学习特征。
这就是深度学习的基本工作流程。虽然深度学习的概念已经存在了一段时间,但由于技术极大地提高了这些分类器的准确性,它在最近变得更加流行,以至于它们在分类图像时比人类表现得更好。因此,也有几个因素使深度学习成为可能,包括大量的标记数据,强大的gpu来加速训练,以及能够使用其他人的工作作为起点来训练自己的深度神经网络,这一点我们后面会讲到。
是的,我们会的。所以在我们深入讨论之前,我们想给你们一些背景和框架来说明我们为什么要举办这次网络研讨会。深度学习是困难的。这是最前沿的技术,它可能会变得复杂,无论你是在处理网络架构,理解如何训练一个准确的模型,还是整合成千上万的训练图像。
是的,更不用说每个人最喜欢的任务——试图弄清楚为什么有些东西不能工作。
我们希望MATLAB能让深度学习变得简单易懂。在本次网络研讨会以及我们网站上的其他资源中,我们将解释如何使用MATLAB快速开始深度学习。我们网络研讨会中的示例还将演示如何处理大型图像集,轻松集成gpu以更快地训练深度学习模型,了解模型在训练时内部发生了什么,并在该领域专家的模型上进行构建,因此您不必从头开始。有了这些,我们开始吧。
是的。我们开始吧。因此,我们将介绍三个深度学习的例子——使用预训练的网络进行图像分类,迁移学习对新物体进行分类,以及图像和视频中的物体检测。首先是使用预先训练好的网络进行图像分类。我这里有一张辣椒的图片我想把它们分类。信不信由你,我可以用MATLAB用四行基本代码来做。
首先,导入一个预先训练好的模型。第二,引入图像。三、调整图像大小。第四,对图像进行分类。
很好。
就是这样。
很酷。
好了,接下来看第二个演示
他是在开玩笑。
是啊,我开玩笑的。我们来谈谈这里发生了什么。
第一行代码中的AlexNet是什么?亚历克斯是谁,我们为什么要用他的网?
直接回答你的问题,AlexNet是一个卷积神经网络,由很多人设计,包括Alex Krizhevsky。但我可能应该提供一些背景。有一个独立的项目和MATLAB无关它已经存在一段时间了叫做ImageNet项目。它的目标是拥有一个巨大的视觉内容存储库,比如图像,供人们在视觉物体识别方面进行研究和设计。
从2010年开始。他们每年举办一场名为“ImageNet到大规模视觉识别挑战”的比赛。
哦,是的。旧的ILSVRC。
是的,那场比赛。所以竞争者提交软件程序来正确分类和探测[听不清]中的物体。现在,直到2012年,实现计算机视觉的标准方法是通过一个被称为特征工程的过程,而不是AlexNet,它使用并改进了基于深度学习的方法。所以你可能猜到了,AlexNet提交给2012年ILSVRC的团队名称是“监督”,一个字。它让竞争对手出局,我想这既可以指竞争对手,也可以指比赛本身。
围绕它有很多炒作,因为人们意识到深度学习不仅仅是理论。它真的很实用,比我们以前做的要好得多。所以抛开历史教训不谈,AlexNet被训练来识别1000个不同的物体,我猜这与ILSVRC 2012的胜利条件有关。这是你可以从MATLAB中访问的几个预先训练好的网络之一,其中还包括VGG-16和19。
我们有历史教训吗?
我不会给这些人上历史课。让我们回到我们的四行代码。首先来看看MATLAB是如何让导入预训练模型变得非常简单的。没有比这更容易的事了。如果你的电脑上没有AlexNet,你只需要下载一次,无论是通过插件管理器,还是使用错误提示中的链接(如果你在没有下载的情况下运行代码)。现在你可以在这个演示中使用它以及其他任何你想要的东西。
在第二行中,你引入了图像。这看起来很简单。但你为什么要调整图片的大小?所以我第一次这么做的时候,我试着聪明一点,只用了三行代码。
没有调整大小?
是的。我得到了这个错误,它提到了一些关于大小的东西,这意味着,耶,我要弄清楚为什么它不能工作。
这是每个人最喜欢做的事情。
如果我用net。layers,它会显示网络的结构。一开始看起来很吓人,但是第一层,输入层,大小是227 * 227像素。最后的x3是RGB值,因为这是一张彩色照片。看到这个,我想,哦,好吧。只需使用MATLAB调整图像的大小,使其在传递到网络时不会出错。最后一行代码现在可以对图像进行分类了。
你之前提到AlexNet是一个卷积神经网络。这是什么意思,我可以简称为CNN吗?
我的意思是,只要观众不把这个网络研讨会与某个有线电视新闻网络混淆-有线新闻-哦。这就是CNN的意义,不是吗?嗯,除了CNN是一个自我参考的有线新闻网络,它是一个在图像和计算机视觉问题的深度学习中流行的架构。与AlexNet无关,要了解cnn的三件主要事情是卷积、激活和池化。
卷积是一种数学运算你们可能在大学课程中学过傅里叶变换和拉普拉斯变换,不管是好是坏。这个想法是我们对输入图像进行多次变换,每一次变换都从图像中提取某些特征。激活对卷积的输出应用一个变换。一个流行的激活函数是ReLU,或者ReLU,番茄,番茄,它简单地获取输出并将其映射到最高的正值。最后,拉取是一个简化输出的过程,我们只取一个值带到下一层,这有助于减少模型需要学习的参数数量。
因此,重复这三个步骤来形成整个CNN架构,该架构可以有数十或数百层,每一层都学习检测不同的特征。MATLAB的一个优点是它能让你看到特征图。所以如果你比较接近初始层的特征和接近最终层的特征,它们会变得越来越复杂,从颜色和边缘到看起来更详细的东西。
让我们再看一看AlexNet的各个层。你可以看到卷积、激活和池化。其他一些网络会有不同的这些层的配置,但在最后,它们都会有一个执行分类的最终层。再写几行代码,我们就可以重复地显示一张图像以及AlexNet认为它是什么。有时它能理解,有时不能。但这很好,只要对象在最初的1000个集合中。
这就引出了一个问题,如果不是,你能做什么?
请允许我回答这个问题,这是使用预训练模型进行的图像分类。让我们开始第二个演示。
好的。在下一个演示中,我们有一段汽车行驶在高速公路上的视频。我们希望能够将这些汽车分类为轿车、卡车或suv。我们将使用AlexNet并针对我们的对象类别对网络进行微调,这个过程称为迁移学习,它可以用于对不在原始网络中的对象进行分类。
这就是上一个问题的答案。快速跟进。所以,如果你有一个分类任务,你的对象恰好是1000个中的一个,你有什么理由不使用AlexNet吗?
好问题。在这种情况下,迁移学习的主要好处是有一个特定于数据的分类器。如果你训练的类别更少,你可能会提高准确率。
是有意义的。
所以我从我的手机中截取了这个视频,我可以通过IP网络摄像头自动将它带入MATLAB。这个功能可以让我录制几个小时的汽车在办公室窗外行驶的视频。现在,使用MATLAB和计算机视觉,我能够根据汽车的运动从每一帧视频中提取它们,使用的是一个相对简单的过程,称为背景减法。
这只是观察两张连续图像之间的像素差然后找出足够不同的东西。
现在,当车辆经过时,我们想把它们分为轿车、卡车或SUV。AlexNet认为我们看到的不是这种情况。所以,如果我们当前的模型对我们的数据不起作用,我们就需要一个新的模型。假设我们想把五种不同的车辆分类——小汽车、卡车、大卡车、suv和货车。我们的计划是使用AlexNet作为起点,并使用迁移学习来创建一个特定于这五个类别的模型。
那么,你为什么要使用迁移学习,而不是从头开始训练一个网络呢?
所以从零开始训练绝对是你可以尝试的。我们给出了MATLAB中的所有工具来做这个。但是有几个非常实际的原因来代替迁移学习。例如,您不必自己设置网络架构,这需要大量的尝试和错误才能找到良好的层的组合。此外,与从头开始训练相比,迁移学习不需要几乎那么多的图像来构建准确的模型。最后,你可以利用深度学习领域的顶级研究人员的知识和专业知识,他们花了比我们更多的时间来训练模型。
听起来不错。
这里有五个文件夹,包含了我们五个类别的大量图像。我们想要一种简单的方法将这些数据传递给我们的深度学习算法。早些时候,加布里埃尔用imread来引入辣椒的形象。但我们不想对每个图像都这样做。相反,我将使用一个称为图像数据存储的函数,这是一种引入数据的有效方法。
我们应该注意到,在MATLAB中有许多不同类型的数据存储,用于不同的大数据和数据分析任务。所以它不只是用于图像。如果您有大量数据,那么数据存储就是您的朋友。
图像数据存储到文件夹后,它会自动标记所有数据基于包含图像的文件夹的名称。所以没有必要一个一个来做。一旦我做到了这一点,我就可以访问有用的功能,比如查看每个类别有多少图像,并且能够快速将我的图像分为训练集和测试集。
如果需要,还可以指定自定义读取函数。默认情况下,图像数据存储为imread以读入所有图像,这对于标准图像格式非常有用。但如果您恰好有imread不知道如何处理的非标准图像格式,您只需编写自己的函数,将其传递到图像数据存储中,然后就可以继续工作了。
即使你有标准的图像格式,你也可以创建一个自定义的读取函数来进行图像预处理,比如调整大小、锐化或去噪。在我们的例子中,使用AlexNet,我们需要将它们调整为227 * 227。我们在这里使用这个自定义的read函数。
我注意到你没有直接调整大小。看起来你在填充图像。原因是什么?
这只是我个人的经验。我试着调整图像的大小,但网络不是很好。当我自己看这些图片时,我无法区分汽车和suv之间的区别。所以我做了一些同样效果的事情,裁剪图像并保持纵横比。因为这有助于保持结构上的差异,我认为这可能对网络有帮助。前面你看到AlexNet在分类我们的汽车和卡车方面做得很差。所以我们需要对网络进行微调。
如果我们看一下这些层,你可以看到最终的完全连接层代表了AlexNet训练的1000个类别。为了执行迁移学习,我们将五类对象的1000替换为5。然后这条线重置分类,这意味着忘记你学过的1000个物体的名字。你只关心这五个新的。
这是你唯一需要做的核心改变吗?
是的。这就是你需要做的所有网络操作。如果你运行这个,你会得到一个分类器它会输出这五个对象中的一个。
所以我想问题是,它的表现如何?
所以我们事先训练了这个网络,它实际上得到了很好的结果,比如97%的准确率。
对代码做了两个小改动,这已经很厉害了。
但说实话,你可能不会马上走到那一步。请记住,AlexNet是在数百万张图像上进行训练的,其中包括一些车辆。因此,我们有理由假设它恰好非常顺利地转移到我们的数据上。但如果你要把学习转移到其他图像上,与原始集合非常不同的图像上,也许你可能需要做更多的改变。
是有意义的。那么,如果人们发现自己的准确率低于标准,他们可以尝试些什么呢?
有很多事情你可以尝试。然后进入快速射击模式。你可以跟着这张幻灯片走。首先,在你开始改变参数之前,你可以做一些事情。检查你的数据。我再怎么强调这一点也不为过。最初,我的火车模型错误地分类了很多图像。我意识到我的一些数据放在了错误的文件夹里。显然,如果你的设置不准确,无论是错误的文件夹还是糟糕的训练数据,你都不会走得太远。
接下来,尝试获取更多数据。有时分类器需要更多的图像来更好地理解问题。最后,尝试不同的网络。我们正在与AlexNet合作,但正如我们提到的,还有其他网络可供您使用。另一个CNN可能会提供更好的结果。
听起来不错。假设我很确定我的设置是正确的。我现在该怎么办?
所以现在的问题是改变网络和训练过程。让我们从网络开始。更改网络意味着添加、删除或修改层。您可以在网络中添加另一个完全连接的层,这将增加网络的非线性,并有助于提高网络的准确性,这取决于数据。您还可以修改新层的学习权重,使它们比网络早期的原始层学习得更快。如果你想要保留网络之前学到的关于原始数据的丰富特征,这是很有用的。
至于改变训练过程,这是改变训练选择的问题。您可以尝试更多阶段,更少阶段,以及其他选项,您可以在我们的网站上找到相关文档。
所以我这么说很公平。所有的选择似乎都是,你把网络当成一个黑盒子。如果你训练它,结果不是很好,那你就对它进行一些修改,让它开始训练,等待整个等待时间,然后你就会发现它真的让事情变得更好还是更糟。在这个过程中,我们能做些什么吗?
绝对的。我们有一组输出函数可以告诉我们网络在训练时发生了什么。第一个图描绘了网络训练时的准确性。理想情况下,您希望看到精度随时间上升的趋势。如果你看到的不是这样,你可以停止训练,试着在你可能浪费时间在没有改善的事情上之前修复它。你也可以根据某些条件提前停止训练。这里我告诉网络如果我达到99.5%的准确率就停止。
我猜这是为了避免过度训练和过度配置网络。
是的。我们还有检查点的概念。你可以在一个特定的点停止网络训练,看看它在测试集上的表现如何,然后如果你决定它需要更多的训练,你不必从头开始。你可以继续你中断的训练。正如你所料,我们的网站上有很多不同培训选项的文档。如果你看一下这里,你可以看到我刚刚概述的选项——绘制训练精度,这里,停在一个指定的精度。所以一定要试试这些例子。
是的,请。复制粘贴此代码。有些人说永远不要复制粘贴你在网上找到的代码。我明白他们的意思,比如,不要盲目地复制东西,期望它能成功。但说真的,伙计们,让他谁是没有复制粘贴互联网代码铸造第一个错误消息。
你绝对应该复制我们的代码。不需要自己编写所有的代码,并且有一些很好的出发点来更好地控制训练过程,这很好。
假设我非常想对我的网络进行微调,我想尽可能地去除网络的黑盒方面。所以我想你们可能无法直接看到网络看到的东西。但我们如何开始更深入地了解我们的网络呢?
你可以做的一件事是将网络在图像中找到的特征可视化。我们可以看看滤镜,我们可以看看滤镜应用后的图像结果。在第一个卷积中,我们看到我们提取了边缘,深色和浅色的图案。它们可能非常明显,也可能不那么明显。这一切都取决于这些特征在图像中的强度。
所以你可以在网络的任何一层做这个?
是的。让我们来看看另一个。这张图像的第四次卷积的输出产生了一些更抽象但有趣的特征。您可以假设这个特定的频道将车轮和汽车保险杠作为特征。为了验证我们的理论,让我们尝试另一张图像,在图像的左侧看不到后轮。如果我们的假设是正确的,那么这个通道的输出不应该在图像的左侧激活那么多。这就是我们所看到的。
很好。因此,如果你想调试你的网络,这个技术可以为你的网络提供一个可视化的表示,并可能帮助你更好地理解正在发生的事情。
是的。所有的代码都在文档里。网站上的例子是通过寻找面部特征,但这是相同的概念。我们来看看另一个你可能会觉得有用的工具,叫做深度梦境。深度梦境可以用来制作你可能在网上看到过的非常有趣、富有艺术感的图像。但这是我们用来理解神经网络的另一个工具。Deep dream将输出一个图像,代表它在整个训练过程中学习到的特征。
理解这个的一种方法是,与其给网络一个图像,让它连接到一个类,不如反过来。我们给网络一个类,让它给我们一个图像。这为什么有用呢?
让我们看一下文档。神经网络工具箱有一个关于深度学习的很棒的页面。其中一个概念是深度梦境,以及一个使用AlexNet进行深度梦境的例子。我们可以看到我在要求一只母鸡,这是AlexNet训练的类别之一。深梦给了我一个抽象的母鸡的样子。我们可以为网络中的任何类别创建深度梦境图像。
所以如果我们看到一些东西看起来不像类别,我们可以假设我们的网络可能没有正确地学习我们的类别。
是的,这可能是训练数据的问题。让我给你们举个例子。在AlexNet最初的1000个类别中,有一个松鼠类别。我正好有一堆松鼠的照片,所以我们可以在我们的网络上试试。我们看到所有的预测都是正确的,除了这个。如果我们看松鼠的梦境,我们会看到什么?那头发呢,它被错当成什么了?有一些充满活力的颜色与我们尝试的前几张图片很好地对应。你可以看到与尾巴相关的特征。这些都是这张图片所不具备的强大特征。
由此,我想我们可以向我们的网络添加更多包含这些类型特征或缺乏这些特征的测试图像。
所以现在你已经有足够的时间开始深度学习,更具体地说,迁移学习。但是我们的例子还没有完全结束。还记得我们之前放的那个汽车行驶在路上的视频吗?我们尝试用AlexNet进行分类,这就是为什么我们费尽周折来创建我们自己的定制模型。使用与之前检测图像中的汽车相同的算法,我现在可以使用我们的模型进行分类。我们可以看到我们的模型认为它们是什么以及预测的能力。
很好。
这就是迁移学习的开始还有很多理解你的网络并进行改进的技巧和技巧。我们希望您已经看到MATLAB如何轻松地处理大量图像集,访问该领域专家的模型,可视化和调试网络,以及使用gpu加速深度学习。
等等,最后一条你完全没讲。
啊,这么说你注意了。
是的,我是。
是的,我们没有明确地讲过。但如果你仔细观察训练片段,输出消息表明我们在单个GPU上训练,一个NVIDIA®3.0计算能力的GPU,这是使用GPU进行深度学习的最低要求。用MATLAB进行GPU计算的美妙之处在于它都是在幕后处理的。而你,作为一个用户,不用担心。MATLAB在默认情况下使用GPU,如果你使用GPU或GPU集群或云中的GPU,甚至CPU,函数都不会改变。
你能用CPU来训练吗?我喜欢你如何从大到大,然后缩小到最基本的计算。
是的,技术上你可以使用CPU。但看看这段试图在CPU和GPU上训练相同深度学习算法的视频。
哇。这很不起眼。
是的。所有这些都适用于训练过程的任何部分,无论是训练、测试还是可视化网络。所以如果CPU是你唯一的选择,那就去买吧。但我们鼓励你使用GPU进行训练,或者至少确保你在训练模型时能喝上很长时间的咖啡。
好的。在我们最后的演示中,我们将讨论一个更有挑战性的问题经常引起我们的注意。看看这张照片。如果我们把它呈现给我们的网络,它会认为它是什么?无论如何,到目前为止,我们只展示了将整个图像分类为一类的示例。但在这幅图中,很明显在多个地点有多种车辆。我们训练的网络无法告诉我们这些。
这个经典问题叫做物体检测,或者在场景中定位物体。在这个例子中,我们看到的是几辆车的背面。我们的目标是探测它们。所以我们需要创建一个对象检测器来识别我们所关心的对象。现在,我们应该怎么做呢?
这次网络研讨会的主题是深度学习,那么深度学习呢?
太棒了。因此,如果我们要训练一个车辆探测器从后面识别汽车,它将需要大量的图像进行训练。现在,问题是我们的图像数据还没有裁剪到每辆车,这意味着乍一看,我们必须从头开始完成裁剪和标记所有图像的乏味任务。这个网络研讨会要开多长时间?
30分钟或更少。
我觉得我们做不到。除非我们有MATLAB。耶。我很抱歉。所以MATLAB有内置的应用程序来帮助你完成这个过程。首先,你可以快速浏览所有数据,并在场景中的对象周围绘制边界框。现在,即使这比手工裁剪更好,你也不想做100次或1000次。因此,如果你有一个视频或图像序列,MATLAB可以自动标记场景中的对象。
在视频的第一帧,我指定了物体的位置。MATLAB会在整个视频中跟踪它。就像这样,我有了数百个新的贴有标签的车尾,而不需要做100次。现在我们有了所有图像和我们关心的对象的边界框。同样,对于真实世界和健壮的解决方案,您将需要成千上万或数百万个对象示例。金宝搏官方网站想象一下,如果没有应用程序,手动操作。
回到深度学习。我们将使用CNN来训练物体检测器。我们完全可以导入一个预先训练好的CNN,就像我们之前做的那样,这完全可以工作。但是为了向你们展示一些新的东西,我们将从头开始创建一个CNN架构。所以我们不会实时输入所有内容,但是在MATLAB中从头开始创建CNN只是卷积、激活和拉层的问题——这是你之前谈到的三件事。
这就是我们在这里的顺序。你可以决定使用多少个过滤器。由于我们将所有这些代码都提供给您,请随意使用它,从头开始创建您自己的CNN。现在是时候训练我们的探测器了。用MATLAB的计算机视觉工具,我们实际上有几个物体检测器可供选择。好的是,你可以用相同的训练数据来选择任何一个。从这段代码中可以看到,你可以很简单地尝试所有这些方法,看看它们的效果如何。
我们有关于这些检测器的文档,它将提供在某些情况下使用哪种检测器的建议。所以如果你打算使用目标检测,一定要看一下这个。
是的。所以我们训练了我们的探测器。我们将在一个样本图像上尝试一下。你可以在这里看到结果。看起来不错。但为了让人印象更深刻的演示,让我们在视频中尝试一下。你可以看到,它在高速公路上行驶。它对所有汽车进行分类。非常漂亮。对于高级用户,您可以访问helper函数以更好地了解其性能。
以下是MATLAB如何通过内置应用程序快速标记数据,以及使用计算机视觉中的深度学习和其他工具训练算法,从而轻松地进行目标检测。总结一下,请记住,尽管我们在示例中使用了很多车辆,但MATLAB和深度学习并不局限于对车辆进行分类。所以无论是人脸,狗的品种,还是一个巨大的松鼠集合,你都可以用MATLAB轻松完成。
我想快速地介绍一下我们对深度学习解决回归问题的支持,这意味着您金宝app可以输出一个数值,而不是输出一个类或类别。我们有一些这样的例子,你可以检测道路上的车道边界。对于那些听腻了汽车的人,我们有一个预测面部关键点的软件,可以用来预测一个人的面部表情。
今天我们看到了一些用MATLAB和深度学习可以做的新事情。我们希望你能够清楚地看到MATLAB是如何使深度学习的艰巨任务变得更容易的。所以一定要查看我们网络研讨会中使用的所有代码,并在自己的数据上进行尝试。
如果你去Add On管理器,在那里你可以得到我们预先训练好的网络,你可以在同一个地方找到一些其他资源来启动和运行深度学习,包括一个视频,展示如何使用MATLAB通过网络摄像头快速对物体进行分类。
查看我们网站上的其他资源,开始学习深度学习,如果有任何问题,请发送电子邮件给我们image-processing@mathworks.com.
您也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。