首页

基于卷积神经网络的裸体图片识别

基于卷积神经网络的裸体图片识别

摘要

卷积神经网络是近年来广泛应用于模式识别、图像处理等领域的一种高效识别算法,它具有结构简单、训练参数少和适应性强等特点。本文从卷积神经网络的发展历史开始,详细阐述了卷积神经网络的网络结构、神经元模型和训练算法。在此基础上以卷积神经网络在裸体图片识别和形状识别方面的应用为例,简单介绍了卷积神经网络在工程上的应用,并给出了设计思路和网络结构。

关键字:模型;结构;训练算法;裸体图片识别;形状识别

Abstract

Convolution neural network is an efficient recognition algorithm which is widely used in pattern recognition, image processing and other fields recent years.It has a simple structure, few training parameters and good adaptability and other advantages. In this paper, begin with the history of convolutional neural networks,describes the structure of convolutional neural network,neuron models and training algorithms in detail. On this basis,uses the applications of convolutional neural network in face detection and shape recognition as examples, introduces the applications of convolution neural network in engineering, and gives design ideas and network structure.

Keywords:Model; Training Algorithm; Advantage; Face detection; Shape recognition

目 录

摘要 .................................................................................................................................................. 1

Abstract ............................................................................................................................................. 2

1 引言............................................................................................................................................. 4

1.1 卷积神经网络的发展历史 ................................................................................................ 4

2 卷积神经网络 ............................................................................................................................... 5

2.1 网络结构 ............................................................................................................................ 5

2.2 神经元模型 ........................................................................................................................ 6

2.3 卷积网络的训练过程 ........................................................................................................ 9

2.4 卷积神经网络的优点 ...................................................................................................... 11

3 卷积神经网络的应用 ................................................................................................................. 11

3.1基于卷积网络的形状识别 ............................................................................................... 11

3.2基于卷积网络的裸体图片识别 ....................................................................................... 13

3.2.1遮挡灵敏度 ............................................................................................................ 15

3.2.2去卷积网络模型 .................................................................................................... 16

4 总结........................................................................................................................................... 20

参考文献......................................................................................................................................... 21

附录 ................................................................................................................................................ 23

1 引言

卷积神经网络是人工神经网络的一种已成为当前语音分析和图像识别领域的研究热点,它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。

1.1 卷积神经网络的发展历史

1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。神经认知机能够利用位移恒定能力从激励模式中学习,并且可识别这些模式的变化形,在其后的应用研究中,Fukushima将神经认知机主要用于手写数字的识别。随后,国内外的研究人员提出多种卷积神经网络形式,在邮政编码识别和人脸识别方面得到了大规模的应用。

通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变

得越来越大。为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。

Trotin 等人提出了动态构造神经认知机并自动降低闭值的方法[1],初始态的神经认知机各层的神经元数目设为零,然后会对于给定的应用找到合适的网络规模。在构造网络过程中,利用一个反馈信号来预测降低阈值的效果,再基于这种预测来调节阈值。他们指出这种自动阈值调节后的识别率与手工设置阈值的识别率相若,然而,上述反馈信号的具体机制并未给出,并且在他们后来的研究中承认这种自动阈值调节是很困难的【8】。

Hildebrandt将神经认知机看作是一种线性相关分类器,也通过修改阈值以使神经认知机成为最优的分类器。Lovell应用Hildebrandt的训练方法却没有成功。对此,Hildebrandt解释的是,该方法只能应用于输出层,而不能应用于网络的每一层。事实上,Hildebrandt没有考虑信息在网络传播中会逐层丢失。

Van Ooyen和Niehuis为提高神经认知机的区别能力引入了一个新的参数。事实上,该参数作为一种抑制信号,抑制了神经元对重复激励特征的激励。多数神经网络在权值中记忆训练信息。根据Hebb学习规则,某种特征训练的次数越多,在以后的识别过程中就越容易被检测。也有学者将进化计算理论与神经认知机结合【9】,通过减弱对重复性激励特征的训练学习,而使得网络注意那些不同

的特征以助于提高区分能力。上述都是神经认知机的发展过程,而卷积神经网络可看作是神经认知机的推广形式,神经认知机是卷积神经网络的一种特例。

卷积神经网络本身可采用不同的神经元和学习规则的组合形式。其中一种方法是采用M-P神经元和BP学习规则的组合,常用于邮政编码识别中。还有一种是先归一化卷积神经网络,然后神经元计算出用输入信号将权值和归一化处理后的值,再单独训练每个隐层得到权值,最后获胜的神经元输出活性,这个方法在处理二值数字图像时比较可行,但没有在大数据库中得到验证。第三种方法综合前两种方法的优势,即采用McCulloch-Pitts神经元代替复杂的基于神经认知机的神经元。在该方法中,网络的隐层和神经认知机一样,是一层一

层训练的,但是回避了耗时的误差反向传播算法。这种神经网络被称为改进的神经认知机。随后神经认知机和改进的神经认知机作为卷积神经网络的例子,广泛用于各种识别任务中,比如大数据库的人脸识别和数字识别。下面详细介绍卷积神经网络的原理、网络结构及训练算法。

2 卷积神经网络

2.1 网络结构

卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。网络中包含一些简单元和复杂元,分别记为S-元和C-元。S-元聚合在一起组成S-面,S-面聚合在一起组成S-层,用Us表示。C-元、C-面和C-层(Us)之间存在类似的关系。网络的任一中间级由S-层与C-层串接而成,而输入级只含一层,它直接接受二维视觉模式,样本特征提取步骤已嵌入到卷积神经网络模型的互联结构中。一般地,Us为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;Uc是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(S-层)都紧跟着一个用来求局部平均与二次提取的计算层(C-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力【10】。

网络中神经元的输出连接值符合“最大值检出假说”【15】,即在某一小区域内存在的一个神经元集合中,只有输出最大的神经元才强化输出连接值。所以若神经元近旁存在有输出比其更强的神经元时,其输出连接值将不被强化。根据上述假说,就限定了只有一个神经元会发生强化。卷积神经网络的种元就是某S-面上最大输出的S-元,它不仅可以使其自身强化,而且还控制了邻近元的强化结果。因而,所有的S-元渐渐提取了几乎所有位置上相同的特征。在卷积神经网络早期研究中占主导的无监督学习中,训练一种模式时需花费相当长的时间去自动搜索一层上所有元中具有最大输出的种元,而现在的有监督学习方式中,训练模式同它们的种元皆由教师设定。

图1是文献[12]中卷积神经网络的典型结构图。将原始图像直接输入到输入层(Uc1),原始图像的大小决定了输入向量的尺寸,神经元提取图像的局部特征,因此每个神经元都与前一层的局部感受野相连。文中使用了4层网络结构,隐层

由S-层和C-层组成。每层均包含多个平面,输入层直接映射到Us2层包含的多个平面上。每层中各平面的神经元提取图像中特定区域的局部特征,如边缘特征,方向特征等,在训练时不断修正S-层神经元的权值。同一平面上的神经元权值相同,这样可以有相同程度的位移、旋转不变性。S-层中每个神经元局部输入窗口的大小均为5x5,由于同一个平面上的神经元共享一个权值向量,所以从一个平面到下一个平面的映射可以看作是作卷积运算,S-层可看作是模糊滤波器,起到二次特征提取的作用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。

图2.1 卷积神经网络结构图

2.2 神经元模型

在卷积神经网络中,只有S-元间的输入连接是可变的,而其他元的输入连接是固定的。用Usl(kl,n)表示第l级,第kl个S-面上,一个S-元的输出,

用Ucl(kl,n)表示在该级第kl个C-面上一个C-元的输出。其中,n是一个二维坐

标,代表输入层中神经元的感受野所在位置,在第一级,感受野的面积较小,随后随着l的增大而增加。

Kl11alv,kl1,kucl1kl1,nvkl1vAluslk,nrlk1rlk (2.1) 1b1kuvlnrk1l

式(2.1)中al(v,kl-1,k)和bl(k)分别表示兴奋性输入和抑制性输入的连

接系数;rl(k)控制特征提取的选择性,其值越大,对噪音和特征畸变的容错性

越差,它是一常量,它控制着位于每一S-层处的单个抑制子平面中每个神经元的输入: rl(k)的值越大,与抑制性成比例的兴奋性就得越大,以便能产生一个

非零输出,换句话说就是相当好的匹配才一能激活神经元,然而因为rl(k)还需乘以φ(),所以rl值越大就能产生越大的输出,相反,小的rl(k)值允许不太匹

配的神经元兴奋,但它只能产生一个比较小的输出;φ(x)为非线性函数。v是一个矢量,表示处于n感受野中的前层神经元n的相对位置,Al确定S神经元要

提取特征的大小,代表n的感受野。所以式中对v的求和也就包含了指定区域当中所有的神经元;外面对于勺kl-1的求和,也就包含了前一级的所有子平面,因

此在分子中的求和项有时也被称作兴奋项,实际上为乘积的和,输入到n的神经元的输出都乘上它们相应的权值然后再输出到nc。

x,x0x (2.2) 0,x0

式(2.2)表示的是指定某级(第l级)、某层(S-层)、某面(第kl个S-面)、某

元(向量为n处)的一个输出。对于一个S-元的作用函数可分为两部分,即兴奋性作用函数和抑制性作用函数。兴奋性作用使得膜电位上升,而抑制性作用起分流作用。

兴奋性作用为:

Kl1

av,kl

kl1vAll1,kucl1kl1,nv (2.3)

S-元与其前一级C-层的所有C-面均有连接,所连接的C-元个数由该S-级的参数感受野Al唯一确定。

网络中另一个重要的神经元是假设存在的抑制性神经元V-元Uvl (n),它位

于S-面上满足以下三个条件:环元的抑制作用影响整个网络的运作;C-元与V-元间存在着固定的连接;V-元的输出事先设为多个C-元输出的平均值。可以用它来表示网络的抑制性作用,发送一个抑制信号给Usl(kl,n)神经元,从与Usl(kl,n)类似的元接收它的输入连接值,并输出:

2uvlncvuk,nvlcl1l1kvAl1lKl1 (2.4)

权cl(v)是位于V—元感受野中的v处的神经元相连的权值,不需要训练这些

值,但它们应随着│v│的增加而单调减小。因此,选择式2.5的归一化权值。 cl'cl

Cr (2.5)

式2.5中的归一化常量C由式2.6给出,其中:r(v)是从v处到感受野中心的 归一化距离:

C(l)al

Kl1vAjKl1r(v) (2.6)

C神经元的输出由式2.7给出:

Kt1jl(kl,kl1)dl(v)ust(kl,nv)Kl11vDtud(kl,n)1 (2.7) 1Vsl(n)

上式中ψ(x)为:

x,x0 (2.8) (x)x

0,x0

式中β为一常量。

kl是第l级中的S子平面的数量。Dl是C—元的感受野。因此,它和特征的大小

相对应。dl(v)是固定兴奋连接权的权值,它是│v│的单调递减函数。如果第kl个S神经元子平面从第kl-1子平面处收到信号,那么jl(kl,kl-1)的值为,1否则为0。 最后,S_层的Vs神经元的输出为

1VstKlKl11vVtdl(v)uKl1sl(kj,nv) (2.9)

图2.2为卷积神经网络中不同神经元之间的连接关系图,从图中可以很清楚地看出各种不同神经元之间的连接关系。

图2.2 卷积神经网络中不同神经元间的连接

2.3 卷积网络的训练过程

神经网络用于模式识别的主流是有指导学习网络,无指导学习网络更多的是用于聚类分析。对于有指导的模式识别,由于任一样本的类别是已知的,样本在空间的分布不再是依据其自然分布倾向来划分,而是要根据同类样本在空间的分布及不同类样本之间的分离程度找一种适当的空间划分方法,或者找到一个分类边界,使得不同类样本分别位于不同的区域内。这就需要一个长时间且复杂的学习过程,不断调整用以划分样本空间的分类边界的位置,使尽可能少的样本被划分到非同类区域中。由于本文主要是检测图像中的人脸,所以可将样本空间分成两类:样本空间和非样本空间,因而本文所使用的学习网络也是有指导的学习网络。卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是有导师训练,所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟的系统的实际“运行”结果。它们可以是从实际运行系统中采集来的。在开始训练前,所有的权都应该用一些不同的小随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无能力学习。 训练算法主要包括4步,这4步被分为两个阶段:

第一阶段,向前传播阶段:

①从样本集中取一个样本(X,Yp),将X输入网络;

②计算相应的实际输出Op。

在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络

在完成训练后正常运行时执行的过程。在此过程中,网络执行的是由式(2.7)计算:

Op=Fn(„(F2(F1(XpW(1))W(2))„)W(n))

第二阶段,向后传播阶段

①计算实际输出Op与相应的理想输出Yp的差;

②按极小化误差的方法调整权矩阵。

这两个阶段的工作一般应受到精度要求的控制,在这里,用式(2.8)计算Ep。

作为网络关于第p个样本的误差测度。而将网络关于整个样本集的误差测度定义为:

E=∑Ep。

1m

Ep(ypjopj) (2.8) 2j1

如前所述,之所以将此阶段称为向后传播阶段,是对应于输入信号的正常传播而言的。因为在开始调整神经元的连接权时,只能求出输出层的误差,而其他层的误差要通过此误差反向逐层后推才能得到。有时候也称之为误差传播阶段。为了更清楚地说明本文所使用的卷积神经网络的训练过程,首先假设输入层、中间层和输出层的单元数分别是N、L和M。X=(x0,x1,„,xN)是加到网络的输入矢量,H=(h0,h1,„,hL)是中间层输出矢量,Y=(y0,y1,„,yM)是网络的实际输出矢量,2

并且用D=(d0,d1,„,dM)来表示训练组中各模式的目标输出矢量输出单元i到隐单元j的权值是Vij,而隐单元j到输出单元k的权值是Wjk。另外用θk和φj来分别表示输出单元和隐含单元的阈值。

于是,中间层各单元的输出为式(2.9):

hjf(Vijxij) (2.9)

i0N1

而输出层各单元的输出是式(2.10):

ykfWuhjk (2.10)

j0L1

其中f(*)是激励函数采用S型函数式(2.11):

f(x)1

1ekx (2.11)

在上述条件下,网络的训练过程如下:

1)选定训练组。从样本集中分别随机地选取300个样本作为训练组。

2)将各权值Vij,Wjk和阈值φj,θk置成小的接近于0的随机值,并初始化

精度控制参数ε和学习率α。

3)从训练组中取一个输入模式X加到网络,并给定它的目标输出矢量D。

4)利用式(2.9)计算出一个中间层输出矢量H,再用式(2.10)计算出网络的实际输出矢Y。

5)将输出矢量中的元素yk与目标矢量中的元素dk进行比较,计算出M个输出误差项式(2.12):

k(dkyk)yk(1yk)

M1

k0 (2.12) 对中间层的隐单元也计算出L个误差项式(2.13): jhj(1hj)kWjk (2.13)

6)依次计算出各权值的调整量式(2.14)和式(2.15):

Wjk(n)(/(1L))*(Wjk(n1)1)*k*hj (2.14)

(2.15) Vij(n)(/(1N))*(Vij(n1)1)*k*hj

和阈值的调整量式(2.16)和(2.17):

k(n)(/(1L))*(k(n1)1)*k (2.16)

j(n)(/(1L))*(j(n1)1)*j (2.17)

7)调整权值式(2.18)和式(2.19):

Wjk(n1)Wjk(n)Wjk(n) (2.18)

Vij(n1)Vij(n)Vij(n) (2.19)

调整阈值式(2.20)和(2.21):

k(n1)k(n)k(n) (2.20) j(n1)j(n)j(n) (2.21)

8)当k每经历1至M后,判断指标是否满足精度要求:E≤ε,其中E是1M1

总误差函数,且E(dkyk)2。如果不满足,就返回(3),继续迭代。如2k0

果满足就进入下一步。

9)训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达稳定,分类器形成。再一次进行训练时,直接从文件导出权值和阈值进行训练,不需要进行初始化。

2.4 卷积神经网络的优点

卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

流的分类方式几乎都是基于统计特征的,这就意味着在进行分辨前必须提取某些特征。然而,显式的特征提取并不容易,在一些应用问题中也并非总是可靠的。卷积神经网络,它避免了显式的特征取样,隐式地从训练数据中进行学习。这使得卷积神经网络明显有别于其他基于神经网络的分类器,通过结构重组和减少权值将特征提取功能融合进多层感知器。它可以直接处理灰度图片,能够直接用于处理基于图像的分类。

卷积网络较一般神经网络在图像处理方面有如下优点: a) 输入图像和网络的拓扑结构能很好的吻合;b) 特征提取和模式分类同时进行,并同时在训练中产生;c)权重共享可以减少网络的训练参数,使神经网络结构变得更简单, 适应性更强。

3 卷积神经网络的应用

3.1基于卷积网络的形状识别

