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