20 行代码:Serverless 架构下用 Python 轻松搞定图像分类

「图像分类」是人工智能领域的一个热门话题,我们在实际生活中甚至业务的生产环境里,也经常遇到图像分类相似的需求,如何能快速搭建一个图像分类或者内容识别的 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 图像识别/分类 小工具就大功告成啦!


传送门:

欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!


推荐阅读:《Serverless 架构:从原理、设计到项目实战》

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )