写点什么

Serverless 架构下 Tensorflow 与目标检测系统

作者:刘宇
  • 2021 年 12 月 15 日
  • 本文字数:3236 字

    阅读完需:约 11 分钟

Serverless架构下Tensorflow与目标检测系统

ImageAI 是一个 Python 库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。ImageAI 本着简洁的原则,支持最先进的机器学习算法,用于图像预测,自定义图像预测,物体检测,视频检测,视频对象跟踪和图像预测训练。该库目前支持使用在 ImageNet-1000 数据集上训练的 4 种不同机器学习算法进行图像预测和训练,除此之外还支持使用在 COCO 数据集上训练的 RetinaNet 进行对象检测,视频检测和对象跟踪等。


ImageAI 项目是一个依赖 Tensorflow 1.4.0(及更高版本)的项目,通过对 Tesorflow 项目的进一步封装,ImageAI 项目提供用于图像预测的 4 种算法包括 SqueezeNetResNetInceptionV3DenseNet,可以通过非常简单的方法实现图像预测、目标检测等任务。

本地开发

首先明确要进行目标检测的图像:



然后可以根据 ImageAI 提供的开发文档,实现以下代码:


# index.pyfrom imageai.Prediction import ImagePrediction
# 模型加载prediction = ImagePrediction()prediction.setModelTypeAsResNet()prediction.setModelPath("resnet50_weights_tf_dim_ordering_tf_kernels.h5")prediction.loadModel()
predictions, probabilities = prediction.predictImage("./picture.jpg", result_count=5 )for eachPrediction, eachProbability in zip(predictions, probabilities): print(str(eachPrediction) + " : " + str(eachProbability))
复制代码


完成代码开发之后,可以通过执行该文件进行效果测试:


python index.py
复制代码


可以得到结果:


laptop : 71.43893241882324notebook : 16.265612840652466modem : 4.899394512176514hard_disc : 4.007557779550552mouse : 1.2981942854821682
复制代码


如果在使用过程中觉得模型 resnet50_weights_tf_dim_ordering_tf_kernels.h5 过大,耗时过长,可以按需求选择模型:


  • SqueezeNet(文件大小:4.82 MB,预测时间最短,精准度适中)

  • ResNet50 by Microsoft Research (文件大小:98 MB,预测时间较快,精准度高)

  • InceptionV3 by Google Brain team (文件大小:91.6 MB,预测时间慢,精度更高)

  • DenseNet121 by Facebook AI Research (文件大小:31.6 MB,预测时间较慢,精度最高)

部署到 Serverless 架构

部署前准备

在本地完成 ImageAI 的基本测试运行之后,可以将项目部署到 Serverless 架构上。在 Serverless 架构上,该项目的运行流程基本是:



所以这里涉及到几个部分:


  • 获取本地上传的图片

  • 图片缓存到/tmp/目录下

  • 通过 AI 进行预测

  • 返回数据


按照以上流程,以阿里云函数计算和轻量级 Python Web 框架 Bottle 为例,可以分别实现页面代码以及逻辑代码。其中逻辑代码主要是将上文在本地开发的案例进行稍作修改,与 Bottle 框架进行结合:


# -*- coding: utf-8 -*-from imageai.Prediction import ImagePredictionimport base64import bottleimport randomimport json
# 随机字符串randomStr = lambda num=5: "".join(random.sample('abcdefghijklmnopqrstuvwxyz', num))
# 模型加载prediction = ImagePrediction()prediction.setModelTypeAsResNet()prediction.setModelPath("/mnt/auto/model/resnet50_weights_tf_dim_ordering_tf_kernels.h5")prediction.loadModel()
@bottle.route('/image_prediction', method='POST')def getNextLine(): postData = json.loads(bottle.request.body.read().decode("utf-8")) image = postData.get("image", None) image = image.split("base64,")[1] # 图片获取 imagePath = "/tmp/%s" % randomStr(10) with open(imagePath, 'wb') as f: f.write(base64.b64decode(image)) # 内容预测 result = {} predictions, probabilities = prediction.predictImage(imagePath, result_count=5) for eachPrediction, eachProbability in zip(predictions, probabilities): result[str(eachPrediction)] = str(eachProbability) return result
@bottle.route('/', method='GET')def getNextLine(): return bottle.template('./html/index.html')
app = bottle.default_app()if __name__ == "__main__": bottle.run(host='localhost', port=8080)
复制代码


