首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
人脸检测,卷积神经网络看见了什么www.64222.com:
发布时间:2020-01-24 19:33
浏览次数:

www.64222.com 1

英文原文请点这里

这是众多卷积神经网络可视化方法之一,方法来自于论文《Learning Deep Features for Discriminative Localization》,论文译文在[翻译]Learning Deep Features for Discriminative Localization。

目前人脸识别技术已经遍地开花,火车站、机场、会议签到等等领域都有应用,人脸识别的过程中有个重要的环节叫做人脸检测,顾名思义就是在一张图片中找出所有的人脸的位置,早期的人脸检测是用人工提取特征的方式,训练分类器,比如opencv中自带的人脸检测器使用了haar特征,早期的这种算法自然是鲁棒性、抗干扰性太差,本文主要来介绍近几年的几种用卷积神经网络做的经典算法。

译者 | 王柯凝

摘要 在这项工作中, 我们重新审视了《 Network in network》中提出的全局平均 池化层(global average pooling),并阐明了它是如何通过图片标签就能让卷积神经网络具有卓越的定位能力。虽然这项技术以前被当做正则化训练的一种方法,但是我们发现它实际构建了一种通用的适用于各种任务的能定位的深度表示。尽管global average pooling很简单,我们仍然能够在2014年的ILSVRC物体定位比赛中得到37.1%的top-5错误率,与CNN的34.2%top-5错误率非常接近。我们证明了我们的网络能在各种任务中区分图像区域进行定位,尽管没有经过训练。

这篇文章的核心思想是提出了一种叫Class Activation Mapping的方法,可以通过它将CNN在分类时“看”到的东西可视化出来。它的原理是:CNN的卷积层包含大量位置信息,使其具有良好的定位能力,但是全连接层使这种能力丧失,如果只保留最后一个用于分类的全连接层(特指softmax),把其余全连接层替换成全局平均池化层(Global Average Pooling)层,就可以保留这中定位能力,把最后一个softmax层各个单元的权重与最后一个卷积层的输出相乘,绘制热成像图,得到的结果就是一个类激活图。

1、Compact Cascade CNN

www.64222.com 2效果图

论文链接:https://arxiv.org/abs/1508.01292github链接:https://github.com/Bkmz21/FD-Evaluation论文特点:识别人脸速度快!!!网络参数少,所以贼快。

这是一篇2015年的来自俄罗斯托木斯克理工大学的论文,针对快速人脸检测任务。

www.64222.com 3论文原名该算法核心网络结构:为了快,该网络结构参数少,分为三个stage, 依次有797, 1,819 和 2,923 个参数,使用的是TanH激活,因为网络太小ReLU不好使。而且为了速度,作者使用了近似函数来逼近TanH。www.64222.com 4简单粗暴的网络结构使用近似函数来逼近TanH:www.64222.com 5论文所用TanH激活函数公式

该算法流程图:首先是输入一张灰度图片,构成图像金字塔。然后通过stage1后会产生候选单元。

www.64222.com 6流程图NMS算法是从多个定位框中合并一些框,如图:www.64222.com 7NMS然后候选单元进入stage2和stage3(CNN2和CNN3),通过以下公式判断是否是人脸(CNN2和CNN3的输出结果进入decision rule)。www.64222.com 8decision rule实验结果(详细数据请参考原文):www.64222.com 9result onewww.64222.com 10result twowww.64222.com 11result three总结:这是一种轻量级的快速人脸检测算法,也就是说在计算资源较小的情况下也能实现,并且快。缺点当然就是没有特别准。

出品 | AI科技大本营(公众号ID:rgznai100)

1 Introduction

最近Zhou等人的《Object detectors emerge in deep scene cnns》表明CNN的各个层的卷积单元实际上是物体检测器,尽管没有对物体的位置进行监督。尽管卷积层定位物体的能力很出色,但当用全连接层进行分类时,这种能力会丧失。最近,一些流行的全连接层和卷积层的神经网络,比如Network in Network和GoogLeNet,已经提出通过避免使用全连接层的方式来最小化参数并且保持高性能的方法。

为了实现这一目标,NIN使用global average pooling来做正则化,避免训练过程中的过拟合。在我们的实验中,发现global average pooling的优势远不止正则化——实际上,只需要稍微调整一下,网络就可以保持卓越的定位能力,直到最后一层。这样的微调使辨别图像区域变得十分简单,即使对那些最初没训练的网络也是如此。如图1所示,在物体分类上训练的CNN能够成功的将动作分类的区分区域定位为与人类交互的物体而非人类本身。

www.64222.com 12图1. 简单修改的global average pooling层结合我们的class activation mapping技术使训练过的分类CNN既能分类又能定位每类图具体的分类区域,比如brushing teeth中的toothbrush和cutting trees中的chainsaw

尽管我们的方法显得很简单,在ILSVRC的弱监督物体定位比赛中,我们最好的网络在测试集中达到了37.1%的top-5错误率,这与全监督的AlexNet达到的34.2%top-5错误率极其接近。此外,我们还证明所提方法中的深度特征可以很容易地用于其他数据集的分类、定位和概念发现(concept discovery)。

卷积神经网络在视觉识别任务中有着令人印象深刻的表现。近期的研究表明,尽管在图片级的标签上训练,CNN在定位上也有着卓越的能力。本文中,我们证明了只要使用正确的架构,就能将这种能力泛化到不仅仅是定位物体,而是标定图片中具体哪一个区域正在用于分辨物体。这里,我们讨论与这些研究最相关的两条主线:弱监督对象定位和可视化CNN的内部表示。

弱监督物体定位(Weakly-supervised object localization) 最近已经有很多用CNN做弱监督定位的研究了。Bergamo等人提出了一种“自己学习的(self-taught)”物体定位方法,为了实现物体定位,通过掩盖图片区域来寻找引起最大激活的区域。Cinbis等人用CNN特征结合多实例的学习定位物体。Oquab等人提出了一种能转换中级图像的方法,并且展示了一些物体的定位能通过评估CNN在多重叠区域的输出实现。但是,这些作者并没有对定位能力做评估。此外,这些方法虽然产生了想要的结果,但并不是端到端的训练,需要提前做一系列额外工作,然后输入网络来定位物体,这使它们很难泛化到真实世界的数据集。我们的方法是一个端到端的,而且只需要输入图片就可以定位物体。与我们的方法最相近的是Oquab提出的基于global max pooling的方法。不同于global average pooling,他们用global max pooling来定位物体的点。但是,它们的定位局限于物体边缘的点,而不是确定物体的全部范围。我们认为虽然max和average很相似,但是平均池化更鼓励网络识别完整的物体区域。背后的原理是average pooling网络相比于max pooling识别整个物体的辨别性区域的损失更小。在3.2部分有详细的说明及验证试验。此外,不同于Oquab,我们证明了这种定位能力能够泛化,甚至能用于侦测网络没有训练过的数据。我们使用class activation map来代表每个图中的激活图的权重,如第2部分所述。我们想要强调的是,global average pooling不是我们提出来的新技术,我们的创新点在于用它来精确定位区别性区域(discriminative localization)。我们相信,这种简单的技术可移植性很好,能应用于快速精确地解决很多计算机视觉中的定位问题。可视化卷积神经网络: 最近有很多关于可视化卷积神经网络内部的研究,试图对其属性有更好的表现。Zeiler等人用反卷积网络来可视化激活每个单元的模式。Zhou等人发现CNNs被训练识别场景时会学习物体侦测,并证明了统一网络既能进行场景识别,又能进行物体定位。这些研究都只分析了卷积层,忽略了全连接层,因此是不全面的(国外论文好文艺,原文如是描述:thereby painting an incomplete picture of the full story)。通过移除全连接层并尽可能保持性能,能从头到尾更好的了解我们的网络。Mahendran等人和Dosoviskiy等人通过转化不同层的深度特征分析了CNN的可视化解码。虽然这些方法可以转化全连接层,但是只展示了深层特征中什么信息被保留,并没有凸显出这些信息的相对重要性。不同于Mahendran和Dosoviskiy,我们的方法你能凸显出图片的那个区域是区别性区域。总的来说,我们的方法是对CNN的另一种深入呈现。(又是很文艺的说法:our approach provides another glimpse into the soul of CNN)

这一部分,我们描述了用CNN的global average pooling生成class activation maps的过程。某一确切分类的CAM代表了CNN用于做分类时所看的区别性区域的位置。生成CAM的过程如图2。

www.64222.com 13图2 CAM:预测的类别分数被映射回先前的卷积层以生成类别激活图,CAM凸显了特定类的区别性区域www.64222.com 14图3 ILSVRC中四个分类的CAM图。这些图将图片中用于分类的区别性区域高亮标记,例如,hen和briard的头,barbell上的圆盘,我们使用了与Network in Network和GoogLeNet相似的网络结构——网络的大部分都是卷积层,只在输出层前(用于分类的softmax)使用global average pooling层,并将它们作为得出分类的全连接层的特征。通过这种简单的连接结构,我们可以把图片中的重要区域用输出层权重映射回卷积层特征的方式标记出来,我们称这种技术为类激活映射。如图2所示,全局平均池化层输出最后一个卷积层的每个单元的特征图(feature

举个例子,假设图片经过最后一个卷积层的shape为(14,14,512),第一维和第二维代表宽高,第三维代表卷积层深度,softmax层的shape为,第一维代表unit数,第二维代表分类数,想得到某一个类的类激活图,就用通过最后一个卷积层的矩阵乘以sotfmax某类的矩阵,即(14,14,512)的矩阵乘以的矩阵,得到的矩阵,也就是那个类的类激活图,下面是类激活图

2、MTCNN(多任务级联卷积神经网络用于人脸检测与对准 )

代码链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment这是2016年中国科学院深圳先进技术研究院的文章,同样用于人脸检测任务,跟上文所述Compact Cascade CNN类似,该算法网络也采用了三个级联的网络,接下来看看具体的流程。MTCNN算法流程:首先,给定图像,我们首先将其调整到不同的比例,以构建图像金字塔,这是三级网络框架的输入。

Stage 1:使用的P-Net是一个全卷积网络,通过浅层的CNN用来生成候选窗极其边框回归向量。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制合并重叠的候选框。

Stage 2:使用N-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。

Stage 3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。

www.64222.com 15pipline网络结构介绍:www.64222.com 16整体网络结构www.64222.com 17P-Netwww.64222.com 18R-Netwww.64222.com 19O-Net

pytorch实现网络结构代码(需要注意,略有不同的是,代码中的P-Net和R-Net没有输出网络结构中的Facial landmark localization):

import torchimport torch.nn as nnimport torch.nn.functional as Ffrom collections import OrderedDictimport numpy as npclass Flatten(nn.Module): def __init__: super(Flatten, self).__init__() def forward: """ Arguments: x: a float tensor with shape [batch_size, c, h, w]. Returns: a float tensor with shape [batch_size, c*h*w]. """ # without this pretrained model isn't working x = x.transpose.contiguous() return x.view, -1)class PNet(nn.Module): def __init__: super(PNet, self).__init__() # suppose we have input with size HxW, then # after first layer: H - 2, # after pool: ceil/2), # after second conv: ceil/2) - 2, # after last conv: ceil/2) - 4, # and the same for W self.features = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(3, 10, 3, 1)), ('prelu1', nn.PReLU, ('pool1', nn.MaxPool2d(2, 2, ceil_mode=True)), ('conv2', nn.Conv2d(10, 16, 3, 1)), ('prelu2', nn.PReLU, ('conv3', nn.Conv2d(16, 32, 3, 1)), ('prelu3', nn.PReLU self.conv4_1 = nn.Conv2d(32, 2, 1, 1) self.conv4_2 = nn.Conv2d(32, 4, 1, 1) #net = self() weights = np.load('src/weights/pnet.npy')[()] for n, p in self.named_parameters(): #pass p.data = torch.FloatTensor(weights[n]) def forward: """ Arguments: x: a float tensor with shape [batch_size, 3, h, w]. Returns: b: a float tensor with shape [batch_size, 4, h', w']. a: a float tensor with shape [batch_size, 2, h', w']. """ x = self.features a = self.conv4_1 b = self.conv4_2 a = F.softmax return b, aclass RNet(nn.Module): def __init__: super(RNet, self).__init__() self.features = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(3, 28, 3, 1)), ('prelu1', nn.PReLU, ('pool1', nn.MaxPool2d(3, 2, ceil_mode=True)), ('conv2', nn.Conv2d(28, 48, 3, 1)), ('prelu2', nn.PReLU, ('pool2', nn.MaxPool2d(3, 2, ceil_mode=True)), ('conv3', nn.Conv2d(48, 64, 2, 1)), ('prelu3', nn.PReLU, ('flatten', Flatten, ('conv4', nn.Linear), ('prelu4', nn.PReLU self.conv5_1 = nn.Linear self.conv5_2 = nn.Linear weights = np.load('src/weights/rnet.npy')[()] for n, p in self.named_parameters(): p.data = torch.FloatTensor(weights[n]) def forward: """ Arguments: x: a float tensor with shape [batch_size, 3, h, w]. Returns: b: a float tensor with shape [batch_size, 4]. a: a float tensor with shape [batch_size, 2]. """ x = self.features a = self.conv5_1 b = self.conv5_2 a = F.softmax return b, aclass ONet(nn.Module): def __init__: super(ONet, self).__init__() self.features = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(3, 32, 3, 1)), ('prelu1', nn.PReLU, ('pool1', nn.MaxPool2d(3, 2, ceil_mode=True)), ('conv2', nn.Conv2d(32, 64, 3, 1)), ('prelu2', nn.PReLU, ('pool2', nn.MaxPool2d(3, 2, ceil_mode=True)), ('conv3', nn.Conv2d(64, 64, 3, 1)), ('prelu3', nn.PReLU, ('pool3', nn.MaxPool2d(2, 2, ceil_mode=True)), ('conv4', nn.Conv2d(64, 128, 2, 1)), ('prelu4', nn.PReLU, ('flatten', Flatten, ('conv5', nn.Linear(1152, 256)), ('drop5', nn.Dropout, ('prelu5', nn.PReLU) self.conv6_1 = nn.Linear self.conv6_2 = nn.Linear self.conv6_3 = nn.Linear weights = np.load('src/weights/onet.npy')[()] for n, p in self.named_parameters(): p.data = torch.FloatTensor(weights[n]) def forward: """ Arguments: x: a float tensor with shape [batch_size, 3, h, w]. Returns: c: a float tensor with shape [batch_size, 10]. b: a float tensor with shape [batch_size, 4]. a: a float tensor with shape [batch_size, 2]. """ x = self.features a = self.conv6_1 b = self.conv6_2 c = self.conv6_3 a = F.softmax return c, b, a

模型训练阶段:人脸检测这就是一个分类任务,使用交叉熵损失函数:

www.64222.com 20交叉熵损失函数边框回归使用平方和损失函数:www.64222.com 21边框回归使用平方和损失函数人脸特征点定位也使用平方和损失函数:www.64222.com 22人脸特征点定位也使用平方和损失函数我们在整个CNN框架上有多种不同的任务,不是每一种任务都需要执行以上三种损失函数的,比如判断背景图片是不是人脸的时候,只需要计算det的损失函数,α表示任务的重要性,所以定义如下函数:www.64222.com 23多任务训练

实验结果(详细分析请参考论文原文):

www.64222.com 24实验结果

用上边pytorch的代码跑了一下(测试了一张只有一个人脸的图片):输出了一些O-Net的face classification、bounding box regression和Facial landmark localization,输出依旧是5 * 2、5 * 4、5 * 10的Variable(至于为什么都是5,待我搞清楚再更新...),如下图:

www.64222.com 25关注图片中的三个输出的Variable就好pytorch版本开源代码:https://github.com/TropComplique/mtcnn-pytorch**结论:**同时提高了人脸检测的速度和精度。**参考文献:**1、https://blog.csdn.net/tinyzhao/article/details/532361912、https://blog.csdn.net/tinyzhao/article/details/532361913、https://www.zhihu.com/question/28748001

【 AI 科技大本营导读】目前,计算机视觉是深度学习领域最热门的研究领域之一。计算机视觉实际上是一个跨领域的交叉学科,包括计算机科学(图形、算法、理论、系统、体系结构),数学(信息检索、机器学习),工程学(机器人、语音、自然语言处理、图像处理),物理学,生物学和心理学等等。许多科学家认为,计算机视觉为人工智能的发展开拓了道路。

map)的平均值。这些值的加权总和用于生成最后的输出。也可以说,我们计算最后一个卷积层特征图的加权总和来获得我们的CAM。我们在下面用更规范的方式描述softmax的情况。同样的技术可以用于其他的回归函数或损失函数。对于一个给定的图,用fk代表最后一个卷积层在空间坐标中单元k的激活值。然后,对于每个单元k,通过GAP后的结果Fk为∑x,yfk。则,对于每个类c,输入softmax的Sc为∑kwc,kFk,wc,k代表单元k对应的类c的权重。实际上,wc,k就是Fk对类c的重要性。最后类c的sotfmax输出Pc为exp/∑cexp。这里我们忽略偏差项:我们明确地把softmax的偏差项设置为0因为它几乎对分类表现没有影响。把Fk=∑x,yfk带入Sc,得www.64222.com 26公式1我们用Mc定义类别c的CAM,则空间每个元素为www.64222.com 27公式2则Sc