物体的形状是人的视觉系统分析和识别物体的基础,几何形状是物体的本质特征的表现,并具有平移、缩放和旋转不变等特点,所以在模式识别领域,对于形状的分析和识别具有十分重要的意义,而二维图像作为三维图像的特例以及组成部分,因此二维图像的识别是三维图像识别的基础。物体形状的识别方法可以归纳为如下两类,其中,第一类是基于物体边界形状的识别,这种边界的特征主

要有周长、角、弯曲度、宽度、高度、直径等,第二类是基于物体所覆盖区域的形状识别,这种区域的特征主要有面积、圆度、矩特征等,上述两类方法都适用于物体形状的结构或区域的识别。卷积神经网络也是一种基于物体边界形状的识别,它既可以识别封闭形状同时对不封闭形状也有较高的识别率。

图3.1 试验用卷积神经网络的结构图

图3.1是所用的网络结构,U0是输入层,Uc4是识别层。Us为特征提取层,Us1的输入是光感受器的像素位图,该层只是提取一些相对简单的像素特征,随后几层的S-元提取一些更为复杂的像素特征,随着层数的增加,提取的特征也相应递增;Uc是特征映射层,提取高阶特征,提取这些高阶特征时不需要提取像简单特征那样的精确位置信息。

网络中S-元的闭值是预先设定值,训练时权值的更新基于Fukushima提出 的增强型学习规则,如式(2.10)所示,网络的训练方式采用的是无监督学习方式。

图3.2与图3.3是部分实验样本图

图3.2部分训练样本图

图3.3部分测试样本图

样本分为三角形,四边形,八边形,圆形四类,每类10个共80个样本,实验训练时采用40个样本,测试时采用剩余的40个样本,最终的识别结果如表2所示。

图3.4测试出错样本

识别错误的原因是由于训练所用样本模式较少,不能覆盖所有的圆形模式,以至于该测试模式输入网络时,与之相近的四边形模式获胜,最终得到错误的输出结果。这里采用卷积神经网络进行形状识别目的主要是为了验证卷积神经网络的模式识别能力,所以虽然采用的样本图片较少,但已经能够说明卷积网。络在形状识别时有较高的识别率和抗畸变性,而识别前的车牌字符由于前期处理(定位、分割)能力的局限性,具有一定的噪声和变形,因此可以将卷积神经网络应用于车牌识别系统。

3.2基于卷积网络的裸体图片识别

过去二十年里,裸体图片的自动检测一直是计算机视觉领域的焦点问题,由于其丰富的研究历史和明确的目标,该问题是了解整个领域发展变化的极好例子。在本文中,我将用裸体检测问题来展示训练现代版的卷积神经网络模型 。

早在1996年:此领域的一项开创性工作是Fleck等人完成的一个项目,戏称为“寻找裸体人”。论文在90年代中期发表,它反映了计算机视觉研究者们在使用卷积神经网络之前所做的典型工作。在论文中,他们采用的算法是:首先,筛选出含有大量肤色区域的图片;其次,在这些区域内寻找长条状区域,按照人体结构的信息用专用组合器把它们组合成可能的肢体部位,并且连接这些肢体部位。

皮肤检测是通过对色彩空间过滤来实现,组合皮肤区域是通过对人体建模来实现,它将人体建模成“由相邻圆柱体组合而成的物体,每个独立部分的几何形状和各个部分之间的比例都符合人体骨架”。为了更好地理解实现这类算法的工程技术,我们来看图3.5,作者展示了一部分他们人为构造的组合规则:

图3.5

图3.5左图:组合规则(箭头)说明了如何合并简单的组合(如躯干)形成复杂的组合(如四肢和身体的连接)。这些规则受限于它们在2维空间的相对位置,这是由于它们在3维空间有特定的组合分布。虚线表示了还未实现的组合规则。中图:组合器拒绝将大腿和脊椎(虚线表示的是盆骨)组合在一起,因为如果人在这种姿势下大腿会遮盖躯干,使得躯干不容易被检测到。右图:这个臀部连接也被拒绝了。髋骨连接的限制阻止了人的大腿如此摆放。

论文中提到“在138张无限制裸体照片的测试集上,准确率达到了60%,召回率达到52%”。他们还给出了一些真阳性和假阳性的图片例子,并标明算法检测到的相关特征:

图3.6

