# 基于C#和OpenVINO部署PaddleOCR模型
  基于OpenVINO模型推理库,在C#语言下,调用封装的OpenVINO动态链接库,部署推理PaddleOCR中的文字识别模型;实现了在C#平台使用PaddleOCR文字识别模型识别文字。
  OpenVinoSharp源码在GitHub和Gitee上已开源,可以直接通过Git获取所有源码
  在Github上克隆下载:
```
git clone https://github.com/guojin-yan/OpenVinoSharp_deploy_PaddleOCR.git
```
  在Gitee上克隆下载:
```
git clone https://gitee.com/guojin-yan/OpenVinoSharp_deploy_PaddleOCR.git
```
## 1.OpenVINO
  OpenVINO™是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,用于快速开发应用程序和解决方案,以解决各种任务(包括人类视觉模拟、自动语音识别、自然语言处理和推荐系统等)。

  该工具套件基于最新一代的人工神经网络,包括卷积神经网络 (CNN)、递归网络和基于注意力的网络,可扩展跨英特尔® 硬件的计算机视觉和非视觉工作负载,从而最大限度地提高性能。它通过从边缘到云部署的高性能、人工智能和深度学习推理来为应用程序加速,并且允许直接异构执行。极大的提高计算机视觉、自动语音识别、自然语言处理和其他常见任务中的深度学习性能;使用使用流行的框架(如TensorFlow,PyTorch等)训练的模型;减少资源需求,并在从边缘到云的一系列英特尔®平台上高效部署;支持在Windows与Linux系统,且官方支持编程语言为Python与C++语言。
  官方发行的[OpenVINO™](www.openvino.ai)未提供C#编程语言接口,因此在使用时无法实现在C#中利用[OpenVINO™](www.openvino.ai)进行模型部署。在之前所做工作中,利用动态链接库功能,调用官方依赖库,实现在C#中部署深度学习模型,推出了[OpenVinoSharp](https://blog.csdn.net/Grape_yan/article/details/128962379)。在本文项目中,使用了OpenVinoSharp作为模型推理工具,加速PaddleOCR模型推理。
<img title="更新日志" src="https://s2.loli.net/2023/04/22/3DhEQetFrPOg2Ns.png" alt="" width="300">
## 2.PaddleOCR
  PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。在实现前沿算法的基础上,考虑精度与速度的平衡,进行**模型瘦身**和**深度优化**,使其尽可能满足产业落地需求。PP-OCR是一个两阶段的OCR系统,其中文本检测算法选用DB,文本识别算法选用[RNN,并在检测和识别模块之间添加文本方向分类器,以应对不同方向的文本识别。
  PP-OCR系统在持续迭代优化,目前已发布PP-OCR、PP-OCRv2和PP-OCRv3三个版本。PP-OCR从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身(如绿框所示),最终得到整体大小为3.5M的超轻量中英文OCR和2.8M的英文数字OCR。
#### PP-OCRv2
  PP-OCRv2在PP-OCR的基础上,进一步在5个方面重点优化,检测模型采用CML协同互学习知识蒸馏策略和CopyPaste数据增广策略;识别模型采用LCNet轻量级骨干网络、UDML 改进知识蒸馏策略和Enhanced CTC loss损失函数改进(如上图红框所示),进一步在推理速度和预测效果上取得明显提升。
#### PP-OCRv3
  PP-OCRv3在PP-OCRv2的基础上,针对检测模型和识别模型,进行了共计9个方面的升级:
- PP-OCRv3检测模型对PP-OCRv2中的CML协同互学习文本检测蒸馏策略进行了升级,分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML蒸馏策略;在对学生模型优化时,提出了残差注意力机制的FPN结构RSE-FPN。
- PP-OCRv3的识别模块是基于文本识别算法[SVTR](https://arxiv.org/abs/2205.00159)优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。PP-OCRv3通过轻量级文本识别网络SVTR_LCNet、Attention损失指导CTC损失训练策略、挖掘文字上下文信息的数据增广策略TextConAug、TextRotNet自监督预训练模型、UDML联合互学习策略、UIM无标注数据挖掘方案,6个方面进行模型加速和效果提升。

## 3.模型下载与转换
  本文中用到的所有模型均在PaddleOCR中下载,本文中给出了详细获取流程,丙夜在代码厂库中提供了本文中所用到的所有模型。
### 3.1 Detection model
(1)PaddlePaddle模型下载方式:
  命令行直接输入以下代码,或者浏览器输入后面的网址即可。
```
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar
```
  下载好后将其解压到文件夹中,便可以获得Paddle格式的推理模型。
(2)转换为ONNX格式:
  该方式需要安装paddle2onnx和onnxruntime模块。在命令行中输入以下指令进行转换:
```
paddle2onnx --model_dir ./ch_PP-OCRv3_det_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./inference/det_onnx/model.onnx --opset_version 10 --input_shape_dict="{'x':[-1,3,640,640]}" --enable_onnx_checker True
```
  其中在指定模型输入大小时,-1代表不指定,可以模型推理部署时在进行指定。运行上述指令后在./inference/det_onnx/路径下可以找到该模型
(3)转换为IR格式
  利用OpenVINOTM模型优化器,可以实现将ONNX模型转为IR格式。
  在OpenVINOTM环境下,切换到模型优化器文件夹,直接使用下面指令便可以进行转换。
```
mo –input_model det_onnx/model.onnx
```
  经过上述指令模型转换后,可以在当前文件夹下找到转换后的三个文件。
### 3.2 Direction classifier
(1)PaddlePaddle模型下载方式:
  命令行直接输入以下代码,或者浏览器输入后面的网址即可。
```
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
```
  下载好后将其解压到文件夹中,便可以获得Paddle格式的推理模型。
(2)转换为ONNX格式:
  该方式需要安装paddle2onnx和onnxruntime模块。在命令行中输入以下指令进行转换:
```
paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./inference/cls_onnx/model.onnx --opset_version 10 --input_shape_dict="{'x':[-1,3,640,640]}" --enable_onnx_checker True
```
  其中在指定模型输入大小时,-1代表不指定,可以模型推理部署时在进行指定。运行上述指令后在./inference/cls_onnx/路径下可以找到该模型
(3)转换为IR格式
  利用OpenVINOTM模型优化器,可以实现将ONNX模型转为IR格式。
  在OpenVINOTM环境下,切换到模型优化器文件夹,直接使用下面指令便可以进行转换。
```
mo –input_model det_onnx/model.onnx
```
  经过上述指令模型转换后,可以在当前文件夹下找到转换后的三个文件。
### 3.3 Recognition model
(1)PaddlePaddle模型下载方式:
  命令行直接输入以下代码,或者浏览器输入后面的网址即可。
```
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar
```
  下载好后将其解压到文件夹中,便可以获得