PaddleOCR 文字识别 c++ win10 安装使用教程

开头先夸一句,百度真棒

本文的免积分的工程文件下载,喜欢就点个赞,收藏一下吧

PaddleOCR 是一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。

引言

这段时间,老师有需求,想对图片进行ocr文字识别,在搜索资料时,发现了paddelOCR, 但是官方提供的c++版 在win10 上布署的资料,太碎片化了,东有一点,西有一点,头大,经过一段时间的实验,终于安装上了,开心,于是来写一篇记录给需要的朋友们

注意,这里是写如何安c++版本的,并不管其他的

安装流程

前置条件

  • Visual Studio 2019
  • CUDA 9.0 / CUDA 10.0,cudnn 7+ (仅在使用GPU版本的预测库时需要)
  • CMake 3.0+

注意:提前预警,本文中并不涉及安装GPU版本

1. 拉取PaddleOCR

https://gitee.com/paddlepaddle/PaddleOCR

github也行,只是我尝试拉了好几次,都失败了,转头想想,国内gitee不也挺香?

整体目录

PaddleOCR
├── configs   // 配置文件,可通过yml文件选择模型结构并修改超参
│   ├── cls   // 方向分类器相关配置文件
│   │   ├── cls_mv3.yml               // 训练配置相关,包括骨干网络、head、loss、优化器
│   │   └── cls_reader.yml            // 数据读取相关,数据读取方式、数据存储路径
│   ├── det   // 检测相关配置文件
│   │   ├── det_db_icdar15_reader.yml  // 数据读取
│   │   ├── det_mv3_db.yml             // 训练配置
│   │   ...                            
│   └── rec   // 识别相关配置文件
│       ├── rec_benchmark_reader.yml      // LMDB 格式数据读取相关
│       ├── rec_chinese_common_train.yml  // 通用中文训练配置
│       ├── rec_icdar15_reader.yml        // simple 数据读取相关,包括数据读取函数、数据路径、标签文件
│       ...                               
├── deploy   // 部署相关
│   ├── android_demo // android_demo 
│   │   ...
│   ├── cpp_infer    // C++ infer 
│   │   ├── CMakeLists.txt    // Cmake 文件
│   │   ├── docs              // 说明文档
│   │   │   └── windows_vs2019_build.md
│   │   ├── include           // 头文件
│   │   │   ├── clipper.h     // clipper 库
│   │   │   ├── config.h      // 预测配置
│   │   │   ├── ocr_cls.h     // 方向分类器
│   │   │   ├── ocr_det.h     // 文字检测
│   │   │   ├── ocr_rec.h     // 文字识别
│   │   │   ├── postprocess_op.h  // 检测后处理
│   │   │   ├── preprocess_op.h   // 检测预处理
│   │   │   └── utility.h         // 工具
│   │   ├── readme.md     // 说明文档
│   │   ├── ...
│   │   ├── src              // 源文件
│   │   │   ├── clipper.cpp  
│   │   │   ├── config.cpp
│   │   │   ├── main.cpp
│   │   │   ├── ocr_cls.cpp
│   │   │   ├── ocr_det.cpp
│   │   │   ├── ocr_rec.cpp
│   │   │   ├── postprocess_op.cpp
│   │   │   ├── preprocess_op.cpp
│   │   │   └── utility.cpp
│   │   └── tools      // 编译、执行脚本
│   │       ├── build.sh   // 编译脚本
│   │       ├── config.txt // 配置文件
│   │       └── run.sh     // 测试启动脚本
│   ├── docker
│   │   └── hubserving
│   │       ├── cpu
│   │       │   └── Dockerfile
│   │       ├── gpu
│   │       │   └── Dockerfile
│   │       ├── README_cn.md
│   │       ├── README.md
│   │       └── sample_request.txt
│   ├── hubserving  // hubserving
│   │   ├── ocr_det   // 文字检测
│   │   │   ├── config.json  // serving 配置
│   │   │   ├── __init__.py  
│   │   │   ├── module.py    // 预测模型
│   │   │   └── params.py    // 预测参数
│   │   ├── ocr_rec   // 文字识别
│   │   │   ├── config.json
│   │   │   ├── __init__.py
│   │   │   ├── module.py
│   │   │   └── params.py
│   │   └── ocr_system  // 系统预测
│   │       ├── config.json
│   │       ├── __init__.py
│   │       ├── module.py
│   │       └── params.py
│   ├── imgs  // 预测图片
│   │   ├── cpp_infer_pred_12.png
│   │   └── demo.png
│   ├── ios_demo  // ios demo
│   │   ...
│   ├── lite      // lite 部署
│   │   ├── cls_process.cc  // 方向分类器数据处理
│   │   ├── cls_process.h
│   │   ├── config.txt      // 检测配置参数
│   │   ├── crnn_process.cc  // crnn数据处理
│   │   ├── crnn_process.h
│   │   ├── db_post_process.cc  // db数据处理
│   │   ├── db_post_process.h
│   │   ├── Makefile            // 编译文件
│   │   ├── ocr_db_crnn.cc      // 串联预测
│   │   ├── prepare.sh          // 数据准备
│   │   ├── readme.md        // 说明文档
│   │   ...
│   ├── pdserving  // pdserving 部署
│   │   ├── det_local_server.py  // 检测 快速版,部署方便预测速度快
│   │   ├── det_web_server.py    // 检测 完整版,稳定性高分布式部署
│   │   ├── ocr_local_server.py  // 检测+识别 快速版
│   │   ├── ocr_web_client.py    // 客户端
│   │   ├── ocr_web_server.py    // 检测+识别 完整版
│   │   ├── readme.md            // 说明文档 
│   │   ├── rec_local_server.py  // 识别 快速版
│   │   └── rec_web_server.py    // 识别 完整版
│   └── slim     
│       └── quantization         // 量化相关
│           ├── export_model.py  // 导出模型
│           ├── quant.py         // 量化
│           └── README.md        // 说明文档
├── doc  // 文档教程
│   ...
├── paddleocr.py
├── ppocr            // 网络核心代码
│   ├── data         // 数据处理
│   │   ├── cls   // 方向分类器
│   │   │   ├── dataset_traversal.py  // 数据传输,定义数据读取器,读取数据并组成batch
│   │   │   └── randaugment.py        // 随机数据增广操作
│   │   ├── det   // 检测
│   │   │   ├── data_augment.py       // 数据增广操作
│   │   │   ├── dataset_traversal.py  // 数据传输,定义数据读取器,读取数据并组成batch
│   │   │   ├── db_process.py         // db 数据处理
│   │   │   ├── east_process.py       // east 数据处理
│   │   │   ├── make_border_map.py    // 生成边界图
│   │   │   ├── make_shrink_map.py    // 生成收缩图
│   │   │   ├── random_crop_data.py   // 随机切割
│   │   │   └── sast_process.py       // sast 数据处理
│   │   ├── reader_main.py   // 数据读取器主函数
│   │   └── rec  // 识别
│   │       ├── dataset_traversal.py  // 数据传输,定义数据读取器,包含 LMDB_Reader 和 Simple_Reader
│   │       └── img_tools.py          // 数据处理相关,包括数据归一化、扰动
│   ├── __init__.py
│   ├── modeling       // 组网相关
│   │   ├── architectures  // 模型架构,定义模型所需的各个模块
│   │   │   ├── cls_model.py  // 方向分类器
│   │   │   ├── det_model.py  // 检测
│   │   │   └── rec_model.py  // 识别
│   │   ├── backbones  // 骨干网络
│   │   │   ├── det_mobilenet_v3.py  // 检测 mobilenet_v3
│   │   │   ├── det_resnet_vd.py   
│   │   │   ├── det_resnet_vd_sast.py
│   │   │   ├── rec_mobilenet_v3.py  // 识别 mobilenet_v3
│   │   │   ├── rec_resnet_fpn.py
│   │   │   └── rec_resnet_vd.py
│   │   ├── common_functions.py      // 公共函数
│   │   ├── heads      // 头函数
│   │   │   ├── cls_head.py          // 分类头
│   │   │   ├── det_db_head.py       // db 检测头
│   │   │   ├── det_east_head.py     // east 检测头
│   │   │   ├── det_sast_head.py     // sast 检测头
│   │   │   ├── rec_attention_head.py  // 识别 attention
│   │   │   ├── rec_ctc_head.py        // 识别 ctc
│   │   │   ├── rec_seq_encoder.py     // 识别 序列编码
│   │   │   ├── rec_srn_all_head.py    // 识别 srn 相关
│   │   │   └── self_attention         // srn attention
│   │   │       └── model.py
│   │   ├── losses    // 损失函数
│   │   │   ├── cls_loss.py            // 方向分类器损失函数
│   │   │   ├── det_basic_loss.py      // 检测基础loss
│   │   │   ├── det_db_loss.py         // DB loss
│   │   │   ├── det_east_loss.py       // EAST loss
│   │   │   ├── det_sast_loss.py       // SAST loss
│   │   │   ├── rec_attention_loss.py  // attention loss
│   │   │   ├── rec_ctc_loss.py        // ctc loss
│   │   │   └── rec_srn_loss.py        // srn loss
│   │   └── stns     // 空间变换网络
│   │       └── tps.py   // TPS 变换
│   ├── optimizer.py  // 优化器
│   ├── postprocess   // 后处理
│   │   ├── db_postprocess.py     // DB 后处理
│   │   ├── east_postprocess.py   // East 后处理
│   │   ├── lanms                 // lanms 相关
│   │   │   ...
│   │   ├── locality_aware_nms.py // nms
│   │   └── sast_postprocess.py   // sast 后处理
│   └── utils  // 工具
│       ├── character.py       // 字符处理,包括对文本的编码和解码,计算预测准确率
│       ├── check.py           // 参数加载检查
│       ├── ic15_dict.txt      // 英文数字字典,区分大小写
│       ├── ppocr_keys_v1.txt  // 中文字典,用于训练中文模型
│       ├── save_load.py       // 模型保存和加载函数
│       ├── stats.py           // 统计
│       └── utility.py         // 工具函数,包含输入参数是否合法等相关检查工具
├── README_en.md    // 说明文档
├── README.md
├── requirments.txt // 安装依赖
├── setup.py        // whl包打包脚本
└── tools           // 启动工具
    ├── eval.py                 // 评估函数
    ├── eval_utils              // 评估工具
    │   ├── eval_cls_utils.py   // 分类相关
    │   ├── eval_det_iou.py     // 检测 iou 相关
    │   ├── eval_det_utils.py   // 检测相关
    │   ├── eval_rec_utils.py   // 识别相关
    │   └── __init__.py
    ├── export_model.py         // 导出 infer 模型
    ├── infer                   // 基于预测引擎预测
    │   ├── predict_cls.py      
    │   ├── predict_det.py
    │   ├── predict_rec.py
    │   ├── predict_system.py
    │   └── utility.py
    ├── infer_cls.py            // 基于训练引擎 预测分类
    ├── infer_det.py            // 基于训练引擎 预测检测
    ├── infer_rec.py            // 基于训练引擎 预测识别
    ├── program.py              // 整体流程
    ├── test_hubserving.py      
    └── train.py                // 启动训练

2. 安装 paddle 预测库 fluid_inference

win10 的话,百度也是真的很贴心了,针对不同的CPU和CUDA版本提供了不同的预编译版本,同时提供了第三方库的预编译版本(重点:是release,release, release),
https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/windows_cpp_inference.html

我下载的是cpu_avx_mkl版的(就是红圈里这个)

在这里插入图片描述

文件解压后的目录

fluid_inference
├── paddle # paddle核心库和头文件
|
├── third_party # 第三方依赖库和头文件 (好评)
|
└── version.txt # 版本和编译信息

还有这个安装opencv,这教程就太多了,实验了一下,我用4.4版本也可以运行,

安装配置OpenCV
在OpenCV官网下载适用于Windows平台的3.4.6版本, 下载地址
运行下载的可执行文件,将OpenCV解压至指定目录,如D:\projects\opencv
配置环境变量,如下流程所示
我的电脑->属性->高级系统设置->环境变量
在系统变量中找到Path(如没有,自行创建),并双击编辑
新建,将opencv路径填入并保存,如D:\projects\opencv\build\x64\vc14\bin

3. 开始cmake(贴官方图)

3.1 打开Visual Studio 2019 Community,点击继续但无需代码

在这里插入图片描述

3.2 文件->打开->CMake

在这里插入图片描述