∑x,yMc,所以Mc直接表明了把空间网格激活对图片划分为类别c的的重要性。根据先前的研究,直观地讲,我们都希望用一些可视化方法看到每个被激活的单元的激活区域,fk就是这种可视化方法。CAM简单说就是不同空间区域的线性加权可视化。将类激活图的大小改变成输入图片的大小,就能清楚地看出与特定类最相关的区域。图3展示了一些CAM输出的用例,可以看到不同类的区别性区域已经高亮。在图4,我们展示了同一张图用不同类别的c生成的CAM图的不同之处。我们发现即使是同一张图,对不同类的区别性区域也不同。这说明我们的方法与预期一样。我们在前面的部分证明了这一点。www.64222.com 28图4 同一张图片的top-5预测类生成的CAM图。预测的类和是该类的概率在CAM图上方。我们发现预测为各个类的高亮区域都不同,比如dome激活了上半部分而palace激活的是下半部分。

全局平均池化层VS全局最大池化层:鉴于之前有的研究使用GMP做弱监督物体定位,我们认为很有必要直观地对比一下GAP和GMP的高亮区域的不同。比起GMP的鼓励网络只关注1个discriminaltive part,GAP更鼓励网络识别对象的整个范围。因为当求平均数时,这个值可以通过找所有discriminative part来最大激活而低激活减少了特定的输出。另一方面,对于GMP,所有图的低分区域(除了最有区分力的一个),都不会对得分有影响,因为你只取了max。我们在第三部分用ILSVRC数据集验证了此想法:GMP的分类性能与GAP相当,GAP的定位能力要强于GMP。

