我知道,这意味着我存在:计算机视觉深度学习的回顾(第1部分)

计算机视觉。 现在,他们谈论了很多,并在很多地方应用和实施了它。 不久以前,还没有关于Habré的CV评论文章,其中包括架构和现代任务的示例。 但是它们很多,而且真的很酷! 如果您不仅对研究和文章的观点感兴趣,而且对应用问题的观点感兴趣,都对计算机视觉现在正在发生的事情感兴趣,那么欢迎您。 此外,对于那些长期以来一直希望开始了解所有这些内容,但是有些事情已经成为现实的人来说,这篇文章可能是一个很好的介绍;)

图片

今天,在PhysTech上,“学院”与行业合作伙伴进行了积极的合作。 特别是,在应用数学和计算机科学物理技术学院 ,有来自Sberbank,Biocad,1C,Tinkoff,MTS,华为等公司的许多有趣的实验室

我受VkusVill开设的混合智能系统实验室的启发而撰写本文。 实验室的任务很艰巨-要建立一家没有收银台的商店,主要是借助计算机视觉。 在将近一年的工作中,我有机会从事许多视觉任务,这将在这两部分中进行讨论。

没有收银台的商店? 我已经在某个地方听到了..
亲爱的读者,您可能想到了Amazon Go 。 从某种意义上说,任务是重复他们的成功,但是我们的决定更多是关于实现,而不是关于从头开始花费很多钱来建立这样的商店。

我们将按照计划进行:

  1. 动机和正在发生的事情
  2. 分类为生活方式
  3. 卷积神经网络架构:实现一个目标的1000种方法
  4. 卷积神经网络的可视化:向我展示激情
  5. 我本人是一名外科医生:我们从神经网络中提取特征
  6. 保持紧密:为个人和个人学习学习
  7. 第2部分:在不扰流的情况下检测,评估姿势和识别动作

动机和正在发生的事情


该文章适用于谁?
本文将重点放在已经熟悉机器学习和神经网络的人们上。 但是,我建议您至少阅读前两部分-突然,所有内容都会变得很清楚:)

在2019年,每个人都在谈论人工智能, 第四次工业革命以及人类走向单一的方法 。 酷,很酷,但我想要细节。 毕竟,我们是好奇的技术人员,他们不相信关于AI的童话,我们相信正式的任务设定,数学和编程。 在本文中,我们将讨论使用非常现代的AI的特定情况-在各种计算机视觉任务中使用深度学习(即卷积神经网络)。

是的,我们将专门讨论网格,有时会从“经典”的角度提到一些想法(我们将在神经网络之前使用的视觉方法称为集合,但这绝不意味着现在不再使用它们)。

我想从头开始学习计算机视觉
我推荐Anton Konushin的课程“计算机视觉简介” 。 我个人经历了SHAD中的对应部分,这为理解图像和视频处理奠定了坚实的基础。

图片

我认为,神经网络在视觉中的第一个真正有趣的应用是Jan LeCun的 笔迹识别 ,该应用早在1993年就被媒体报道。 现在他是Facebook AI Research的主要AI之一,他们的团队已经发布了许多有用的Open Source资料

如今,视觉已在许多领域使用。 我仅举几个引人注目的示例:

图片
图片


特斯拉Yandex无人机

图片


医学影像分析癌症预测

图片


游戏机:Kinect 2.0(尽管它也使用深度信息,即RGB-D图片)

图片



人脸识别: Apple FaceID (使用多个传感器)

图片


面点评级: Snapchat口罩

图片


面部和眼睛运动的生物特征识别(以FPMI MIPT项目为例

图片


通过图像搜索:Yandex和Google

图片


图片中文字的识别光学字符识别

图片

图片


无人机和机器人:通过视觉接收和处理信息

图片

里程表 :移动机器人时制作地图并计划

图片


改善视频游戏中的图形和纹理

图片


图片翻译:Yandex和Google

图片

图片


增强现实: Leap Motion(Project North Star)Microsoft Hololens

图片



样式和纹理转移: PrismaPicsArt

更不用说在公司内部各种任务中的大量应用。 例如,Facebook还使用视觉来过滤媒体内容。 计算机视觉方法还用于工业中的质量/损坏测试

实际上,这里的增强现实必须受到特别关注,因为在不久的将来不起作用 ,这可能成为视觉应用的主要领域之一。

有动力。 已收费。 出发:

分类为生活方式



图片

就像我说的那样,在90年代,渔网已经被开除。 他们完成了一项特定任务-对手写数字图片进行分类的任务(著名的MNIST数据集 )。 从历史上看,分类图像的任务成为解决视觉中几乎所有后续任务的基础。 考虑一个具体的例子:

任务 :在入口处提供一个带照片的文件夹,每张照片都有一个特定的对象:猫,狗或人(即使没有“垃圾”照片,这也是一项超重要的任务,但您需要从某个地方开始)。 您需要将图片分解为三个文件夹: /cats/dogs/leather_bags /humans ,在每个文件夹中仅放置带有相应对象的照片。

什么是图片/照片?
图片
视觉上几乎所有地方都习惯使用RGB格式的图片。 每张图片的高度(H),宽度(W)和深度为3(彩色)。 因此,一个图片可以表示为尺寸为HxWx3的张量(每个像素是一组三个数字-通道中的强度值)。




想象一下,我们还不熟悉计算机视觉,但是我们知道机器学习。 图像只是计算机内存中的数字张量。 我们根据机器学习形式化任务:对象是图片,其符号是像素值,每个对象的答案是类别标签(猫,狗或人)。 这是纯粹的分类任务

如果现在变得困难..
...那么最好先阅读OpenDataScience ML开放课程的前4篇文章,然后阅读关于视觉的更具介绍性的文章,例如, 在Small ShAD中精彩演讲

您可以从“经典”视图或“经典”机器学习中采用某些方法,而不是神经网络。 基本上,这些方法包括突出显示图像特征的某些特征(特殊点)或局部区域的图像(“ 视觉单词袋 ”)。 通常,一切都归结为基于HOG / SIFT的 SVM

但是我们聚集在这里讨论神经网络,所以我们不想使用我们发明的信号,而是希望网络为我们做一切。 我们的分类器将对象的符号作为输入并返回预测(类标签)。 在这里,以像素为单位的强度值充当符号(请参见
以上的剧透)。 请记住,图片是大小张量(Height,Width,3)(如果是彩色的话)。 当学习进入网格时,通常不是通过一张图片而不是整个数据集来提供所有这些服务,而是通过批量服务,即 在对象的一小部分中(例如,批处理中有64张图像)。

因此,网络接收大小为(BATCH_SIZE,H,W,3)的输入张量。 您可以将每张图片“扩展”为H * W * 3个数字的矢量线,并像处理机器学习中的符号一样使用像素值进行操作,常规的多层感知器(MLP)可以做到这一点,但是坦率地说,基线,因为将像素用作向量行时未考虑图片中对象的平移不变性。 同一只猫可能在照片的中间,而在角落,MLP将不会学习此模式。

因此,您需要更智能的东西,例如卷积运算。 这是关于现代视觉,关于卷积神经网络

卷积网络训练代码可能看起来像这样(在PyTorch框架上)
 #    : # https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html import torch.nn as nn import torch.nn.functional as F import torch.optim as optim class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # get the inputs inputs, labels = data # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 print('Finished Training') 


从现在开始我们正在谈论与老师的培训 ,我们需要几个组件来训练神经网络:

  • 数据(已经存在)
  • 网络架构(重点)
  • 一个损失函数,它将告诉神经网络如何学习(这里将是交叉熵
  • 优化方法(将朝着正确的方向改变网络权重)
  • 定义架构和优化器超参数(例如,优化器步长,层中神经元数量,正则化系数)

这正是在代码中实现的;卷积神经网络本身在Net()类中进行了描述。

如果您想慢慢地并从一开始就了解捆绑和卷积网络,我建议您在深度学习学院(MIPT MIPT)(俄语)上就此主题进行演讲, 当然还建议在斯坦福大学的课程cs231n(英语)中进行演讲

深度学习学校-这是什么?
创新实验室FPMI MIPT的 深度学习学校是一个积极参与开发有关神经网络的开放式俄语课程的组织。 在本文中,我将多次参考这些视频教程

图片

简而言之,通过卷积运算,您可以根据图像的可变性在图像上找到图案。 实际上,当我们训练卷积神经网络(英文:Convolutional Neural Networks)时,我们发现了能很好地描述图像的卷积滤波器(神经元权重),因此我们可以从中准确地确定类别。 已经发明了许多方法来建立这样的网络。 超出您的想象...

卷积神经网络架构:实现一个目标的1000种方法



图片


是的,是另一篇建筑评论 。 但是在这里,我将尝试使其尽可能相关!

首先是LeNet ,它帮助Jan LeCun在1998年识别了数字。 这是第一个用于分类的卷积神经网络。 她的主要特征是她基本上开始使用卷积和池化操作。

图片

然后,网格的发展停滞了,但是硬件并没有停滞不前; 开发了基于GPU和XLA的有效计算。 在2012年,AlexNet出现了,她参加了ILSVRC( ImageNet大规模视觉识别挑战赛比赛

关于ILSVRC的一点题外话
ImageNet于2012年组装完毕,ILSVRC竞赛使用了数千张图片和1000个类别的子集。 ImageNet目前有约1400万张图片和21,841个类(从官方网站上获取),但对于比赛,它们通常通常只选择一个子集。 随后,ILSVRC成为最大的年度图像分类竞赛。 顺便说一句,我们最近在几分钟之内就确定了如何在ImageNet上进行训练

从2010年到2018年,在ImageNet(在ILSVRC中)上,他们获得了SOTA网络的图像分类。 的确,自2016年以来,本地化,检测和对场景理解(而非分类)的竞争更为相关。

通常,各种体系结构审查可以揭示从2010年到2016年在ILSVRC上进行的第一次审查,以及一些单独的网络。 为了不使故事混乱,我将它们放在下面的扰流板下面,试图强调主要思想:

2012年至2015年的建筑
年份文章关键思想机重
2012年亚历克斯网连续使用两个束; 将网络训练分为两个并行分支240兆字节
2013年Zfnet过滤器尺寸,层中过滤器数量--
2013年夸大其词首批神经网络检测器之一--
2014年Vgg网络深度(13-19层),使用多个卷积尺寸较小(3x3)的Conv-Conv-Pool块549MB(VGG-19)
2014年盗梦空间(v1)(aka GoogLeNet)1x1卷积(来自“ 网络中网络”的思想 ),辅助损失(或深度监控 ),几个卷积的输出堆叠(“初始块”)--
2015年Resnet残余连接 ,非常深(152层..)98 MB(ResNet-50),232 MB(ResNet-152)




所有这些架构的思想(除了ZFNet之外,通常很少提及)在视觉神经网络中是一个新词。 但是,在2015年之后,还有许多重要的改进,例如Inception-ResNet,Xception,DenseNet,SENet。 下面我试图将它们收集在一个地方。

2015年至2019年的建筑
年份文章关键思想机重
2015年初始版本v2和v3将包分解为包1xN和Nx192兆字节
2016年Inception v4和Inception-ResNetInception和ResNet的结合215兆字节
2016-17续接ILSVRC第二名,使用许多分支(“通用” Inception块)--
2017年Xception深度可分离卷积 ,重量更轻,精度可与Inception相提并论88兆字节
2017年密集网密块 轻巧但准确33 MB(DenseNet-121),80 MB(DenseNet-201)
2018年塞内特挤压和激励块46 MB(SENet-Inception),440 MB(SENet-154)


这些PyTorch的大多数模型都可以在这里找到,这真是太酷了

您可能已经注意到,整个设备的重量很大(我希望最大为20 MB,甚至更少),而如今,它们在各处使用移动设备,而物联网正变得越来越流行,这意味着您也希望在这里使用网格。

模型重量和速度之间的关系
由于自身内部的神经网络仅乘以张量,因此乘法运算的次数(读取:权数)直接影响工作速度(如果不使用劳动密集型的后处理或预处理)。 网络本身的速度取决于实现方式(框架),运行网络的硬件以及输入图像的大小。

许多文章的作者走了发明快速架构的道路,我在下面的破坏者中收集了他们的方法:


所有表格的数字均来自存储库的最高限额Keras Applications表格以及本文 的上限

您问:“为什么要写整个模型的“动物园”? 为什么要进行分类任务? 但是我们想教机器看,而分类只是一种狭窄的任务..”。 事实是,用于检测对象,评估姿势/点,重新识别和搜索图片的神经网络完全使用分类模型作为主干 ,成功的80%取决于它们。

但是我想以某种方式更加信任CNN,或者他们想到了黑匣子,但是“内部”的含义并不明显。 为了更好地了解卷积网络的功能机制,研究人员提出了可视化的用途。

卷积神经网络的可视化:向我展示激情


理解卷积网络内部正在发生的事情的重要一步是“可视化和理解卷积网络” 。 在其中,作者提出了几种方法来准确可视化不同CNN层中神经元的响应(在图片的哪些部分上)(我也建议观看有关此主题的斯坦福大学讲座 )。 结果令人印象深刻:作者表明,卷积网络的第一层通过边缘/角度/线的类型对某些“低级事物”做出响应,而最后一层已经对图像的整个部分做出了响应(请参见下图),也就是说,它们已经携带了本身有一些语义。

图片


此外, 康奈尔大学和公司的深度可视化项目进一步提高了可视化效果,而著名的DeepDream学会了以令人上瘾的有趣风格进行变形(下图来自deepdreamgenerator.com )。

图片


2017年, 在Distill上发表了一篇非常不错的文章 ,他们在其中对每个层“看到”的内容进行了详细分析,最近一次(2019年3月),Google发明了激活地图集 :可以为每个网络层构建的唯一地图,这使我们更加了解CNN工作的总体情况。



如果您想自己玩可视化,我建议您使用LucidTensorSpace

好吧,CNN似乎在一定程度上是正确的。 我们需要学习如何在其他任务中使用此功能,而不仅仅是在分类中。 这将帮助我们提取Embedding'ov图片和转移学习。

我本人是一名外科医生:我们从神经网络中提取特征


想象有一张图片,我们想找到一个看起来像它的图片(例如,这是在Yandex.Pictures中搜索图片)。 以前(在神经网络之前),工程师习惯于为此手动提取特征,例如,发明一种能够很好地描述图片并使其与其他图片进行比较的东西。 基本上,这些方法( HOGSIFT )使用图像梯度进行操作,通常将这些方法称为“经典”图像描述符。 特别感兴趣的是,我指的是这篇文章以及Anton Konushin课程 (这不是广告,只是一门好课程:)

图片


使用神经网络,我们不能自己发明这些功能和启发式方法,而是要适当地训练模型,然后将一层或多层网络的输出作为图片的标志

图片

仔细研究所有体系结构,可以清楚地看出,在CNN中分类有两个步骤:
1)。 特征提取器层,用于使用卷积层从图像中提取信息特征
2)。 在这些功能之上学习全连接(FC)分类器层

图片


图像(特征)的嵌入几乎是一个事实,您可以在卷积神经网络的特征提取器之后采用它们的标志(尽管它们可以以不同的方式聚合),作为对图像的丰富描述。 也就是说,我们对网络进行了分类训练,然后在分类层的前面出口。 这些标志称为特征神经网络描述符或图片嵌入 (尽管NLP通常接受嵌入,因为这是视觉,所以我经常会说特征 )。 通常,这是某种数字矢量,例如128个数字,您已经可以使用它们。

但是自动编码器呢?
是的,事实上,功能可以通过自动编码器获得。 在我的实践中,他们以不同的方式做到了这一点,但是,例如,在有关重新识别的文章(将在后面讨论)中,他们仍然经常在提取器之后使用功能,而不是为此训练自动编码器。 在我看来,如果问题是什么效果更好,则有必要在两个方向进行实验。

因此,可以简单地安排用于解决按图片搜索问题的管道:我们通过CNN运行图片,从所需层获取标志,并从不同图片中将这些特征彼此进行比较。 例如,我们仅考虑这些向量的欧几里德距离。

图片


转移学习是一种有效训练神经网络的众所周知的技术,已经在特定数据集上对其神经网络进行了训练。 他们经常说精调,而不是转移学习,在斯坦福课程笔记cs231n中,这些概念是共享的,他们说,转移学习是一个普遍的想法,而精调是该技术的一种实现。 这对我们将来并不那么重要,主要是要了解我们可以训练网络以在新数据集上进行良好的预测,而不是从随机权重开始,而要从在某些大型ImageNet类型上训练的权重开始。 当数据很少并且您想定性解决问题时,尤其如此。

了解有关转学的更多信息

但是,例如,对于搜索相似的人/人/特定事物的任务,仅采取必要的功能并从数据集到数据集进行额外的训练可能是不够的。 有时从视觉上看同一个人的照片可能比不同人的照片更为相似。 即使我们很难用眼睛做到这一点,也必须使网络准确地突出一个人/物体固有的那些标志。 欢迎来到表示学习的世界。

保持紧密:为个人和个人学习学习


术语注释
如果您阅读科学文章,有时似乎有些作者对度量学习一词的理解会有所不同,并且对于哪种度量学习方法没有共识。 这就是为什么在本文中,我决定避免使用该特定短语,而是使用更合理的表示法学习 ,一些读者可能不同意这一点-我很乐意在评论中进行讨论。

我们设置任务:

  • 任务1 :有一个画廊(一组),上面有人们的面孔照片,我们希望网络能够根据一张新照片做出回应,或者以画廊中某人的名字作为响应(假设是这样),或者说画廊中没有这样的人(也许,我们添加了新人)

  • 任务2 :同一件事,但我们的工作不是处理人脸照片,而是处理大量人员



通常,第一个任务是人脸识别 ,第二个任务是重新识别 (缩写为Reid )。 我将它们组合成一个块,因为它们的解决方案现在使用类似的思想:为了学习可以应付相当困难的情况的有效图像嵌入,如今​​它们使用了不同类型的损耗,例如三重损耗四重损耗对比中心损失余弦损失



仍然有很棒的暹罗 网络 ,但老实说我自己并没有使用它们。 顺便说一句,不仅是损失本身在“决定”,而且是如何对正负进行抽样 ,《 抽样研究》的作者强调了深度嵌入学习

所有这些损失和连体网络的本质很简单-我们希望要素(嵌​​入)的潜在空间中一类(人)的图片“接近”,而不同类(人)的潜在空间中的图片“远”。 接近度通常按以下方式测量:嵌入来自神经网络的图像(例如,128个数字的向量),我们要么考虑这些向量之间通常的欧几里得距离 ,要么考虑余弦距离。 如何衡量最好在数据集/任务上进行选择。

关于表示学习的问题解决管道的示意图表示如下:



但更确切地说,像这样
: (Softmax + CrossEntropy), (Triplet, Contrastive, etc.). positive' negative'

: - , — . , — - , (, ). .


有几篇专门针对人脸识别的好文章:评论文章(必须阅读!FaceNetArcFaceCosFace

图片


还有很多实现:dlibOpenFaceFaceNet存储库在Habré上已经有很长一段时间被告知了似乎最近才添加了ArcFace和CosFace(在注释中写,如果我在这里错过了一些内容,我将很高兴知道其他内容)。

但是,现在更时尚的是不识别面孔,而是生成面孔,不是吗?


反过来,重新识别任务现在正在进行中,每个月都会发表文章,人们尝试不同的方法,某些事情现在正在起作用,某些事情仍然不是很好。



我将通过一个例子来说明里德问题的实质:一个画廊里有很多人,例如10个人,每个人有5个庄稼(可以来自不同侧面),也就是说,画廊里有50张照片。一个新的侦探(作物)来了,我必须说出画廊里是什么样的人,或者说他不在那儿,并为他创建一个新的ID。由于人类的检测来自不同的角度:前,后,侧面,底部和照片所来自的相机也不同(不同的照明/白平衡等),因此使任务变得复杂



顺便说一句,里德(Reid)是我们实验室中的关键任务之一。确实有很多文章问世,其中一些是关于一种新的,更有效的损失,有些只是关于一种获得负面和正面损失的新方法。2016年的一篇文章

对旧的Reid方法进行很好的回顾现在,正如我在上面所写,应用了两种方法-分类或表示学习。但是,这个问题存在一个特殊性,研究人员以不同的方式来解决它,例如,Aligned Re-Id的作者提出以一种特殊的方式来对准要素(是的,他们能够使用动态编程来改善网络,Karl),在另一篇文章中,他们建议使用Generative Adversarial Networks(GAN) )

还有一些技巧。


图片


减激励器
, , -, . , - , , , . — !


在这些实现中,我肯定会提到OpenReidTorchReid注意代码本身-在我看来,从框架的体系结构的角度来看,它是正确编写的,更多详细信息请参见此处另外,它们都在PyTorch上,并且自述文件中有许多指向“人员重新识别”的文章的链接,这很好。

总的来说,现在中国对面部算法和里德算法有特殊的需求(如果您知道我的意思)。我们上线了吗?谁知道...

关于神经网络加速的一句话


我们已经说过,您可以提出一种轻量级的体系结构。但是,如果网络已经过训练并且很酷,但是您仍然需要对其进行压缩,该怎么办?在这种情况下,以下一种(或全部)方法可能会有所帮助:


好吧,规则不是使用float64,而是,例如,没有人取消float32。甚至最近有一篇关于低精度训练的文章顺便说一下,最近,Google推出了MorphNet,它(某种程度上)有助于自动压缩模型。

接下来是什么?



图片


我们确实讨论了DL和CV中的许多有用和应用的内容:分类,网络体系结构,可视化,嵌入。但是,在现代视觉中,还有其他重要任务:检测,分割,对场景的理解。如果我们在谈论视频,那么我想及时跟踪对象,识别动作并了解视频中正在发生的事情。正是由于这些原因,第二部分将专门讨论。

敬请期待!

PS:PMI MIPT物理学院现在提供什么样的教育?
(, , ), , , . . , , ( ).

Source: https://habr.com/ru/post/zh-CN450732/


All Articles