Bootstrap

Serverless架构下PaddleOCR项目开发与部署

PaddlePaddle团队首次开源文字识别模型套件PaddleOCR,目标是打造丰富、领先、实用的文本识别模型/工具库。该模型套件是一个实用的超轻量OCR系统。主要由DB文本检测、检测框矫正和CRNN文本识别三部分组成。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为3.5M的超轻量中英文OCR和2.8M的英文数字OCR。

本地开发

根据PaddleOCR的项目案例,采用轻量级Python Web框架Bottle框架进行项目开发:

# index.py
import base64
import bottle
import random
from paddleocr import PaddleOCR

ocr = PaddleOCR(use_gpu=False)

@bottle.route('/ocr', method='POST')
def login():
    filePath = './temp/' + (''.join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5)))
    with open(filePath, 'wb') as f:
        f.write(base64.b64decode(bottle.request.body.read().decode("utf-8").split(',')[1]))
    ocrResult = ocr.ocr(filePath, cls=False)
    return {'result': [[line[1][0], float(line[1][1])] for line in ocrResult]}

bottle.run(host='0.0.0.0', port=8080)

开发完成之后,运行该项目:

python index.py

可以看到服务已经启动:

然后通过Postman工具进行测试,首先准备一张图片(此处以PaddleOCR项目内置的测试图片为例):

通过将图片转换为Base64编码,并以POST方法请求刚刚启动的Web服务,可以看到PaddleOCR的执行结果:

部署到Serverless架构

部署前准备

首先需要完成Dockerfile文件:

FROM python:3.7-slim
RUN apt update && apt install gcc libglib2.0-dev libgl1-mesa-glx libsm6 libxrender1 -y && pip install paddlepaddle bottle scikit-build paddleocr
# Create app directory
WORKDIR /usr/src/app
# Bundle app source
COPY . .

编写符合Serverless Devs规范的Yaml文档:

edition: 1.0.0
name: paddle-ocr
access: default

services:
  paddle-ocr:
    component: fc
    props:
      region: cn-shanghai
      service:
        name: paddle-ocr
        description: paddle-ocr service
      function:
        name: paddle-ocr-function
        runtime: custom-container
        caPort: 8080
        codeUri: ./
        timeout: 60
        customContainerConfig:
          image: 'registry.cn-shanghai.aliyuncs.com/custom-container/paddle-ocr:0.0.1'
          command: '["python"]'
          args: '["index.py"]'
      triggers:
        - name: httpTrigger
          type: http
          config:
            authType: anonymous
            methods:
              - GET
              - POST
      customDomains:
        - domainName: auto
          protocol: HTTP
          routeConfigs:
            - path: /*
项目部署

首先构建镜像,此处可以通过Serverless Devs进行构建:

 s build --use-docker

构建完成之后,可以通过工具直接进行部署:

s deploy --use-local -y

部署完成,可以看到系统返回的测试地址:

项目测试

此时,可以通过该测试地址进行测试,同样得到了预期效果:

项目优化

通过对部署在Serverless架构上的项目进行请求,可以看到冷启动和热启动的时间消耗:

通过冷启动与热启动的对比,我们可以发现,在热启动时,整个系统的性能是相对优秀的。但是遇到冷启动整个项目的响应时常是不可控的,此时可以考虑一下途径进行优化: