PaddleHub 超轻量级中文 OCR 模块 chinese_ocr_db_crnn_mobile 使用与原理全解析【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers本篇技术指南围绕 PaddleFormers 仓库中 chinese_ocr_db_crnn_mobile 模块文档 展开系统讲解该超轻量级中文 OCR 模型的安装、命令行与 Python API 预测、PaddleHub Serving 服务化部署并结合模块源码module.py、utils.py、character.py与单元测试test.py深入剖析其文本框检测—角度分类—文字识别三阶段工作流的底层实现。读完本文你将掌握该模块从环境准备到在线服务部署的完整实战路径并理解其识别结果的字段含义与关键阈值参数的作用。一、模型基本信息模型名称chinese_ocr_db_crnn_mobile类别图像-文字识别网络Differentiable Binarization RCNN数据集icdar2015 数据集是否支持 Fine-tuning否模型大小16M最新更新日期2021-05-31数据指标-chinese_ocr_db_crnn_mobile 是一个用于识别图片中汉字的超轻量级中文 OCR 模型。它的工作流程分为三步基于 chinese_text_detection_db_mobile 模块检测出图片中的文本框对检测到的文本框进行角度分类0°/180°必要时旋转校正采用 CRNNConvolutional Recurrent Neural Network卷积递归神经网络识别文本框中的中文文字最终文字识别算法为 CRNN即论文An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognitionarXiv:1507.05717提出的经典结构。该 Module 支持直接预测无需额外训练其检测部分使用的 DBDifferentiable Binarization可微二值化算法是一种基于分割的文本检测算法将二值化阈值纳入训练中学习可更准确地区分文本与背景边界从而简化后处理流程对弯曲等不规则文本也有较好效果。二、环境准备与安装1、环境依赖使用该模块前需要满足以下依赖paddlepaddle 1.7.2paddlehub 1.6.0安装方法见 PaddleHub 安装文档shapelypyclipper其中 shapely 与 pyclipper 为第三方库用于文本检测框的几何后处理如多边形裁剪、膨胀收缩等需单独安装$ pip install shapely pyclipper注意该 Module 依赖于第三方库 shapely 和 pyclipper使用该 Module 之前请先安装 shapely 和 pyclipper。2、安装模块通过 hub 命令一键安装$ hub install chinese_ocr_db_crnn_mobile如指定版本例如适配 PaddleHub 2.x 并支持 Gradio App 的 1.2.0 版本$ hub install chinese_ocr_db_crnn_mobile1.2.0安装遇到问题时可参考各平台零基础安装指引Windows | Linux | MacOS。关于hub install等命令的更多说明可参考 PaddleHub 命令行工具文档安装后的 Module 默认存放在${HUB_HOME}/.paddlehub/modules目录下若设置了环境变量${HUB_HOME}预训练模型与配置文件保存到该路径否则保存到用户主目录$HOME下。三、模型 API 预测1、命令行预测$ hub run chinese_ocr_db_crnn_mobile --input_path /PATH/TO/IMAGE通过命令行即可完成文字识别模型的调用。更多 PaddleHub 命令行指令install/uninstall/show/search/list/run/serving 等见 PaddleHub 命令行指令文档。命令行方式内部会调用模块的run_cmd入口见 module.py支持--use_gpu、--output_dir、--visualization等可选参数。2、预测代码示例import paddlehub as hub import cv2 ocr hub.Module(namechinese_ocr_db_crnn_mobile, enable_mkldnnTrue) # mkldnn加速仅在CPU下有效 result ocr.recognize_text(images[cv2.imread(/PATH/TO/IMAGE)]) # or # result ocr.recognize_text(paths[/PATH/TO/IMAGE])两种输入方式等价既可以直接传入numpy.ndarray格式的 BGR 图片列表也可以通过paths传入图片路径列表。模块内部通过read_imagesmodule.py读取路径对应图片并对无效文件给出日志提示。3、API 详解构造器__init__(text_detector_moduleNone, enable_mkldnnFalse)构造ChineseOCRDBCRNN对象参数如下text_detector_modulestr文字检测 PaddleHub Module 名字。若为 None则默认使用 chinese_text_detection_db_mobile 模块见 module.py 的text_detector_module属性懒加载方式初始化其作用为检测图片中的文本位置。enable_mkldnnbool是否开启 mkldnn 加速 CPU 计算该参数仅在 CPU 运行下设置有效默认为 False。在构造过程中模块会完成字符字典assets/ppocr_keys_v1.txt的加载与字符表构建并加载两个推理模型文字识别模型inference_model/character_rec/model与角度分类模型inference_model/angle_cls/model见 module.py。预测方法def recognize_text(images[], paths[], use_gpuFalse, output_dirocr_result, visualizationFalse, box_thresh0.5, text_thresh0.5, angle_classification_thresh0.9)预测 API检测输入图片中的所有中文文本的位置与内容。参数说明pathslist[str]图片的路径imageslist[numpy.ndarray]图片数据ndarray.shape 为 [H, W, C]BGR 格式use_gpubool是否使用 GPU若使用 GPU请先设置 CUDA_VISIBLE_DEVICES 环境变量box_threshfloat检测文本框置信度的阈值默认 0.5低于该阈值的检测框会被丢弃text_threshfloat识别中文文本置信度的阈值默认 0.5低于该阈值的识别结果会被过滤angle_classification_threshfloat文本角度分类置信度的阈值默认 0.9visualizationbool是否将识别结果保存为图片文件output_dirstr图片的保存路径默认设为ocr_result。返回结果返回reslist[dict]识别结果的列表列表中每一个元素为 dict各字段为datalist[dict]识别文本结果列表中每一个元素为 dict各字段为textstr识别得到的文本confidencefloat识别文本结果置信度text_box_positionlist文本框在原图中的像素坐标4*2 的矩阵依次表示文本框左下、右下、右上、左上顶点的坐标。如果无识别结果则data为[]save_pathstr, optional识别结果的保存路径如不保存图片则save_path为。识别结果示例来自单元测试仓库自带的 test.py 对上述返回格式给出了精确断言例如对测试图片调用recognize_text后results[0][data]的典型结构为[{ text: GIVE, confidence: 0.9329867362976074, text_box_position: [[282, 163], [351, 163], [351, 200], [282, 200]] }, { text: THANKS, confidence: 0.9966865181922913, text_box_position: [[259, 201], [376, 199], [376, 238], [259, 240]] }]该测试同时验证了paths与images两种输入方式结果一致、GPU 与 CPU 结果一致、visualizationTrue时保存结果图片、传入非法图片路径会抛出AssertionError、以及save_inference_model可导出 detector/classifier/recognizer 三份推理模型angle_classifier.pdmodel/.pdiparams、text_detector.pdmodel/.pdiparams、text_recognizer.pdmodel/.pdiparams。四、源码级原理三阶段识别工作流从 module.py 的recognize_text实现可以看到完整的内部流水线输入校验与读取use_gpuTrue时强制校验CUDA_VISIBLE_DEVICES环境变量未正确设置会抛出RuntimeError随后按images或paths构造待预测数据两者同时为空或同时非空会抛出TypeError。文本检测调用text_detector_module.detect_text(images..., box_threshbox_thresh)得到文本框坐标。文本框排序与矫正裁剪对每个检测框调用sorted_boxesutils.py按从上到下、从左到右排序并对同行高度差小于 10 像素的框做左右交换调整再通过get_rotate_crop_imagemodule.py利用透视变换把任意四边形文本框矫正为水平矩形宽高比大于等于 1.5 时旋转 90° 使文字横置。角度分类_classify_textmodule.py将文本条 resize 归一化到[3, 48, 192]并批处理每批 30 个输出类别为[0, 180]当 180° 类置信度超过angle_classification_thresh时将图片旋转 180° 校正。文字识别_recognize_textmodule.py将文本条按宽高比动态 resize 到[3, 32, max_w]max_wh_ratio由该批内最宽文本条决定见resize_norm_img_rec经 CRNN 推理后由CharacterOps.decodecharacter.py将索引序列解码为文本字符串并剔除 CTC blank 后计算平均置信度。结果过滤与可视化识别置信度低于text_thresh的结果被丢弃若visualizationTrue则调用save_result_imagemodule.py使用draw_ocrutils.py在原图上绘制蓝色文本框并在右侧拼接文字与置信度列表保存到output_dir文件名形如ndarray_时间戳.jpg/.png。值得注意的实现细节字符表由CharacterOpscharacter.py管理character_typech时从assets/ppocr_keys_v1.txt逐行读取字符并追加空格字符use_space_charTrue这也是 1.1.1 版本支持文本中空格识别的能力来源max_text_length25限制了单条文本的最大长度。推理采用 Paddle Inference 的Config/create_predictor见_set_configmodule.py在 CPU 且enable_mkldnnTrue时开启 mkldnn 并设置缓存容量为 10。五、服务化部署PaddleHub Serving 可以一键部署中文 OCR 的在线预测服务。第一步启动 PaddleHub Serving$ hub serving start -m chinese_ocr_db_crnn_mobile执行后即完成服务化 API 的部署默认端口号为 8866。NOTE如使用 GPU 预测需要在启动服务之前设置 CUDA_VISIBLE_DEVICES 环境变量否则不用设置。第二步发送预测请求服务端配置好后以下代码即可发送预测请求并获取识别结果import requests import json import cv2 import base64 def cv2_to_base64(image): data cv2.imencode(.jpg, image)[1] return base64.b64encode(data.tostring()).decode(utf8) # 发送HTTP请求 data {images:[cv2_to_base64(cv2.imread(/PATH/TO/IMAGE))]} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/chinese_ocr_db_crnn_mobile r requests.post(urlurl, headersheaders, datajson.dumps(data)) # 打印预测结果 print(r.json()[results])请求载荷中的images字段为 base64 编码的图片列表服务端通过模块的serving_methodmodule.py接收其内部调用base64_to_cv2utils.py解码为 BGR 图像后送入recognize_text进行推理返回与 Python API 完全一致的识别结果结构。Gradio App 支持从 PaddleHub 2.3.1 开始支持使用链接http://127.0.0.1:8866/gradio/chinese_ocr_db_crnn_mobile在浏览器中访问 chinese_ocr_db_crnn_mobile 的 Gradio App。该 App 由create_gradio_appmodule.py构建提供图片上传、use_gpu开关以及box_thresh、text_thresh、angle_classification_thresh三个滑杆范围 0~1.0步长 0.01无需编写代码即可交互式体验 OCR 效果并调整阈值。六、更新历史1.0.0初始发布1.0.1修复使用在线服务调用模型失败问题1.0.2支持 mkldnn 加速 CPU 计算1.1.0使用超轻量级的三阶段模型文本框检测-角度分类-文字识别识别图片文字1.1.1支持文本中空格识别1.1.2修复只能检出 30 字段问题1.1.3移除 fluid api1.2.0适配 PaddleHub 2.x 添加 Gradio APP七、使用建议与限制该模型为超轻量级定位整体约 16M适合移动端、边缘设备或对延迟敏感的场景做端侧推理若追求更高识别精度可考虑仓库中 chinese_ocr_db_crnn_server 等服务端模型并配合 chinese_text_detection_db_server 使用。若图片文字方向不确定建议保持angle_classification_thresh0.9的默认值过低会误旋转正常的文本过高则可能漏掉真正倒置的文本。box_thresh与text_thresh是实际调参中最常用的两个阈值前者控制检不检得到框后者控制识别结果可不可信在测试图片质量参差不齐时可通过小幅下调阈值换取召回率。该模块不支持 Fine-tuning若需要定制化训练如新增领域词表应转向支持训练的 OCR 框架而非直接修改本模块。【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考