卷积神经网络
我们知道,图片由大量像素点构成,每个像素点又由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
领取专属 10元无门槛券
私享最新 技术干货