Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Hsiayukoo opened this issue Aug 19, 2024 · 1 comment
Open

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

Hsiayukoo opened this issue Aug 19, 2024 · 1 comment

Comments

@Hsiayukoo
Copy link
Contributor

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

一、修订记录

*日期* *修订版本* *修改章节* *修改描述* *作者*
2024-08-19 1.0 初稿完成 [email protected]

[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 部署工具的差距主要在以下。

  • MindSpore OCR 不提供服务化部署

2.2 范围

2.2.1 软件名称

MindSpore OCR 部署工具补齐。

2.2.2 软件功能

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

三、第零层设计描述

3.1 软件系统上下文定义

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

image

  • serving 模块:提供服务化部署能力

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

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

  • trtion

    本部分以 triton 为基础框架,提供商用化的服务化部署能力,这部分有 2 种实现方式,(1)使用 c 语言的实现的 tirton,这部分需要首先根据 triton 提供的模板,将 MindSpore 接入 Triton 推理后端。(2)使用类似 flask 的 python 版本的 pytriton 进行服务化部署。(目前只支持 Linux 系统)

五、第二层设计描述

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

  1. det 任务

    det:文本检测推理模型
    
    __init__加载预训练权重或者本地 ckpt 文件加预处理和后处理方法__call__img_or_path(Union(str, np.array) 输入 1  image_path 的list 或者RGB 图像的 nd.array
    
    returntuple(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 文件加预处理和后处理方法callimg_or_path_list(List[Union(str, np.array)]) : 输入 image_path list 或者 	images list总之要是个 list可以是 list[str] ,也可以是 list[np.array]
    
    returnrec_res(List[tuple]):每个 tuple 都是 (text,score) ,text 是识别的 strscore 	是float置信度比如 [(“apple”, 0.9), (“bike”, 1.0)]
  3. sys 任务

    system检测+识别 (det + rec)
    
    __init__加载预训练权重或者本地 ckpt 文件rec  det ),加预处理和后处理方法
    
    callimg_or_path(Union[str, np.ndarray] 1张图像的路径或 RGB 
    
    returnTuple
    - 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 处理的图像的路径returnTuple
    - 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/

参数:

  • task: string 任务名称
  • model: string 模型名称

返回值:

null

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

GET/get_status

参数:

​ null

返回值:

  • task: string 任务名称
  • model: string 模型名称
  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)

返回:

  • det_res_final:见 det 任务返回值
  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)

返回:

  • rec_res:见 rec 任务返回值
  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
Copy link

bltcn commented Aug 23, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants