图像分类是根据图像的信息将不同类别的图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像、声音和文本。该系统基于Caffe深度学习框架,首先对数据集进行训练分析构建深度学习网络,提取数据集图像特征信息,得到数据对应的分类模型,然后以bvlc-imagenet训练集模型为基础,对目标图像进行扩展应用,实现“以图搜图”Web应用。
中文引用格式: 张璘,杨丰墒. 基于深度学习的图像分类搜索系统[J].电子技术应用,2019,45(12):51-55.
英文引用格式: Zhang Lin,Yang Fengshang. Image classification search system based on deep learning method[J]. Application of Electronic Technique,2019,45(12):51-55.
Caffe(Convolutional Architecture for Fast Feature Embedding)是由伯克利大学的贾杨清等人开发的一个开源的深度学习框架[1],采用高效的C++语言实现,并内置有Python和MATLAB接口,以供开发人员开发和部署以深度学习为核心算法的应用。本文从基本的深度学习概念出发,以mnist手写识别数据集为基础,通过Caffe框架设计的LeNet卷积网络对数据集进行训练分析,提取目标图像特征信息,训练出一个模型进行测试以及网络结构的图解[2]。为了更好地展示深度学习的应用效果,使用bvlc_reference_caffenet.caffemodel来作为基本模型进行图片识别分类,实现了一个简单的“以图搜图”Web应用。深度学习的概念由HINTON G E等人于2006年提出[3],基于深度置信网络(DBN)提出非监督贪心逐层训练算法,多非线性层级系统有效解决了深度学习在训练过程中的过拟合问题,通过在图像层次稀疏表示中引入图像显著信息,加强了图像特征的语义信息,得到图像显著特征表达。
1.1 卷积过程
其中,f表示Mr×Nc的二维图像矩阵,g表示Nr×Nc的二维图像矩阵,卷积结果y的大小为(Mr+Nr-1)×(Mc+Nc-1),即0≤m<Mr+Nr-1,0≤n<Mc+Nc-1。以具体图像处理为例,卷积过程其实还是基于一个固定的矩阵,将另外一个矩阵一格一格扫过去得到数值的和,如图1所示。
如果输入的图像是6×6的一组矩阵,其前3×3格的数据经过权值weight的加权求和后可以得到429,得到第一个卷积后的数据;输入矩阵每次运算向后移动一小格,并与权值weight进行加权求和,扫完整个数据可以得到一个4×4的数据,卷积的结果是维数降低了,如图2所示。
1.2 卷积核
卷积核为图1中3×3矩阵的数量,因为有时要提取的特征非常多且广泛,所以需要用更多不同的矩阵来扫(多扫几遍),那么矩阵的个数就是卷积核个数。
当使用n个不同权重的矩阵卷积6×6矩阵时,可以将6×6的一个矩阵转变成n个4×4的矩阵,即6×6-->n×4×4的矩阵。
1.3 池化(pooling)
池化与卷积非常相似,简单来说就是下采样,都是使用一个矩阵与另一个矩阵的加权和得到最后的数据。池化与卷积最大的不同是卷积重复使用一个数据,而池化是每个数据只加权求和使用一次。当原来的矩阵是m×m、采样窗口是n×n时,卷积能够取得(m-n+1)×(m-n+1)的矩阵结果,而池化在不重复使用数据加权求和的情况下,一共只能采样(m/n)×(m/n)的结果矩阵。之所以这么做,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。之所以能这么做,是因为即使减少了许多数据,特征的统计属性仍能够描述图像,而且由于降低了数据维度,有效地避免了过拟合[4-5]。池化的过程如图3所示,原始图片大小是12×12 维度,对其进行下采样,采样窗口为10×10,通过池化将其下采样成为一个2×2大小的特征图。
1.4 训练流程
训练的主要流程是训练卷积神经网络(CNN)的某一个卷积层时,实际上是在训练一系列的滤波器(filter)。简单来说,训练CNN在相当意义上是在训练每一个卷积层的滤波器,让这些滤波器组对特定的模式特征有较高的激活,从而达到CNN网络的分类/检测等目的[6]。因此,在相当程度上,构建卷积神经网络的任务就在于构建这些滤波器,也就是改变滤波器矩阵的值,即改变权值weight,用来识别特定的特征[7]。这个过程叫做训练,图4是深度学习训练流程图。
其中weight权值即图4中的W0、W1、W2,其值由初始权值随着学习训练的过程由损失函数来控制和调整,从而达到学习的目的。
2.1 训练过程
由LECUN Y等人于1998年提出的LeNet网络[8]是最早的卷积神经网络之一,它在手写数字的识别问题中取得成功。本文使用的mnist图片数据来源于官网http://yann.lecun.com/exdb/mnist/,数据分成了训练集(60 000张共10类)和测试集(共10 000张10类),每个类别放在一个单独的文件夹里,并将所有的图片都生成txt列表清单(train.txt和test.txt)[9]。环境说明:采用VMware Workstation14下的Linux(Ubuntu16.04)操作系统系统,Python环境:Anaconda2.7,Caffe 以及Caffe所需要的Opencv(3.4)支持。环境搭建如图5所示。
2.2 测试结果
本文使用mnist官方提供的测试集对训练好的模型进行训练,每类数字有1 000张共10个分类10 000张图片,判断正确结果较多,因此这里跳过了判断正确结果的输出,图6依次为0~9的测试出错结果:头顶标记为模型对图片预测分类的结果。
(1)测试大概10 000张图片,共用时不到10 s(仅使用CPU运算,且不同性能计算机用时差异较大,仅作参考),其中判断错误数量为80张左右,正确率大概有99.2%,每张的测试时间不到1 ms。(2)分析输出的错误图像判断结果,可知有些错误原因是手写字迹潦草、部分较为模糊、手写有歧义(即使人为判断也无法准确断定数字具体分类)。(3)部分的测试结果在人眼识别过程中没有太大的问题,在字迹方面也算可以清晰显示出数字的具体信息,而此模型却给出了一个错误的结果。这些识别结果只显示了概率最大的分类,可能在识别的部分特征过于相似,导致并不能得到最好的分类结果,这应该属于深度学习的训练缺陷的一部分,原因是由于训练集的质量和数量决定的。百度上线了其最新的搜索功能——“识图”,该功能基于相似图片识别技术,让用户通过上传本地图片或者输入图片的URL地址后,根据图像特征进行分析,进而从互联网中搜索出与此相似的图片资源及信息内容。根据前面的深度学习图片分类的学习结果,设计出一款类似百度“识图”的应用。
3.1 总体设计思路
使用Web前端获取用户所上传(POST)的图片文件或者URL,服务器接收到用户图片后调用bvlc模型进行处理,载入模型识别出图片分类信息,后台根据这个分类信息使用requests爬虫库搜索Bing上相似的图片,获取到相关的图片链接并传给前端浏览器,浏览器根据所给的图片链接进行访问请求,并显示在用户浏览界面中,从而达到以图搜图的功能。处理流程图如图7所示。
3.2 模型框架说明
后台服务器Django:Django是一个开放源代码的Web应用框架,由Python写成,较适合中等规模的Web项目,本图片搜索系统是基于Django搭建并部署Web应用。Web前端框架Bootstrap:Bootstrap是当前比较流行的前端框架,起源于推特,提供了简洁的层叠样式表和HTML规则,以及更为完善的人性化网站风格。根据此框架能够较好较快地搭建前端Web UI界面,且很符合该图片展示模块的风格。搜索分类依据bvlc模型:该模型由Caffe团队使用imagenet图片集迭代训练30多万次而成,共有1 000种的分类,是一个可应用级别的model。此次分析图片的具体分类就是通过这个模型得到分类的关键字。
3.3 搜图流程
前端界面:这里提供了两种图片的上传方式,即图片的本地文件以及图片的URL地址,选择上传一张小猫图片,如图8所示。
后台分类:后台将图片载入bvlc模型进行运算,如图9展示的是第一个卷积层的卷积核与进行第一次卷积后的图片。
最终后台经过分析特征得到图片分类的概率分布图,如下结果最可能的分类为283,再通过查找label文件得到283类为label:n02123394 Persian cat,如图10所示。
[(0.99606931,′n02123394 Persian cat′),(0.0019333176,′n02127052 lynx,catamount′),(0.0013805312,′n02123159 tiger cat′),(0.00041564793,′n02123045 tabby,tabby cat′),(8.5782471e-05,′n02124075 Egyptian cat′)]更多图片搜索的实现:得到关键字后,通过requests爬虫库爬取Bing图片(https://cn.bing.com/images),对网页HTML源码进行分析,因此得到了一个API接口:https://cn.bing.com/images/async?q={%s}&mmasync=1。该接口提供一个搜索关键词的参数代替URL中的%s,因而得到想要的图片数据,再使用xpath:’//*[@id="mmComponent_images_1"]/ul/li/div/div/div/div[1]/ul/li[2]/text()’,从而提取到想要的图片地址以及图片源信息。获得图片的URL信息后,后台系统会整理好数据以JSON方式传送给浏览器,浏览器便可依据此地址展示给用户更多的相似图片。前端图片展示页面:第一张图片为搜索的原图以及其分类的信息,其他图片为向用户提供的更多相似图片的结果,并且有查看大图(view)和下载功能(download),如图11所示。
图片识别分类系统在应用级别的构建需要大量图片作为训练的基础,不断迭代学习才能得到一个较好的模型。本文使用的模型为Caffe官方提供的bvlc_reference_caffenet.caffemodel,使用的训练集imagenet数据集是一个强大的模型。但若以人工智能应用部署在计算机视觉领域上还远远不够,仍需要更多的大数据作为基础。同时,即使有这样一个强大模型在实际应用中,还需要动态一步步地修正和完善其模型与参数配置,这点现在的Caffe还无法很好地给出解决方案。本文最终的图片搜索应用功能依赖于识别的分类结果,本质上还是为以分类关键词搜图作为结果,若是相同分类的不同图片,搜到的结果可能相似度过高,不够智能化。可参考的解决方案是使用多个训练模型分析所选图片的各方面信息,如色调、风格、其他分类等综合结果,再加以搜索会更加智能化,但同时对训练的数据集和训练网络的学习效率会有更高的要求。
参考文献
[1] Jia Yangqing,SHELHAMER E,DONAHUE J,et al.Caffe:convolutional architecture for fast feature embedding[C].ACM International Conference on Multimedia ACM,2014:675-678.
[2] 王茜,张海仙.深度学习框架Caffe在图像分类中的应用[J].现代计算机(专业版),2016(5):72-75,80.
[3] HINTON G E,OSINDERO S,THE Y W.A fast learning algorithm for deep belief nets[J].Neural Computation,2006,18(7):1527-1554.
[4] 魏正.基于Caffe平台深度学习的人脸识别研究与实现[D].西安:西安电子科技大学,2015.
[5] 许少尉,陈思宇.基于深度学习的图像分类方法[J].电子技术应用,2018,44(6):116-119.
[6] 张顺,龚怡宏,王进军.深度卷积神经网络的发展及其在计算机视觉领域的应用[J].计算机学报,2017,42(3):453-462.
[7] 孙志军,薛磊,许阳明,等.深度学习研究综述[J].计算机应用研究,2012,29(8):2806-2810.
[8] LECUN Y,BOTTOU L,BENGIO Y,et al.Gradient-based learning applied to document recognition[J].Proceedings of the IEEE,1998,86(11):2278-2324.
[9] 黄睿,陆许明,邬依林.基于Ten-sorFlow深度学习手写体数字识别及应用[J].电子技术应用,2018,44(10):6-10.
作者信息:
张 璘,杨丰墒
(厦门理工学院 光电与通信工程学院,福建 厦门361024)
原创声明:此内容为AET网站原创,未经授权禁止转载。