注意了,下面这张图给的路径是错的,真正的cmakelist 位置在D:\PaddleOCR\deploy\cpp_infer\CMakeLists.txt

在这里插入图片描述

3.3 点击:项目->cpp_inference_demo的CMake设置

在这里插入图片描述
下面就是配置库的路径,这里只用填两个路径

  • opencv库,opencv下载解压后,有两个文件夹,build 和 source,我们填build
  • paddle预测库,(即本文第二步所安装的库)

注意:使用CPU版预测库,请把WITH_GPU的勾去掉
如果使用的是openblas版本,请把WITH_MKL勾去掉 (我是什么也没动)

在这里插入图片描述
路径要填的,一个是要找的是OpenCVConfig.cmake

在这里插入图片描述
另一个,如果懂cmake语法的话,其实不懂好像也没什么问题,就是要找到paddle 预测库 解压出的文件夹路径就对了

在这里插入图片描述

在这里插入图片描述

3.4 重点:使用release 编译

在这里插入图片描述

3.5 点击生成->全部生成

在这里插入图片描述

可能会出现 报错newline in constant, 后来我把那段带中文的删了,再重新打了一段,然后把中文换成英文,然后就通过了,又是一个编码错误,不用太在意

4. 预测及可视化

最想骂人的一个地方****

上述Visual Studio 2019编译产出的可执行文件在out\build\x64-Release目录下,打开cmd,并切换到该目录:

cd D:\projects\PaddleOCR\deploy\cpp_infer\out\build\x64-Release

这个路径没毛病,卑鄙的是下面

可执行文件ocr_system.exe即为样例的预测程序,其主要使用方法如下
预测图片 D:\projects\PaddleOCR\doc\imgs\10.jpg

.\ocr_system.exe D:\projects\PaddleOCR\deploy\cpp_infer\tools\config.txt D:\projects\PaddleOCR\doc\imgs\10.jpg

5. 麻烦来了(本文核心要解决的问题)

config文件很好找,但是如果你真的按照上面的输完了,那你一定运行不了
我们来看一下config文件

# model load config
use_gpu  0
gpu_id  0
gpu_mem  4000
cpu_math_library_num_threads  10
use_mkldnn 1
use_zero_copy_run 1

# det config
max_side_len  960
det_db_thresh  0.3
det_db_box_thresh  0.5
det_db_unclip_ratio  1.6
det_model_dir  ./inference/det_db

# cls config
use_angle_cls 0
cls_model_dir ./inference/cls
cls_thresh  0.9

# rec config
rec_model_dir  ./inference/rec_crnn
char_list_file ../../ppocr/utils/ppocr_keys_v1.txt

# show the detection results
visualize 1

我第一眼看到,./inference 是什么鬼路径,而且 …/…/ 根本不可能从release跳到 ppocr路径,我是看漏了什么吗

来回往复看文档,这些路径你从哪冒出来的

就是这个坑人md
在这里插入图片描述

下面我就分别讲一下如何解决这两个路径的问题

问题1 ./inference 路径

回去翻了好久的文档,终于发现了线索…https://gitee.com/paddlepaddle/PaddleOCR/blob/develop/doc/doc_ch/inference.md

卑鄙,我用的是c++,你偏把东西放python那边
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

没错,这就是我们要的,那我们要怎么搞下来呢
https://gitee.com/paddlepaddle/PaddleOCR#%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD%BD

在这里插入图片描述
如果你和我一样,只想用不想转换什么的,直接下载下面三个
在这里插入图片描述
三个模型都下载下来,
在这里插入图片描述

他们解压之后,都只有两个文件,model, params

/inference/cls/
  └─  model     识别inference模型的program文件
  └─  params    识别inference模型的参数文件
  
/inference/rec_crnn/
  └─  model     识别inference模型的program文件
  └─  params    识别inference模型的参数文件

inference/det_db/
  └─  model     检测inference模型的program文件
  └─  params    检测inference模型的参数文件

创建一个inference文件夹,再在里面创建三个文件夹cls、rec_crnn、det_db
按照下面这个关系,把model 和 params放进去

文件夹文件
clsch_ppocr_mobile_v1.1_cls_infer
det_dbch_ppocr_mobile_v1.1_det_infer
rec_crnnch_ppocr_mobile_v1.1_rec_infer

至此,我们终于填补上了inference路径的问题

问题2 …/…/ 问题

生成的exe文件,应该放在

D:\PaddleOCR\deploy\cpp_infer\ocr_system.exe

才能正常运行

.\ocr_system.exe D:\projects\PaddleOCR\deploy\cpp_infer\tools\config.txt D:\projects\PaddleOCR\doc\imgs\10.jpg

命令行中的参数 分别是config.txt 文件路径,待处理图片路径

当然,回车之后的输出可能会是下图这样子的,不要太担心,这又是一个编码问题,官方也给出了解决方法

在这里插入图片描述

在Windows下的终端中执行文件exe时,可能会发生乱码的现象,此时需要在终端中输入 CHCP 65001 ,将终端的编码方式由GBK编码(默认)改为UTF-8编码,更加具体的解释可以参考这篇博客:https://blog.csdn.net/qq_35038153/article/details/78430359

结尾

最后给大家展示一下效果,就愉快的结束了
在这里插入图片描述
在这里插入图片描述

结尾再夸一句,百度好棒,只是文档好难受呀。。。

  • 16
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值