而页面代码,则主要是通过 HTML 与 Javascript 实现一个便于测试的前端页面:



除此之外,还需明确该项目所必须的依赖:


tensorflow==1.13.1numpy==1.19.4scipy==1.5.4opencv-python==4.4.0.46pillow==8.0.1matplotlib==3.3.3h5py==3.1.0keras==2.4.3imageai==2.1.5bottle==0.12.19
复制代码


为了更快速的在与阿里云 FaaS 平台相同的环境下进行依赖安装,以及项目部署,此时可以通过 Serverless Devs 开发者工具进行部署,在部署之前需要编写资源描述文档s.yaml


edition: 1.0.0    name: imageAi          # 项目名称access: 'default'         #  秘钥别名
services: imageAi: # 服务名称 component: devsapp/fc actions: # 自定义执行逻辑 pre-deploy: # 在deploy之前运行 - run: s build --use-docker # 要运行的命令行 path: ./ # 命令行运行的路径 post-deploy: # 在deploy之后运行 - run: s nas command mkdir /mnt/auto/.s path: ./ # 命令行运行的路径 - run: s nas upload -r -n ./.s/build/artifacts/ai-cv-image-prediction/server/.s/python /mnt/auto/.s/python # 要运行的命令行 path: ./ # 命令行运行的路径 - run: s nas upload -r -n ./src/model /mnt/auto/model # 要运行的命令行 path: ./ # 命令行运行的路径 props: # 组件的属性值 region: cn-hangzhou service: name: ai-cv-image-prediction description: 图片目标检测服务 nasConfig: auto vpcConfig: auto logConfig: auto function: name: server description: 图片目标检测 runtime: python3 codeUri: ./src handler: index.app memorySize: 3072 timeout: 60 environmentVariables: PYTHONUSERBASE: /mnt/auto/.s/python triggers: - name: httpTrigger type: http config: authType: anonymous methods: - GET - POST - PUT customDomains: - domainName: auto protocol: HTTP routeConfigs: - path: /*
复制代码
项目部署

通过 Serverless Devs 开发者工具,拉取 Docker 镜像,进行依赖安装:


s build --use-docker
复制代码



依赖安装完成之后,可以通过s deploy进行项目的部署。部署完成,可以看到系统返回的测试地址::


项目测试

通过测试地址,可以上传一张图片,并进行预测:



可以看到,预测结果和前文在本地执行的结果是一致的。至此,已经成功的将本地的 Tensorflow 项目部署到了 Serverless 架构上。

项目优化

本项目采用的是阿里云函数计算的 Python 运行时。相对来说,该运行时与人工智能项目相结合存在一定的复杂度:


  1. 由于 Tensorflow 等依赖比较大,而通常情况下,函数计算可以上传的代码包大小在 100M 以下,这就导致模型与依赖很难同步部署到 Serverless 架构下;虽然本项目采用了 NAS 作为挂在盘,完成了大依赖包以及模型文件的上传和加载,但是在开发和部署环节相对比较复杂,比较难上手;可以通过容器镜像等运行时降低这一部分的复杂度;

  2. 由于 FaaS 平台的环境在很多情况下都会和开发者的本地环境有一定的差异,所以在安装一些需要编译的依赖时会存在一定的无法跨平台运行,所以此时就需要准备和 FaaS 平台一致的环境进行以来的安装和项目的打包,虽然有类似 Serverless Devs 的开发者工具协助依赖安装和项目打包,但是在一定程度上还是相对复杂的,此时同样可以通过容器镜像等运行时降低这一部分的复杂度;

用户头像

刘宇

关注

阿里云Serverless云布道师 2020.01.04 加入

阿里云Serverless产品经理,国防科大在读博士,《Serverless架构》、《Serverless实践》、《人人都能学会的Serverless架构》等书籍作者,Serverless Devs发起人,Anycodes在线编程负责人。

评论

发布
暂无评论
Serverless架构下Tensorflow与目标检测系统