本发明属于计算机图像识别技术,具体来说涉及一种基于卷积神经网络的用于识别菜品图像的技术方案。

背景技术:

由于图像的形成受到很多因素的影响,比如说拍摄角度、环境光线,原始图像的矩阵数据并不能被计算机分析,所以图像识别的第一步是特征提取,即将图像转化为一个固定长度的向量,该向量受外界条件影响应当是较小的。并且,不同于一般的图像识别问题,比如飞机和汽车,他们在外观上是有很大的结构性差异的,而对于菜品,存在大量结构相似的不同种类的菜品,比如土豆丝和豆芽。现有的基于局部描述子的特征提取方法无法捕捉到这种细致的差异,也无法应对同一菜品的丰富变化,从而识别精确度偏低,鲁棒性不够好。

技术实现要素:

本发明提供一种菜品识别技术,即给定一张图片,若是菜品,则输出其菜品类别。具体来说,本发明采用的技术方案如下:

一种菜品识别方法,其特征在于,所述方法包括以下步骤:1)获得web请求,服务器相应web请求,获取相应图像;2)保存图像,获取输入数据流,生成图像文件名并保存至磁盘;3)图像预处理,对输入的图像进行尺寸调整和归一化;4)使用预先训练的卷积神经网络进行处理,对图像上的物体进行检测及分类,如果没有检测到菜品则结束,如果检测到菜品,则结合分类结果,输出相应菜品信息。

在以上方法中,步骤3)预处理的步骤包括,使用OpenCV的cv2接口,将本地图像读取为一个Numpy的矩阵对象,将图像缩放和截取为224*224像素,并将图像的RGB通道分别减去104、117、123,获得归一化的图像文件。

进一步,步骤4)包括,使用5层卷积神经网络,卷积核依次为11×11、5×5、3×3、3×3、3×3,卷积核个数依次为96、256、384、384、256个,第一、二、五层卷积之后分别进行最大值池化,池化核2×2,第五层池化结果作为输入进行两层全连接,结果输出至Softmax层,输出节点数量为菜品的数量,每一维对应图片属于某个类别的概率。

更进一步,以上神经网络分别用于菜品的检测和识别,其中当检测时分类为菜品和背景,当识别菜品品类时输出概率最高的30个菜品品类,当两者都得到肯定结果时,输出更准确的菜品类别。

采用本发明的方案,能够实现菜品的实时检测与鉴别,输出更为准确的结果,避免在没有菜品的情况下输出让人觉得奇怪的结果,在有菜品的情况下输出更为精确的结果。

附图说明

图1是本发明的实现流程图。

具体实施方式

本发明的目的在于在给定一张图片的情况下,若其中包含菜品,则输出其菜品类别,若没有菜品则不输出结果。

菜品拍摄获得的图像会受到很多因素的影响,而且菜品本身具有复杂的特征,例如颜色、纹理、空间位置、形状等等,在不同的拍摄角度、环境光线等条件下,同样的菜品拍摄的图像会差异巨大。原始图像的矩阵数据并不能被计算机分析,所以图像识别的第一步是特征提取,即将图像转化为一个固定长度的向量,该向量受外界条件影响应当是较小的。并且,不同于一般的图像识别问题,比如飞机和汽车,他们在外观上是有很大的结构性差异的,而对于菜品,存在大量结构相似的不同种类的菜品,比如土豆丝和豆芽。现有的基于局部描述子的特征提取方法无法捕捉到这种细致的差异,也无法应对同一菜品的丰富变化,从而识别精确度偏低,鲁棒性不够好。

至今为止特征没有统一和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个识别算法是否成功往往由它使用和定义的特征决定。特征提取最重要的一个特性是“不变性”:同一场景的不同图像所提取的特征应该是没有大的变化的。常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。(一)颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部信息。(二)纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。(三)各种基于形状特征的分类方法都可以比较有效地利用图像中感兴趣的目标来进行分类,但它们也有一些共同的问题,目前基于形状的分类方法还缺乏比较完善的数学模型;如果目标有变形时分类结果往往不太可靠;许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。(四)所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息,往往还要结合其他特征。

在现已提出的图像分类方法中,基于局部特征的图像分类方法取得了最好效果,尤其是建立在词袋(bag-of-words)模型框架下的一些改进方法取得了当前最好的分类效果。BOW模型在文本分类中的成功应用使得将BOW模型应用于图像分类成为可能。从图像中提取出的局部特征类似于文本中的单词,分别代表着图像和文本的局部信息。与文本分类的原理类似,从不同的图像中提取出的特征反映了不同图像的信息,这些信息就可以作为我们分类的依据。例如对于森林场景来说,出现树叶的局部特征频率要比高山出现树叶的局部特征的频率要高一些。反之,在高山场景中出现山峰状局部特征的频率要比森林场景要高一些。因此每一类图像或目标总有它区分于其他类别的特征。BOW模型正是根据这点,应用统计学的方法来计算不同特征在图像中出现的频率来达到分类图像的目的。基于BOW模型的图像分类可以分为五个步骤:特征提取、码本生成、图像表达生成、图像分类。

