「图像分类」是人工智能领域的一个热门话题,我们在实际生活中甚至业务的生产环境里,也经常遇到图像分类相似的需求,如何能快速搭建一个图像分类或者内容识别的 API 呢?
我们考虑使用 Serverless Framework 将图像识别模块部署到腾讯云云函数 SCF 上。
这里我们会用到一个图像相关的库:ImageAI,官方给了一个简单的 demo:
1from imageai.Prediction import ImagePrediction 2import os 3execution_path = os.getcwd() 4 5prediction = ImagePrediction() 6prediction.setModelTypeAsResNet() 7prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5")) 8prediction.loadModel() 9 10predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5 ) 11for eachPrediction, eachProbability in zip(predictions, probabilities): 12 print(eachPrediction + " : " + eachProbability)
接下来分四步进行:创建项目 → 安装依赖 → 配置 yml 文件 → 部署
本地创建 Python 项目
首先,我们在本地创建一个 Python 的项目:mkdir imageDemo`
然后新建文件:``vim index.py`
1from imageai.Prediction import ImagePrediction 2import os, base64, random 3 4execution_path = os.getcwd() 5 6prediction = ImagePrediction() 7prediction.setModelTypeAsSqueezeNet() 8prediction.setModelPath(os.path.join(execution_path, "squeezenet_weights_tf_dim_ordering_tf_kernels.h5")) 9prediction.loadModel() 10 11 12def main_handler(event, context): 13 imgData = base64.b64decode(event["body"]) 14 fileName = '/tmp/' + "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5)) 15 with open(fileName, 'wb') as f: 16 f.write(imgData) 17 resultData = {} 18 predictions, probabilities = prediction.predictImage(fileName, result_count=5) 19 for eachPrediction, eachProbability in zip(predictions, probabilities): 20 resultData[eachPrediction] = eachProbability 21 return resultData 22
下载安装依赖
项目创建完成之后,下载所依赖的模型:
1- SqueezeNet(文件大小:4.82 MB,预测时间最短,精准度适中) 2- ResNet50 by Microsoft Research (文件大小:98 MB,预测时间较快,精准度高) 3- InceptionV3 by Google Brain team (文件大小:91.6 MB,预测时间慢,精度更高) 4- DenseNet121 by Facebook AI Research (文件大小:31.6 MB,预测时间较慢,精度最高)
我们先用第一个 SqueezeNet 来做测试:
在官方文档复制模型文件地址:

使用 wget 直接安装:
wget https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/squeezenet_weights_tf_dim_ordering_tf_kernels.h5

接下来安装依赖,这里面貌似安装的内容蛮多的:

这里需要注意:其中一些依赖需要编译,因此要在 centos + python2.7/3.6 的版本下打包才可以,这很复杂,尤其对于 mac/windows 用户,伤不起。
这时候可以直接用我之前的打包网址:


下载解压后,直接放到自己的项目中即可:

创建 yml 文件
接着创建 serverless.yaml 配置文件
1imageDemo: 2 component: "@serverless/tencent-scf" 3 inputs: 4 name: imageDemo 5 codeUri: ./ 6 handler: index.main_handler 7 runtime: Python3.6 8 region: ap-guangzhou 9 description: 图像识别/分类Demo 10 memorySize: 256 11 timeout: 10 12 events: 13 - apigw: 14 name: imageDemo_apigw_service 15 parameters: 16 protocols: 17 - http 18 serviceName: serverless 19 description: 图像识别/分类DemoAPI 20 environment: release 21 endpoints: 22 - path: /image 23 method: ANY
部署
通过 serverless 命令(可使用命令缩写 sls )进行部署,添加 --debug 参数查看部署详情:
$ sls --debug
如果你的账号未 登陆 或 注册 腾讯云,可以直接通过微信扫描命令行中的二维码,从而进行授权登陆和注册。

访问命令行输出的 URL,URL 就是我们刚才复制的 +/image,通过 Python 语言进行测试:
1import urllib.request 2import base64 3 4with open("1.jpg", 'rb') as f: 5 base64_data = base64.b64encode(f.read()) 6 s = base64_data.decode() 7 8url = 'http://service-9p7hbgvg-1256773370.gz.apigw.tencentcs.com/release/image' 9 10print(urllib.request.urlopen(urllib.request.Request( 11 url = url, 12 data=s.encode("utf-8") 13)).read().decode("utf-8"))
例如我们用这张图进行测试:

得到运行结果:
{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388}
将代码修改一下,进行一下简单的耗时测试:
1import urllib.request 2import base64, time 3 4for i in range(0,10): 5 start_time = time.time() 6 with open("1.jpg", 'rb') as f: 7 base64_data = base64.b64encode(f.read()) 8 s = base64_data.decode() 9 10 url = 'http://service-hh53d8yz-1256773370.bj.apigw.tencentcs.com/release/test' 11 12 print(urllib.request.urlopen(urllib.request.Request( 13 url = url, 14 data=s.encode("utf-8") 15 )).read().decode("utf-8")) 16 print("cost: ", time.time() - start_time)
输出结果:
1{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 2cost: 2.1161561012268066 3{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 4cost: 1.1259253025054932 5{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 6cost: 1.3322770595550537 7{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 8cost: 1.3562259674072266 9{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 10cost: 1.0180821418762207 11{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 12cost: 1.4290671348571777 13{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 14cost: 1.5917718410491943 15{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 16cost: 1.1727900505065918 17{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 18cost: 2.962592840194702 19{"cheetah": 83.12643766403198, "Irish_terrier": 2.315458096563816, "lion": 1.8476998433470726, "teddy": 1.6655176877975464, "baboon": 1.5562783926725388} 20cost: 1.2248001098632812
这个数据,整体性能基本在可接受范围内。
基于 Serverless 架构搭建的 Python 图像识别/分类 小工具就大功告成啦!
传送门:
- GitHub: github.com/serverless
- 官网:serverless.com
欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!