在这一部分,我们在ILSVRC2014数据集上评估了CAM的定位能力。我们先描述了实验的设置和用到的CNN网络,见3.1部分。然后在3.2部分验证了我们的技术不会在学习定位时对网络产生不利影响,并详细给出了弱监督对象定位的结果。

www.64222.com 29司机驾驶状态分类

作者:东北大学 张俊怡

那么什么是计算机视觉呢? 这里给出了几个比较严谨的定义:

3.1 Setup

我们用下面这些流行的CNN网络评估CAM的影响:AlexNet,VGGnet和GoogLeNet。通常来讲,我们把这些网络的全连接层全部移除,替换为GAP,然后接一个softmax全连接层。我们发现GAP前的最后一个卷积层有较高空间分辨率时网络的定位能力可以得到改善,我们之称为图分辨率(mapping resolution)。为了做到这一点,我们移除了一些网络的卷积层。具体来说,我们做了下面改动:对AlexNet,我们移除conv5之后的卷积层(pool5到prob),得到图分辨率(mapping resolution)为13x13。对VGGnet,我们溢出了conv5-3后的所有卷积层(pool5到prob),得到14x14的图分辨率。对GoogLeNet,我们溢出了inception4e后的卷积层(pool4到prob),得到14x14的图分辨率。对上述的每个网络,我们都添加一个3x3,步长为1,padding为1,1024个单元的卷积层,然后接一个GAP层和一个softmax层。最后对每个网络在ILSVRC的1.3M张要分成1000类的训练图片进行精调(fine-tuned),分别产生我们最终的AlexNet-GAP,VGGnet-GAP和GoogLeNet-GAP。对于分类,我们与原始的AlexNet,VGGnet和GoogleNet与做了比较,也提供了Network in Network的结果。对于定位,我们与原始的GoogLeNet和NIN进行了比较,还用反向传播代替了CAM。此外,为了比较average pooling和max pooling,我们也提供了用max pooling训练的GoogLeNet的结果(GoogLeNet-GMP)。我们使用一样的误差矩阵(top-1,top-5)作为ILSVRC对分类和定位的评估指标。对于分类,我们对ILSVRC的验证集进行了评估,对于定位,我们在验证集和测试集上都做了评估。

论文中提到最后一个卷积层输出的分辨率越高,定位能力越强,得到的CAM图越好。对应的处理方法就是不仅要砍掉全连接层,还要砍掉一些卷积层,使分辨率控制在14左右。下面是论文中图,与上图最大差别就是有红色,原因可能是分辨率问题,也可能单纯是颜色表示问题,还需要进一步实验确定,但是并不影响可视化,分类准确率也在90%以上。

✦ “对图像中的客观对象构建明确而有意义的描述”(Ballard&Brown,1982)

3.2 Results

我们先提供了在分类上的结果,以证明我们的方法没有对分类性能产生明显的不良影响。然后我们有证明了我们的方法在弱监督物体定位上十分有效。分类:Tb.1总结了原始网络与我们的GAP网络的分类性能。我们发现多数情况下从各个网络中移除多余的网络层使分类性能下降了1%~2%。我们观察到AlexNet是移除全连接层后分类性能受影响最大的网络。作为补偿,我们在它的GAP层前添加了两个卷积层,得到AlexNet-GAP网络。我们发现AlexNet-GAP与AlexNet的性能相当。因此,总体而言,我们的GAP网络很大程度地保留了网络的分类性能。此外,与预期的一样,我们观察到GoogLeNet-GAP和GoogLeNet-GMP的分类性能相似。注意,为了在定位上得到好的表现,网络的分类性能很重要,因为它决定了网络是否能准确地分类和定位的边界。

www.64222.com 30Table 1

定位:为了做定位,我们需要生成一个边界框及其关联的物体类别。为了生成CAM的边界框,我们使用简单阈值来划分热力图。我们先用大于CAM最大值的20%的值做一个边框,然后我们再用覆盖分割图中最大连通分量做一个边框。我们把预测的top-5全部如此标记出来。图6展示了用这项技术生成的示例边框。在ILSVRC验证集上的定位性能见Tbl2,输出示例图见图5。

www.64222.com 31Table 2www.64222.com 32图5. CNN-GAPs的CAM和特定类的反向传播方法www.64222.com 33图6 GoogLeNet-GAP的定位示例

我们观察到我们的GAP网络表现优于所有使用GoogLeNet-GAP的方法,达到了top-5上最低定位错误率43%,没有用任何一个带标注的边界框上训练就能达到这样表现的网络是前所未有的。我们也可以看到CAM方法明显优于反向传播的方法(比较结果见图6。此外,我们发现GoogLeNet-GAP比GoogLeNet的定位性能更好,尽管得到的分类没有GoogLeNet好。我们是认为GoogLeNet的低分辨率导致它丢失了精确地定位能力。最后,我们发现GoogLeNet-GAP比GoogLeNet-GMP表现更杰出,它的合理范围说明了average pooling在识别物体范围上比max pooling更重要。

www.64222.com 34图6 使用GoogLeNet-GAP的定位与使用AlexNet反向传播的定位比较。真实框为绿色,预测的框为红色

为了进一步比较我们的方法与现有的弱监督和全监督CNN方法,我们评估了GoogLeNet-GAP在ILSVRC的测试集上的表现。使用一个稍微不同于上的边界框选择策略:我们选择两个边界框,一个从top 1st和2nd预测类的CAM中选择,一个从top 3rd预测类的CAM中选择。我们发现这种启发式方法对改善验证集表现很有帮助,表现在表3种陈列。启发式的弱监督GoogLeNet-GAP在达到top-5错误率37.1%,与全监督的AlexNet十分接近。虽然令人印象深刻,但如果想用同样的结构得到与全监督的网络相同的性能,还有的路要走(如,弱监督的GoogLeNet-GAP vs 全监督的GoogLeNet)。

www.64222.com 35Table 3

www.64222.com 36狗分类

✦ “从一个或多个数字图像中计算三维世界的特性”(Trucco&Verri,1998)

4 Deep Features for Generic Localization

CNN的更高层(比如AlexNet的fc6,fc7)已经被证明能提取到很有效的通用特征(generic features),其在各种个图片数据集上都有极好的性能。这里,我们证明了我们的GAP CNN学到的特征可以很好地作为通用特征,识别出用于分类的区别性区域,尽管没有针对这些特定任务进行训练。为了得到与softmax层相似的权重,我们在GAP的输出上简单训练了一个SVM。首先,对比我们的方法与一些基准模型在下面场景及物体分类任务中的表现:SUN397 [27], MIT Indoor67[18], Scene15 [11], SUN Attribute [17], Caltech101[6], Caltech256 [9], Stanford Action40 [28], andUIUC Event8 [12]。实验设置与B. Zhou, A. Lapedriza, J. Xiao, A. Torralba, and A. Oliva.Learning deep features for scene recognition using places database. In Advances in Neural Information Processing Systems,2014.一样。表5对比了我们最好的网络GoogLeNet-GAP提取的特征与AlexNet的fc7提取的特征和GoogLeNet的ave pool提的特征比较。

www.64222.com 37表5与预期一样,GoogLeNet-GAP和GoogLeNet的表现明显优于AlexNet。同时,我们也发现GoogLeNet-GAP和GoogLeNet表现相近,尽管前者含有更少的卷积层。总的来说,我们发现GoogLeNet-GAP的特征与最先进的技术提取的特征不相上下。更重要的是,我们想探究使用我们的CAM技术生成的定位图是否比GoogLeNet-GAP更具有信息性,即使在这种情况下也是。图8展示了各种数据集下生成的例图。我们发现所有数据中大多数区别性区域都被高亮标出。总体来说,我们的方法在一般任务中可以有效地生成能定位的深度特征。在4.1部分,我们将探索鸟类的更细粒度的识别,并展示我们如何评估定位能力,使用它进一步提高性能。4.2部分证明了GoogLeNet-GAP可以用于从图片中提取通用视觉模式。

在这一部分,我们将提取到的通用定位深度特征用于在CUB-200-2011数据中识别200种鸟类。这个数据集包含11788张图片,5994张训练集,5794张测试集。我们选择这个数据集是因为它也包含边界框注解,能让我们评估我们定位的能力。表4总结了结果。

www.64222.com 38表4

我们发现,GoogLeNet-GAP与现有方法表现相当,在没有用任何带边界标记的数据训练过的情况下得到了全图(full-image)63%的准确率。使用边界框训练时,准确率增加至70.5%。现在,给出我们网络的定位能力,可以用3.2部分的方法先标出训练集和测试集中鸟的边界框,然后我们用GoogLeNet-GAP从边界框内提取特征来训练和测试。我们发现性能提高至了67.8%。在细粒度识别中,定位能力非常重要,因为类别之间的差别是极细微的,如果有更集中的裁剪区域,则会带来更好的区分度。此外,我们发现GoogLeNet-GAP能准确定位41%的交并比为0.5(IoU,两个边界框的重叠度)的鸟,其他的只有5.5%(不确定翻译,原文为as compared to a chance performance of 5.5%)。我们在图7中足了一些可视化,进一步验证了我们方法的定位能力。

www.64222.com 39图7 选择的CUB200类别中的4个鸟的CAM和预测边框。在4.1部分,我们评估了边界框的准确率(0.5交并比的有41%)。我们发现提取这些GoogLeNet-GAP的CAM边界框并且再用SVM训练,可以将鸟的分类准确率提高约5%

这一部分,探索我们的技术是否能识别一般元素或出物体外的图片模式,比如文本或者更高维的概念。给一些包含普通概念的图片,我们想确定网络认为哪些区域是重要的,以及是否符合输入模式。我们使用了与以前相似的方法:在GoogLeNet-GAP网络的GAP层训练了一个线性SVM,并使用CAM技术识别重要区域。我们用我们的深度特征做了三个模式的实验,结果在下方总结。注意在这种情况下,我们不需要拆分训练集和测试集——只用CNN做视觉模式探索。发现场景中信息丰富的物体:我们从SUN数据集[27]中抽取10个包含至少200个完全注解图像的场景类别,从而产生总共4675个完全注解的图片。我们针对每个场景类别训练一对一线性SVM,并使用线性SVM的权重计算CAM。图9绘制了预测风景类别的CAM,并列出了两个场景类别的CAM高激活区域中高频覆盖的前6个物体。我们发现高激活区域经常对应于指示特定场景类别的物体。

www.64222.com 40图9 两个场景的信息丰富的物体。对Dining room和Bathroom,我们展示了原图,列出了6个场景中高频出现的物体以及出现频率。bottom是CAM以及列出的6个激活区域高频覆盖的物体。弱标记图像的概念定位:使用B. Zhou, V. Jagadeesh, and R. Piramuthu. Conceptlearner:Discovering visual concepts from weakly labeled image collections.Proc. CVPR, 2015中的hard-negative mining方法学习概念检测器并用我们的CAM技术定位图片概念。为了训练一个短语的概念检测器,positive set由包含文本标题中的短语的图片组成,negative set由随机选择的图片组成,文本标题中没有任何相关词语。图10,我们可视化了排名最高的图片以及两个概念检测器的CAM图。注意,即使这些短语比典型的物体名更抽象,CAM也会将这些概念的信息区域进行定位。www.64222.com 41图10 弱标签图片学到的信息区域概念。尽管概念相当抽象,但我们的GoogLeNet-GAP网络充分定位了这些概念。

弱监督文本检测器:我们用350个Google Street View图片训练弱监督文本检测器,positive set包含SVT数据集的文本,negative set包含从SUN数据集种随意采样的室外风景图片。如图11所示,我们的方法没使用边界框注解就准确地标出了文本区域。

www.64222.com 42图11 学习一个弱监督文本检测器。尽管我们的网络没有用text或者任何边界框注解训练,还是准确地标出了text的位置

视觉问题回答:(Interpreting visual question answering)我们用我们的方法标出与B. Zhou, Y. Tian, S. Sukhbaatar, A. Szlam, and R. Fergus.Simple baseline for visual question answering. arXivpreprint arXiv:1512.02167, 2015.中提出的视觉问题答案相关的深度特征。在Open-Ended track中,整体准确率为55.89%。如图12所示,我们的方法标出了与预测答案相关的图像区域。

www.64222.com 43图12 在视觉问题回答中预测答案相关区域的标定示例

其实到这里很自然会有一个疑问:砍掉那么多层,准确率会不会降低?

✦ “基于感知图像做出对客观对象和场景有用的决策”(Sockman&Shapiro,2001)

5 Visualizing Class-Specific Units

Zhou等人展示了CNN不同层的卷积单元可以作为视觉概念检测器,识别诸如纹理和材质之类的low-level concepts和物体或者场景这些high-level concepts。深入神经网络,这些单元变得越来越有识别能力。但是,很多网络由于全连接层,变得很难确定识别不同类的不同单元起到的重要性。这里,使用GAP和排序的softmax权重,可以直接可视化这些单元对给定类的识别的重要性。这里我们将其称为CNN的指定类单元(class-specific units)。图13展示了AlexNet*-GAP的指定类单元,分别在ILSVRC数据集做物体识别和Places Database做风景识别。我们使用与Zhou等人相似的处理估计接收区域和分割最后一个卷积层的每个单元的激活图。然后我们简单地使用softmax的权重来对每个单元做指定类的排序。从图中我们可以看出到底是哪个单元将物体分类的区别性区域标记了出来。例如,检测狗脸和体表皮毛的单元对分类湖地猎犬很重要,检测沙发、桌子和壁炉的单元对分类客厅很重要。 因此我们可以推断CNN实际上学习了一个单词包,每个单词都是一个特定类区别性区域的单元。 这些特定于类的单元的组合可以指导CNN对每个图像进行分类。

www.64222.com 44图13 可视化AlexNet*-GAP分别在ImageNet和Places上的指定类单元。展示每个数据集的前3个选定类的单元。每一行展示了接收区域单元分割最自信的图像。例如,检测黑板,椅子和桌子对场景分类中教室的类别判定很重要

答案是肯定的,但不会降低很多,可以通过微调来保持网络准确率。

▌为什么要学习计算机视觉?

6 Conclusion

本文针对使用GAP的CNN网络提出了一个叫做CAM的通用技术,这个技术可以让做过分类训练的CNN网络学会进行物体定位,不需要进行额外的边界框注解训练。CAM可以可视化预测类在任何给定图片上的得分,标出CNN检测到的物体的区别性区域。我们在ILSVRC上评估了我们的方法,进行了弱监督物体定位,证明了我们的全局平均池化层的CNN可以进行准确的物体定位。此外,我们证明了CAM定位技术可以推广到其他视觉识别任务中,也就是说,我们的技术可以生成通用的用于定位的深层特征,可以帮助其他用CNN做任务的研究人员,作为他们理解区别性区域的基础。

下面是大家最关心的代码部分,我使用的基于TensorFlow的Keras,所以颜色通道在最后,使用其他框架的同学调一下就好,过段时间会放到Github仓库

一个显而易见的答案就是,这个研究领域已经衍生出了一大批快速成长的、有实际作用的应用,例如:

def visualize_class_activation_map(model, img_path, target_class): ''' 参数: model:模型 img_path:图片路径 target_class:目标类型 ''' origin_img = get_im_cv2([img_path], 224, 224, 3) # 这是一个自定义读取图片函数 class_weights = model.layers[-1].get_weights()[0] # 取最后一个softmax层的权重 final_conv_layer = model.layers[17] # 这是最后一个卷积层的索引 get_output = K.function([model.layers[0].input],[final_conv_layer.output, model.layers[-1].output]) [conv_outputs, predictions] = get_output([origin_img]) conv_outputs = conv_outputs[0, :, :, :] cam = np.zeros(dtype=np.float32, shape= for i, w in enumerate(class_weights[:, target_class]): cam += conv_outputs[:, :, i] * w cam = cv2.resize(cam, ) cam = 100 * cam plt.imshow(origin_img[0]) plt.imshow(cam, alpha=0.8, interpolation='nearest') plt.show()

人脸识别: Snapchat 和 Facebook 使用人脸检测算法来识别人脸。

以上内容来自822实验室神经网络知识分享我们的822,我们的青春欢迎所有热爱知识热爱生活的朋友和822思享实验室一起成长,吃喝玩乐,享受知识。

图像检索:Google Images 使用基于内容的查询来搜索相关图片,算法分析查询图像中的内容并根据最佳匹配内容返回结果。

游戏和控制:使用立体视觉较为成功的游戏应用产品是:微软 Kinect。

监测:用于监测可疑行为的监视摄像头遍布于各大公共场所中。

生物识别技术:指纹、虹膜和人脸匹配仍然是生物识别领域的一些常用方法。

智能汽车:计算机视觉仍然是检测交通标志、灯光和其他视觉特征的主要信息来源。

视觉识别是计算机视觉的关键组成部分,如图像分类、定位和检测。神经网络和深度学习的最新进展极大地推动了这些最先进的视觉识别系统的发展。在本文中,我将分享 5 种主要的计算机视觉技术,并介绍几种基于计算机视觉技术的深度学习模型与应用。

▌1 、图像分类

www.64222.com 45

给定一组各自被标记为单一类别的图像,我们对一组新的测试图像的类别进行预测,并测量预测的准确性结果,这就是图像分类问题。图像分类问题需要面临以下几个挑战☟☟☟:

视点变化,尺度变化,类内变化,图像变形,图像遮挡,照明条件和背景杂斑

我们怎样来编写一个图像分类算法呢?

www.64222.com 46

计算机视觉研究人员提出了一种基于数据驱动的方法

该算法并不是直接在代码中指定每个感兴趣的图像类别,而是为计算机每个图像类别都提供许多示例,然后设计一个学习算法,查看这些示例并学习每个类别的视觉外观。也就是说,首先积累一个带有标记图像的训练集,然后将其输入到计算机中,由计算机来处理这些数据。

因此,可以按照下面的步骤来分解:

输入是由 N 个图像组成的训练集,共有 K 个类别,每个图像都被标记为其中一个类别。

然后,使用该训练集训练一个分类器,来学习每个类别的外部特征。

最后,预测一组新图像的类标签,评估分类器的性能,我们用分类器预测的类别标签与其真实的类别标签进行比较。

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有