图3.6成功检测出裸体人物的典型图片。皮肤过滤器的输出结果如图所示,脊椎用红线表示,肢体连接用蓝线表示,肢体与躯干连接用绿线表示。

图3.7

图3.7错误地识别出裸体人物的典型对照图片。这些图片含有与皮肤色彩接近的材料(动物皮肤、木材、面包、褪色的墙面)和容易误判为脊椎或者腰带的结构。组合器经常将平行线组合搞混。

人工构造特征的一个主要问题是特征的复杂性受到了研究院的耐心和想象力的限制。在下一节里,我们将会看到如何训练卷积神经网络来完成同样的任务,更精细地表征相同的数据集。

到了2014年之后:深度学习研究员不再发明各种规则来表征输入的数据,而是设计网络模型结构和数据集,使得人工智能系统能从数据中直接学到表征的方法。然而,由于深度学习研究员并没有明确指定网络模型该如何处理给定的数据集,新的问题就产生了:我们如何理解卷积神经网络的行为?

理解卷积神经网络模型的操作就需要解释各层网络的特征行为。我们将在本文中介绍一个NSFW模型的早期版本,从模型顶层反推到原始输入的像素空间。这样能使我们明白原始输入的什么模式能够导致特征空间的某种特定激活(即为何一张图片被标记为“NSFW”)。 3.2.1遮挡灵敏度

图3.8是我们在经过裁剪的Lena Soderberg图像上使用NSFW模型,用64×64的平滑窗口,3像素移窗处理而成。

图3.8

我们把每个窗口覆盖的像素点传入卷积模型,计算每个像素点的平均“NSFW”得分,得到左侧的热度图。当卷积模型发现某一块裁剪的区域都属于皮肤,它就预测为“NSFW”,在图片中Lena身上相应的位置显示出一大片红色区域。生成右侧的热度图时,我们故意遮挡一部分原始图片,输出1减去平均“NSFW”得分之后的差值(即“SFW”得分)。当NSFW得分最高的区域被遮挡时,“SFW”得分随之上升,我们在热度图中看到了颜色更红的区域。图

3.9的两个图片例子分别表示在上述两种实验中传入卷积模型的两类图片示例:

图3.9

这些遮挡实验的一个优点就是当分类器完全是一个黑盒的情况下照样能够进行实验。调用接口复现上述结果的代码片段见附件。

尽管这类实验以非常直接的方式呈现了分类器的输出结果,但缺点是输出的结果很模糊。这使得我们不能完全深入了解模型的工作状态以及发现训练过程中的错误。 3.2.2去卷积网络模型

当我们用指定数据集训练得到一个模型后,往往希望给出一张图片和某个类别,然后想从模型中得到诸如“我们该如何改变这张图片使其看起来更像是属于那个类别的”之类的答案。针对这类问题,我们使用去卷积网络模型(deconvnet),Zeiler和Fergus014年论文的第二节:

图3.10展示的是我们用去卷积模型对Lena照片的处理结果,显示了我们该如何修饰Lena图片使其更像一张色情图片(作者注:这类使用的去卷积模型需要传入一张正方形的图片 —— 我们将Lena的完整图片填补成合适的尺寸):

图3.10

Barbara 是Lena的G级(无限制级)版本。根据我们的去卷积模型,我们给她加上红唇后看起来更像PG级(可能不适宜儿童)图片。

图3.11

这张图片是Ursula Andress 在电影《007之诺博士》中饰演Honey Rider的剧照,2003年被英国调查评选为“银幕上100个性感瞬间”的第一位:

图3.12

上述实验的一个显著特点就是卷积模型学习到了红唇和肚脐是“NSFW”得分的指标。这似乎意味着我们“SFW”训练数据集中所包含的红唇和肚脐图片还不够。如果我们只是用准确率/召回率和ROC曲线(如下所示 – 测试集大小为428,271)来评价我们的模型,我们永远也无法发现这个问题,因为我们的测试数据集有着同样的缺陷。这里就是训练基于规则的分类器与现代人工智能研究的

本质差别之一。相对于重新人工构造特征,我们重新设计训练数据集直到挖掘出更优质的特征。

最后,我们机智地在确定是色情图片的数据集上运行去卷积模型,确保模型学到的特征真的和明显的nsfw所对应:

图3.13

这里,我们能清楚地看到卷积模型正确地学到了男女生殖器等器官 —— 我们模型应该标识的部位。而且,模型发现的特征远比研究员人工构造的特征更细化和复杂,有助于我们理解使用卷积模型识别NSFW图片的主要提升点。

4 总结

本文首先阐述了卷积神经网络的原理。卷积神经网络是在神经认知机的基础上为了处理模式识别问题而提出的网络。此网络是多层的分级神经网络,每层的神经元都是相同类型的,或简单,或复杂,或是超复杂的神经元,在每层之间都有非常稀少并且固定模式的连接。介绍了基本的卷积神经网络结构及其神经元模型,接着讨论了卷积神经网络的训练过程,当需要的特征已预先确定,那么就采用有监督算法,网络一层一层地学习,反之则进行无监督学习。最后简要的介绍了卷积神经网络在形状识别和裸体图片识别中的应用。

目前,卷积神经网络已经被应用于二维图像处理、模式识别、机器视觉、形状识别、智能交通等领域,并且能够很好的解决各个领域中的问题。

参考文献

[1] 王天翼. 基于卷积网络的三位特征提取 [学位论文].吉林:吉林大学,2006.

[2] 李葆青. 基于卷积神经网络的模式分类器 [J].大连大学学报,2003,24(2):19-23.

[3] Simon Haykin 著,叶世伟,史忠植译.神经网络原理 [M]. 北京:机械工业出版社,2004.

[4] 肖柏旭.基于卷积网络的人脸检测的研究与实现[学位论文].北京:华北电力大学, 2009.

[5] 陆璐. 卷积神经网络的研究及其在车牌识别系统中的应用 [学位论文].合肥:合肥工业大学,2006.

[6] 顾佳玲,彭宏京.增长式卷积神经网络及其在人脸检测中的应用 [J].系统仿真学报, 2009,21(8):2441-2445.

[7] 赵志宏,杨绍普,马增强.基于卷积神经网络LeNet-5的车牌字符识别研究 [J].系统仿真学报,2010,22(3):638-641.

[8] T .H .Hildebrandt, Optimal Training of Thresholded Linear Correlation Classifiers, IEEE Transactions on Neural Networks Z(6),PP.577一588,Nov.(1991).

[9] K. Fukushima,“Neocognitron:A self-organizing neural-network model for a Mechanism of Pattern recognition unaffected by shift in position,Biol. Cybern.,vol.36,pp.193一202,1980.

[10] C.Neubauer,Shape, position and size invariant visual pattern recognition based on principles of neocognitron and perception in Artificial Neural Networks,1.AlexanderandJ.Taylor,Eds. Amsterdam the Netherlands: North一Holland,vol.2,1992,PP.833一837.

[11] D. Lovell,et al.,Comments on“Optimal Training of Thresholded Linear Correlation Classifiers”,IEEE Trans .On Neural Networks 4(2),PP.367一369,March(1993).

[12] K. Fukushima,“Analysis of the process of visual pattern recognition by the neocognitron,”Neural Networks,vol.2,pp.413-421,1989

[13] Van Ooyen and B. Nienhuis,Pattern Recognition in the Neocognitron Is Improved一by Neuronal Adaption,Biological Cyberneties70,pp.47-53(1993).

[14] 石大明,刘海涛,舒文豪.结合进化计算的神经认知机.计算机学报[J」,2001,24(5):468一473

[15] Claus Neubauer. Evaluation of’ Convolutional Neural Networks for VisualRecognition,Neural Netwoks,vol.9,no.4,pp.685-696(1998)

[16] K.Fukushima and M.Tanigawa,“Use of different thresholds in learning and recognition,”NeuroeomPuting,vol.11,pp.1-17,1996.

[17] G. W. Cottrell,“EMPATH: Face,emotion,and gender recognition using holons,”in Advances in Neural Information Processing Sys

[18] H. Bourlard and Y. Kamp,“Autoassoziation by multilayerperceptrons and singular value decomposition,”Biol. Cybern.,vol.59,pp.291-294,1988.

[19]洪家荣,李星原. Neocognitron学习算法分析. 软件学报 [J],1994,5,(4):35-39

[20]Fukushima K. A hierarchical neural network capable of visual pattern recognition . Neural Networks,1989:2:413-420

[21] Y.Bengio.YLeCun,and D.Henderson,“Globally Trained Handwritten Word Recognizer using Spatial Representation, Convolutional Neural Networks and Hidden Markov Models in Advances in Neural Information Processing Systems,Jack D.Cowan,Gerald Tesauro,and Joshua AlsPector,Eds.1994,vol.6,PP.937一944,Morgan Kaufmann Publishers,Inc.

[22]张佳康,陈庆奎.基于CUDA技术的卷积网络识别算法.计算机工程

[J],2010,36(51):179-181.

[23]肖柏旭,张丽静.基于分流抑制机制的卷积神经网络人脸检测法.计算机应用

[J],2006,26:46-48.

[24]苏松志.复杂背景下的行人检测技术研究[学位论文].厦门:厦门大学,2008.

附录

# NSFW occlusion experiment

from StringIO import StringIO

import matplotlib.pyplot as plt

import numpy as np

from PIL import Image, ImageDraw

import requests

import scipy.sparse as sp

from clarifai.client import ClarifaiApi

CLARIFAI_APP_ID = '...'

CLARIFAI_APP_SECRET = '...'

clarifai = ClarifaiApi(app_id=CLARIFAI_APP_ID,

app_secret=CLARIFAI_APP_SECRET,

base_url='https://api.clarifai.com')

def batch_request(imgs, bboxes):

"""use the API to tag a batch of occulded images"""

assert len(bboxes)

#convert to image bytes

stringios = []

for img in imgs:

stringio = StringIO()

img.save(stringio, format='JPEG')

stringios.append(stringio)

#call api and parse response

output = []

response = clarifai.tag_images(stringios, model='nsfw-v1.0')

for result,bbox in zip(response['results'], bboxes):

nsfw_idx = result['result']['tag']['classes'].index("sfw")

nsfw_score = result['result']['tag']['probs'][nsfw_idx]

output.append((nsfw_score, bbox))

return output

def build_bboxes(img, boxsize=72, stride=25):

"""Generate all the bboxes used in the experiment"""

width = boxsize

height = boxsize

bboxes = []

for top in range(0, img.size[1], stride):

for left in range(0, img.size[0], stride):

bboxes.append((left, top, left+width, top+height))

return bboxes

def draw_occulsions(img, bboxes):

"""Overlay bboxes on the test image"""

images = []

for bbox in bboxes:

img2 = img.copy()

draw = ImageDraw.Draw(img2)

draw.rectangle(bbox, fill=True)

images.append(img2)

return images

def alpha_composite(img, heatmap):

"""Blend a PIL image and a numpy array corresponding to a heatmap in a nice way""" if img.mode == 'RBG':

img.putalpha(100)

cmap = plt.get_cmap('jet')

rgba_img = cmap(heatmap)

rgba_img[:,:,:][:] = 0.7 #alpha overlay

rgba_img = Image.fromarray(np.uint8(cmap(heatmap)*255))

return Image.blend(img, rgba_img, 0.8)

def get_nsfw_occlude_mask(img, boxsize=64, stride=25):

"""generate bboxes and occluded images, call the API, blend the results together""" bboxes = build_bboxes(img, boxsize=boxsize, stride=stride)

print 'api calls needed:{}'.format(len(bboxes))

scored_bboxes = []

batch_size = 125

for i in range(0, len(bboxes), batch_size):

bbox_batch = bboxes[i:i + batch_size]

occluded_images = draw_occulsions(img, bbox_batch)

results = batch_request(occluded_images, bbox_batch)

scored_bboxes.extend(results)

heatmap = np.zeros(img.size)

sparse_masks = []

for idx, (nsfw_score, bbox) in enumerate(scored_bboxes):

mask = np.zeros(img.size)

mask[bbox[0]:bbox[2], bbox[1]:bbox[3]] = nsfw_score

Asp = sp.csr_matrix(mask)

sparse_masks.append(Asp)

heatmap = heatmap + (mask - heatmap)/(idx+1)

return alpha_composite(img, 80*np.transpose(heatmap)), np.stack(sparse_masks)

#Download full Lena image

r = requests.get('https://clarifai-img.s3.amazonaws.com/blog/len_full.jpeg') stringio = StringIO(r.content)

img = Image.open(stringio, 'r')

img.putalpha(1000)

#set boxsize and stride (warning! a low stride will lead to thousands of API calls) boxsize= 64

stride= 48

blended, masks = get_nsfw_occlude_mask(img, boxsize=boxsize, stride=stride)

#viz

blended.show()