用Keras预训练模型做图片识别

卷积神经网络

我们知道,图片由大量像素点构成,每个像素点又由RGB颜色值构成,用计算机识别图片,如果直接分析各个像素点和它们的颜色值,数据计算量就非常大,分析会很复杂和低效。

卷积神经网络(Convolutional Neural Network)通过卷积运算快速从大量数据中提取出各种特征,然后用神经网络对浓缩后的数据进行快速分析,就能高效地处理图片。

Keras是TensorFlow中一个高层神经网络API,Keras的预训练模型ResNet50是基于ImageNet数据集训练而成,ResNet叫残差网络,是一种深度卷积神经网络,该神经网络模型既轻量又有很高的识别准确率。

图片识别API

这里基于Keras的预训练模型ResNet50做一个图片识别应用,为了易于使用,可以把图片识别部分封装成服务端RESTful API,客户端通过http请求把图片传给后端,完成识别后把结果返回给客户端即可。

在Keras博客上有一位大神已经用Python实现了后端API的封装,主要包括以下几步:

加载模型

图片预处理

ResNet50模型的默认输入尺寸是224x224像素,需要对输入图片做一些预处理:

创建RESTful API

Flask是一个轻量级的 Python Web 应用框架,用Flask创建一个POST接口,用于接收客户端传过来的图片文件,送入模型进行识别,然后把识别结果返回给客户端。

VUE客户端

用 Vue 开发web客户端,实现图片上传和识别结果展示。

为了贯彻Vue组件化开发思想,我把单一页面分成三个子组件,分别是图片选择、图片预览和结果显示三个组件,然后放置在一个父组件中。

分成三部分后,各部分的逻辑相对独立,组件间通过vuex共享状态,图片选择完成后,提交mutation更新store中的状态,把URL传给图片预览组件:

同时请求服务端接口,把返回结果传递给图表子组件显示:

VUE客户端源码:

https://github.com/yunTerry/Keras-Vue

Android客户端

Android APP可以直接从手机上选取和上传图片,然后展示识别结果,这里用Retrofit、Picasso等开发一个Android客户端。

首先从手机中选取一张图片,显示在图片预览控件中:

向服务端发post请求,把图片传过去,返回即为识别结果,根据标签和概率显示在列表控件中:

Android客户端源码:

https://github.com/yunTerry/Keras-Android

参考文章

https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180918G21I6V00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券