局部特征提取:对于特征的选择,一般情况下,人们使用的是局部不变性特征SIFT,当然使用HOG、SUFT及LBP等局部特征也可以获得比较不错的结果。

码本(codebook)的生成:码本生成又称为字典学习,因为从原始图像中提取的局部特征非常多,不便于比对,而且其中有很多重复的。因此需要找出其中独立的特征,类似于构建一本字典,然后用每个字出现的次数的直方图来表示一篇文章,比对两个直方图就方便多了。传统的BOW方法采用的码本生成方法是基于K-means聚类的方法,这种方法具有快速、高效、无监督特性,因此被广泛地采用。将从训练样本中提取出的所有局部特征进行K-means聚类,得到的聚类中心即为码本的码字。

图像特征的生成:最终判别图像类别的是一些具有区分性特征出现的频率。因此我们最后用一个直方图来表达一幅图像,直方图表达的是码本中每一个码字在图像中出现的次数。为了更好地计算我们将直方图归一化,并且用一个向量表示。因此每幅图像最终的表达就是一个与码本大小相同的向量。

图像分类:分类器根据其线性特征可以分为线性分类器和非线性分类器,线性分类器没有对数据进行处理就直接在特征空间进行分类,而非线性分类器对数据进行了一个映射,例如采用了核函数。对于图像的分类,因为其特征是高维的而且数据量很大,人们通常使用的是使用RBF核函数的SVM分类器。

BOW模型被发明于文本处理领域,后引入到图像处理。其忽略了一个图像与文本的根本区别,文本中的单词之间没有空间关系这个概念,但是图像却是有拓扑结构的,局部特征之间的空间关系对于分类非常重要,用局部特征的直方图来表示图像并不合适。而且,菜品图像具有图像结构相似、纹理差别不大这样的问题,使用基于一般的局部特征的方法并不能很好的区分,比如豆腐和鸡块的图像局部。它们的区别在于不同纹理的组合,我们很难形式化的定义这种组合。受到深度学习的从图像学习特征而非人为定义的启发,可以推断将其用于菜品图像分类可以取得良好的效果。通过多层的卷积神经网络,可以学习到最好的适用于菜品图像的特征提取方式。神经网络的底层会学习到线条、颜色块这样的特征,然后组合出各种食材的纹理特征,进一步组合出菜品的部分和整体。神经网络中的多次池化操作能够一定程度上抵抗环境条件和拍摄方式的干扰,提升识别系统的鲁棒性。通过大量的实验证明,我们的分类系统能够达到实用的程度。

下面结合具体实施例来介绍我们的方案。本发明的菜品识别方案包含以下内容:1)获取图像;2)保存图像;3)图像预处理;4)使用卷积神经网络进行处理,输出相应菜品信息。

1、获取/响应Web请求

Web服务器采用Flask框架实现,该框架非常简洁而又功能齐全,非常适合用于快速构造应用。一个最小的Flask应用如下

首先,代码导入了Flask类。这个类的实例将会是我们的WSGI应用程序。接下来,创建一个该类的实例,第一个参数是应用模块或者包的名称。这里使用__name__,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同。这是必须的,这样Flask才知道到哪去找模板、静态文件等等。详情见Flask的文档。然后,使用route()装饰器告诉Flask什么样的URL能触发该响应函数。这个函数的名字也在生成URL时被特定的函数采用,这个函数定义了如何处理该HTTP请求。最后我们用run()函数来让应用运行在本地服务器上。其中if__name__=='__main__':确保服务器只会在该脚本被Python解释器直接执行的时候才会运行,而不是作为模块导入的时候。

2、保存/读取图像

获取输入数据流,生成一个随机的UUID作为图像文件名,保存至磁盘。读取时,使用OpenCV的cv2接口,将本地图像读取为一个Numpy的矩阵对象,等待后续处理。

3、图像预处理

图像的预处理步骤一般包括尺寸调整和归一化,这两个步骤的具体设置会和使用的模型相关,比如说不同的模型的输入尺寸是不一样的。在这里,我们使用的AlexNet网络模型要求输入图像为224*224像素,所以首先将上传的图像缩放为短的一条边为224像素,再截取较长的一条边的中间224像素部分。归一化设置需要和训练时一致,图像的RGB通道分别减去104,117,123。

//读取

img=cv2.imread(img_path)

//根据短边计算缩放率

min_size=min(img.shape[0],img.shape[1])

resize_ratio=input_shape[2]/224

//缩放操作

img=cv2.resize(img,None,fx=resize_ratio,fy=resize_ratio)

//截取

y_margin=(img.shape[0]-input_shape[2])//2

x_margin=(img.shape[1]-input_shape[2])//2

img=img[y_margin:input_shape[2]+y_margin,x_margin:input_shape[2]+x_margin]

//归一化

mean_img=np.asarray([104,117,123]).reshape((3,1,1))

img=img.transpose((2,0,1))-mean_img

4、输入到分类神经网络

Caffe提供了Python的接口(pycaffe),详见caffe/python文件夹。在python代码中可以导入模型,前向、反向迭代,数据输入输出,网络可视化,自定义优化方法。所有的模型数据、计算参数都是可供读写的。要使用caffe的Python接口,首先需要把caffe/python的绝对路径添加到PYTHONPATH环境变量中,然后在Python代码中import caffe就可以导入caffe库。

import caffe

//创建模型,载入参数

network=caffe.Net(…)

//前向计算

output=network.forward(data=image)

//获得菜品和概率

foods=output[‘argmax’][0,0].astype(‘int16’)

probs=net.blobs['prob'].data[0].tolist()

图像输入到卷积神经网络后,进行的是一个前向计算过程,包括卷积、激活函数和池化操作。卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和池化层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在一个卷积层中,通常包含若干个特征平面(FeatureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。池化也叫做池化(pooling),通常有均值池化(mean pooling)和最大值池化(max pooling)两种形式。池化可以看作一种特殊的卷积过程。卷积和池化大大简化了模型复杂度,减少了模型的参数。

卷积操作

卷积过程有三个二维矩阵参与,它们分别是两个特征图和一个卷积核:原图inputX、输出图outputY、卷积核kernelW。卷积过程可以理解为卷积核kernalW覆盖在原图inputX的一个局部的面上,kernalW对应位置的权重乘于inputX对应神经元的输出,对各项乘积求和并赋值到outputY矩阵的对应位置。卷积核在inputX图中从左向右,从上至下每次移动一个位置,完成整张inputX的卷积过程。

池化操作

池化有两种形式,一种是均值池化(mean-pooling),一种是最大值池化(max-pooling)。两种池化看成特殊的卷积过程:(1)均值池化的卷积核中每个权重都是0.25,卷积核在原图inputX上的滑动的步长为2。均值池化的效果相当于把原图模糊缩减至原来的1/4。(2)最大值池化的卷积核中各权重值中只有一个为1,其余均为0,卷积核中为1的位置对应inputX被卷积核覆盖部分值最大的位置。卷积核在原图inputX上的滑动步长为2。最大值池化的效果是把原图缩减至原来的1/4,并保留每个2*2区域的最强输入。

激活函数

激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。在本算法使用的神经网络的激活函数是ReLU函数,其具有求导简便,梯度不消失的优点。

用于图像识别的卷积神经网络主要由卷积层、池化层和激活函数层交替连接组成,深度从几到几十。并且,每个模块也有自由参数可以选择,比如说卷积层的卷积核大小、数量,池化窗口的尺寸以及每种类型使用多少次等,不同的超参数组合得到不同的网络结构,在分类效果上也会有一些区别。本算法的模型的基本参数如下所示:

输入:224×224大小的图片,3通道;

第一层卷积:11×11大小的卷积核96个;

第一层max-pooling:2×2的核;

第二层卷积:5×5卷积核256个;

第二层max-pooling:2×2的核;

第三层卷积:与上一层是全连接,3*3的卷积核384个,分到两个GPU上个192个;

第四层卷积:3×3的卷积核384个,与上一层连接没有经过池化层;

第五层卷积:3×3的卷积核256个;

第五层max-pooling:2×2的核;

第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入;

第二层全连接:4096维;

Softmax层:输出节点数量为菜品的数量,每一维对应图片属于某类别的概率。

上面结合附图对本发明的实施方式作了详细的说明,但是本发明不限于上述实施方式,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。

python 菜品识别_一种菜品识别方法与流程相关推荐

  1. 什么叫侧面指纹识别_哪种指纹识别方式好?侧边指纹识别可能会成为主流

    我以前没有用过背面的指纹.从手机到现在,前置解屏都是一个被认为是理所当然的,甚至升级也应该是屏幕下的指纹.然而,有了小米8,突然觉得指纹解锁实际上不是一个非常重要的问题.首先,如果是前置指纹解屏的话, ...

  2. 自动点名用matlab怎么做,一种自动点名方法与流程

    本发明涉及教育过程化监控领域,特别是涉及一种自动点名方法. 背景技术: 在日常的教学中,教师为统计学生的出席情况,会在课上对学生进行点名,以统计该节课的出席学生和缺席学生.这种方法一般通过直接点名确认 ...

  3. python鱼眼图像识别_一种基于鱼眼摄像头的人脸识别锁以及识别方法与流程

    本发明涉及人脸识别领域,特别涉及一种基于鱼眼摄像头的人脸识别锁. 背景技术: 人脸识别具有用在门锁上存在一些不足.例如,门锁一般装在门上,其高度在安装时已经固定,针对不同身高的用户来说可能造成人脸图像 ...

  4. 属性与意图识别_一种基于多任务学习的意图与槽位联合识别方法与流程

    本发明属于人机交互领域,涉及自然语言处理.垂直对话系统等,特别涉及一种基于多任务学习的意图与槽位联合识别方法. 背景技术: 意图识别和槽位识别可以将垂直对话系统中用户输入文本转化为语义表示,为系统采取 ...

  5. 微分算法 非侵入式负荷识别_一种非侵入式用电负荷识别方法与流程

    本发明涉及智能电网领域,具体地,涉及一种非侵入式用电负荷识别方法. 背景技术: 在智能电网环境下,智能量测设备会逐步得到广泛应用,从而能够得到用户负荷准确的.海量的数据.利用数据挖掘方法对用户负荷大数 ...

  6. 人物关系 人脸识别_一种基于人脸识别系统的人物关系挖掘系统及方法与流程...

    本发明涉及人脸识别技术领域,具体涉及一种基于人脸识别技术进行人物关系挖掘的系统及其方法. 背景技术: 人脸识别作为生物身份识别的典型技术,由于不需要被检测个体的主动配合,近年来在人机交互,安防,身份认 ...

  7. 夜间环境人脸识别_基于人脸识别的夜间疲劳驾驶判断方法与流程

    本发明属于智能识别设有领域,尤其是一种基于人脸识别的夜间疲劳驾驶判断方法. 背景技术: 出租车和网约车在夜间运营极大的方便了人们的出行需求,但是出租车司机为了增加收入常常延长工作时间特别在夜间行驶的时 ...

  8. 人脸识别与膜虹识别_指纹、人脸识别、虹膜识别,告诉你谁才是黑科技

    [华强智慧网讯] 随着物联网应用逐渐丰富,生物识别技术迎来了大显身手的机会--这很容易理解,在万物互联的时代,数据安全重要性不言而喻,市场需要一种更加靠谱的与机器进行交互的方式,生物识别技术能担当这一 ...

  9. python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

最新文章

  1. 拼接的option会多出空行_液晶拼接屏与墙面安装技巧
  2. laravel It is unsafe to run Dusk in production. In DuskServiceProvider.php line 43:错误处理
  3. 自定义工作流任务控件
  4. 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展
  5. 我在神策做研发 | 码农变身“建筑师”:安逸中离走,责任中成长
  6. 【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言
  7. 新氧科技成为互联网医疗美容第一股 首日股价疯狂上涨32%
  8. sql的的over不能和group by一起使用吧_CellRouter的使用
  9. python3.4连接mysql5.7数据库增删改查
  10. 计算机到期收益率公式,用到期收益率计算债券价格
  11. 操作系统概念之定义和功能
  12. 对于法线贴图(Normal Map) 的深入研究
  13. 浏览器工作原理(超级详解!!!!)
  14. BUUCTF:小易的U盘
  15. python gpu加速库比matlab快吗_Python之Unittest和Requests库详解
  16. 原生js打印插件Print.js
  17. 举个栗子!Tableau技巧(53):添加跳转按钮实现页面切换
  18. Parameter 'arg0' not found. Available parameters are [xxx, xxx, param1, param2]
  19. bnu 33970 Ears Cutting
  20. Linux哪个命令显示文件内容,显示文件内容的Linux命令有哪些?Linux培训

热门文章

  1. 什么是翻拍识别_图像识别api
  2. 女生计算机类选什么专业好就业,非常适合女生报考的5大专业,毕业就业不用愁,工作稳定发展好...
  3. OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗
  4. Tplink服务器停止响应,新买的tp-link变砖了,修复时候没有说按p停止
  5. ZigBee无线DCS现场控制站设计
  6. java求外接圆圆心_由三点三维坐标计算圆半径和圆心位置
  7. vs+openCV 1、无法打开源文件openCV\openCV2.hpp 2、计算机中丢失opencv_world310.dll
  8. ensp 三层架构配置
  9. 计算机英语会话实用电脑英语,关于购买电脑的4人英语对话范文
  10. zemax-05变焦镜头