语义分析的一些方法(三)_光环大数据培训图片语义分析3.1 图片分类图片分类是一个最基本的图片语义分析方法。
基于深度学习的图片分类传统的图片分类如下图所示,首先需要先手工提取图片特征,譬如SIFT, GIST,再经由VQ coding和Spatial pooling,最后送入传统的分类模型(例如SVM等)。
图23. 传统图片分类流程图传统方法里,人工特征提取是一个巨大的消耗性工作。
而随着深度学习的进展,不再需要人工特征,通过深度学习自动提取特征成为一种可能。
接下来主要讲述卷积神经网络在图片分类上的使用。
下图是一个经典的卷积神经网络模型图,由Hinton和他的学生Alex Krizhevsky在ILSVRC(Imagenet Large Scale Visual Recognition Competition) 2012中提出。
整个网络结构包括五层卷积层和三层全连接层,网络的最前端是输入图片的原始像素点,最后端是图片的分类结果。
一个完整的卷积层可能包括一层convolution,一层Rectified Linear Units,一层max-pooling,一层normalization。
图24. 卷积神经网络结构图对于每一层网络,具体的网络参数配置如下图所示。
InputLayer就是输入图片层,每个输入图片都将被缩放成227*227大小,分rgb三个颜色维度输入。
Layer1~ Layer5是卷积层,以Layer1为例,卷积滤波器的大小是11*11,卷积步幅为4,本层共有96个卷积滤波器,本层的输出则是96个55*55大小的图片。
在Layer1,卷积滤波后,还接有ReLUs操作和max-pooling操作。
Layer6~ Layer8是全连接层,相当于在五层卷积层的基础上再加上一个三层的全连接神经网络分类器。
以Layer6为例,本层的神经元个数为4096个。
Layer8的神经元个数为1000个,相当于训练目标的1000个图片类别。
图25. CNN网络参数配置图基于Alex Krizhevsky提出的cnn模型,在13年末的时候,我们实现了用于广点通的图片分类和图片检索(可用于广告图片作弊判别),下面是一些示例图。
图片分类示例:图26. 图片分类示例图图片检索示例:图27. 图片检索示例图图片分类上的最新进展在ILSVRC 2012中,Alex Krizhevsky基于GPU实现了上述介绍的,这个有60million参数的模型(简称为AlexNet),赢得了第一名。
这个工作是开创性的,它引领了接下来ILSVRC的风潮。
2013年,Clarifai通过cnn模型可视化技术调整网络架构,赢得了ILSVRC。
2014年,google也加入进来,它通过增加模型的层数(总共22层),让深度更深[48],并且利用multi-scale data training,取得第一名。
baidu最近通过更加“粗暴”的模型[44],在GooLeNet的基础上,又提升了10%,top–5错误率降低至6%以下。
具体结果如下图所示。
图28. ImageNet Classification Result先简单分析一下“GoogLeNet”[48,51]所采用的方法:大大增加的网络的深度,并且去掉了最顶层的全连接层:因为全连接层(Fully Connected)几乎占据了CNN大概90%的参数,但是同时又可能带来过拟合(overfitting)的效果。
模型比以前AlexNet的模型大大缩小,并且减轻了过拟合带来的副作用。
Alex模型参数是60M,GoogLeNet只有7M。
对于google的模型,目前已有开源的实现,有兴趣请点击Caffe+GoogLeNet。
再分析一下“Deep Image by baidu[44]”所采用的方法:Hardware/Software Co-design。
baidu基于GPU,利用36个服务节点开发了一个专为深度学习运算的supercompter(名叫Minwa,敏娲)。
这台supercomputer具备TB级的host memory,超强的数据交换能力,使能训练一个巨大的深层神经网络成为可能。
而要训练如此巨大的神经网络,除了硬件强大外,还需要高效的并行计算框架。
通常而言,都要从data-parallelism和model-data parallelism两方面考虑。
data-parallelism:训练数据被分成N份。
每轮迭代里,各个GPU 基于各自的训练数据计算梯度,最后累加所有梯度数据并广播到所有GPU。
model-data parallelism:考虑到卷积层参数较少但消耗计算量,而全连接层参数相对比较多。
所以卷积层参数以local copy的形式被每个GPU所持有,而全连接层的参数则被划分到各个CPU。
每轮迭代里,卷积层计算可以由各个GPU独立完成,全连接层计算需要由所有GPU配合完成,具体方法请参考[46]。
Data augmentation。
训练一个如此巨大的神经网络(100billion个参数),如果没有充分的训练数据,模型将很大可能陷入过拟合,所以需要采用众多data augmentation方法增加训练数据,例如:剪裁,不同大小,调亮度,饱和度,对比度,偏色等(color casting, vignetting, lens distortion, rotation, flipping, cropping)。
举个例子,一个彩色图片,增减某个颜色通道的intensity 值,就可以生成多张图片,但这些图片和原图的类目是一致的,相当于增加了训练数据。
Multi-scale training:训练不同输入图片尺度下(例如512*512,256*256)的多个模型,最后ensemble多个模型的输出结果。
3.2 Image2text,Image2sentence上面讲述的图片分类对图片语义的理解比较粗粒度,那么我们会想,是否可以将图片直接转化为一堆词语或者一段文本来描述。
转化到文本后,我们积累相对深的文本处理技术就都可以被利用起来。
Image2text首先介绍一种朴素的基于卷积神经网络的image to text方法。
首先它利用深度卷积神经网络和深度自动编码器提取图片的多层特征,并据此提取图片的visual word,建立倒排索引,产生一种有效而准确的图片搜索方法。
再充分利用大量的互联网资源,预先对大量种子图片做语义分析,然后利用相似图片搜索,根据相似种子图片的语义推导出新图片的语义。
其中种子图片,就是可以覆盖所有待研究图片的行业,但较容易分析语义的图片集。
这种方法产生了更加丰富而细粒度的语义表征结果。
虽说简单,但效果仍然不错,方法的关键在于种子图片。
利用比较好的种子图片(例如paipai数据),简单的方法也可以work得不错。
下图是该方法的效果图。
图29. 图片语义tag标注示例图上面的baseline方法,在训练数据优质且充分的情况下,可以取得很不错的图片tag提取效果,而且应用也非常广泛。
但上面的方法非常依赖于训练数据,且不善于发现训练数据之外的世界。
另一个直观的想法,是否可以通过word embedding建立image与text的联系[26]。
例如,可以先利用CNN训练一个图片分类器。
每个类目label可以通过word2vec映射到一个embedding表示。
对于一个新图片,先进行分类,然后对top-n类目label所对应的embedding按照权重(这里指这个类目所属的概率)相加,得到这个图片的embedding描述,然后再在word embedding空间里寻找与图片embedding最相关的words。
Image detection接下来再介绍下image detection。
下图是一个image detection的示例,相比于图片分类,提取到信息将更加丰富。
图30. 图片detection示例目前最先进的detection方法应该是Region-based CNN(简称R-CNN)[75],是由Jeff Donahue和Ross Girshick提出的。
R-CNN的具体想法是,将detection 分为寻找object和识别object两个过程。
在第一步寻找object,可以利用很多region detection算法,譬如selective search[76],CPMC,objectness等,利用很多底层特征,譬如图像中的色块,图像中的边界信息。
第二步识别object,就可以利用“CNN+SVM”来做分类识别。
图31. Image detection系统框图给定一张图片,利用selective search方法[76]来产生2000个候选窗口。
然后利用CNN进行对每一个候选窗口提取特征(取全连接层的倒数第一层),特征长度为4096。
最后用SVM分类器对这些特征进行分类(每一个目标类别一个SVM分类器),SVM的分类器的参数个数为:4096*N,其中N为目标的类别个数,所以比较容易扩展目标类别数。
这里有R-CNN的实现,请点击rcnn codeImage2sentence那能否通过深度学习方法,直接根据image产生sentence呢?我们先看一组实际效果,如下图所示(copy from 文献[43])。
图32. image2sentence示例图关于这个方向,最近一年取得了比较大的突破,工业界(Baidu[77],Google[43],Microsoft[80,81]等)和学术界(Stanford[35],Borkeley[79],UML[19],Toronto[78]等)都发表了一系列论文。
简单归纳一下,对这个问题,主要有两种解决思路:Pipeline方法。
这个思路相对直观一点,先学习到image中visualobject对应的word(如上一节image detection所述),再加上language model,就可以生成sentence。
这种方法各个模块可以独立调试,相对来说,更灵活一点。
如下图所示,这是microsoft的一个工作[81],它分为三步:(1)利用上一节提到的思路detect words;(2)基于language model(RNN or LSTM)产生句子;(3)利用相关性模型对句子打分排序。
图33. “pipeline” image captioningEnd-to-end方法,即通过一个模型直接将image转换到sentence。
google基于CNN+RNN开发了一个Image Caption Generator[43]。
这个工作主要受到了基于RNN的机器翻译[27][42]的启发。