mindspore-lab / mindocr

A toolbox of ocr models and algorithms based on MindSpore
https://mindspore-lab.github.io/mindocr/
Apache License 2.0
216 stars 56 forks source link

【新功能】mindocr 服务化部署 #735

Open Hsiayukoo opened 2 months ago

Hsiayukoo commented 2 months ago

MindSpore OCR 服务化部署功能设计说明书

一、修订记录

*日期* *修订版本* *修改章节* *修改描述* *作者*
2024-08-19 1.0 初稿完成 hsiayukoo@outlook.com

[TOC]

缩略语清单

*缩略语* *英文全名* *中文解释*
OCR Optical Character Recognition 光学字符识别

二、简介

2.1 目的

MindSpore OCR 目前主要应用在银行,银行的业务中存在大量的版面分析、表格分析、图像中关键信息提取等可通过人工智能解决的任务。快简单的速部署 MindSpore OCR是影响客户是否愿意使用的一个关键因素,但 MindOCR 部署功能与竞品(如 PaddleOCR)进行对比的时候,差距较大。

目前 MindOCR 支持如下方式部署:

推理后端 部署方案 系统环境 硬件
MindSpore 基于Python 的 OCR 在线推理 Linux\MacOS\Windows CPU\GPU\Asecnd
MindSpore Lite 基于Python/C++ 的 OCR 推理 Windows,Linux Linux
AscendCL 基于Python/C++ 的 OCR 推理 linux Ascend

而 PaddleOCR 支持如下方式部署:

image

对比之下,MindSpore OCR 相较于 PaddleOCR 部署工具的差距主要在以下。

2.2 范围

2.2.1 软件名称

MindSpore OCR 部署工具补齐。

2.2.2 软件功能

  1. 一行命令完成模型服务化部署(对标 Ollama)。

三、第零层设计描述

3.1 软件系统上下文定义

安装的环境要求:同 MindSpore OCR(以下简称 MindOCR) 安装的环境要求相同,deploy 模块下新增 serving 模块。(其中绿色的是已有模块,蓝色的是新增的模块)

image

3.2 设计约束

3.2.1 遵循标准

遵守开闭原则。

3.2.2 硬件限制

硬件限制基于 MindSpore 框架硬件限制,不新增任何硬件限制。

3.2.3 技术限制

当前,flask 当前自带的开发服务器 Werkzeug 不支持 http 2.0 协议,也就不能直接支持 gRPC,但可以通过扩展包支持 gRPC,gPRC 能提供比传统 RESTful API 更快的性能。

image

3.2.4 系统配置

不涉及

四、第一层设计描述

4.1 总体结构

MindSpore OCR 服务化部署的整体架构如下图所示(其中蓝色为新增部分)

image

4.2 分解描述

4.2.1 模块分解

  1. server 模块

​ server 模块主要包含了 flask_server、pytriton_server。提供服务部署功能,分别以 flask 和 triton 为基础框架。

​ 本部分以 flask 为基础框架,额外支持 gRPC,也就是提供 gRPC,http 通信协议。并提供以 flask 为基础的服务化部署能力。

五、第二层设计描述

5.1 在线推理任务的输入输出汇总

  1. det 任务

    det:文本检测推理模型
    
    __init__:加载预训练权重或者本地 ckpt 文件,加预处理和后处理方法,
    
    __call__:img_or_path(Union(str, np.array) 输入 1 张 image_path 的list 或者RGB 图像的 nd.array
    
    return:tuple(det_res_final, data) 我们应该只需要 (det_res_final)
    det_res_final(dict):
        polys(np.array): shape like (num_polygons, 4, 2) # 如果是方形的
        scores:(np.array) in shape [num_polygons],每个 polygon 的置信度
    data(dict): 
    image_ori(np.ndarray):原始的图像 in shape[h,w,c]
    image(np.ndarray):处理后喂给神经网络的图像 [c,h,w]
    shape(list): shape 和 scaling 信息 [ori_h, ori_w, scale_ratio_h,scale_ratio_w]         
  2. rec 任务

    rec:文本识别模型
    
    __init__:加载预训练权重或者本地 ckpt 文件,加预处理和后处理方法,
    
    call:
    img_or_path_list(List[Union(str, np.array)]) : 输入 image_path list 或者     images list,总之要是个 list ,可以是 list[str] ,也可以是 list[np.array]
    
    return:
    rec_res(List[tuple]):每个 tuple 都是 (text,score) ,text 是识别的 str,score   是float置信度。 比如 [(“apple”, 0.9), (“bike”, 1.0)]
  3. sys 任务

    system:检测+识别 (det + rec)
    
    __init__:加载预训练权重或者本地 ckpt 文件(rec 和 det 的),加预处理和后处理方法
    
    call:img_or_path(Union[str, np.ndarray] 1张图像的路径或 RGB 值
    
    return:Tuple
    - boxes(List): 识别出来的框,shape like [num_boxes, num_points]
    - texts(List[tuple]): list of (text,score)
    - time_profile(dict): 每个 sub_task 处理所用时间
  4. ser 任务

    ser:语义实体识别
    
    __init__:加载预训练权重或者本地 ckpt 文件,加预处理和后处理方法,
    
    call:
    输入 image_path_list(List[str]),需要 OCR 处理的图像的路径。
    
    return:Tuple
    - res(List[dict]):每张图片的识别结果,大概长这样 {‘image_path’, image_path, ‘label’: ocr_info}
    - tot_time(float):处理所有输入图片所用时间(秒)
    

5.2 flask_server 模块设计

5.2.1 总体结构

flask_server 总体结构如下:

image

5.2.2 http API 接口描述

  1. 设置任务+模型

POST/set_task_model/

参数:

返回值:

null

  1. 获取当前任务名称和模型

GET/get_status

参数:

​ null

返回值:

  1. 执行 detection 推理

POST/detect

发送 1 张图片类似:

url = "http://localhost:5000/detect"
files = {"file": open("/path/to/your.image.jpg", "rb")}
response = requests.post(url, files=files)

返回:

  1. 执行 rec 推理

POST/rec

参数:

​ 发送 1 张图片类似:

url = "http://localhost:5000/rec"
files = {"file": open("/path/to/your.image.jpg", "rb")}
response = requests.post(url, files=files)

返回:

  1. 执行 sys 推理

POST/sys

参数:

url = "http://localhost:5000/sys"
files = {"file": open("/path/to/your.image.jpg", "rb")}
response = requests.post(url, files=files)

返回:

​ 见 ser 任务返回值

  1. 执行 ser 推理

POST/ser

参数:

url = "http://localhost:5000/ser"
files = {"file": open("/path/to/your.image.jpg", "rb")}
response = requests.post(url, files=files)

返回:

​ 见 ser 任务返回值

5.2.3 gRCP 接口设计

输入输出同 http API 接口。

5.2.4 模块分解描述

pre_process:负责请求消息接收后,对数据进行预处理。不同的模型预处理内容不一致。

post_process:预测结果后处理,用于请求返回。不同的模型后处理方法不一样

load_model_config:读取模型配置文件

infer:调用推理后端进行推理,可以是 MindSpore ,也可以是 MindSpore Lite

logger:日志记录

5.3 pytriton server 模块设计

同 flask server 模块。

bltcn commented 2 months ago

这是准备做还是已经实现了?