# ocr_lx_zzx **Repository Path**: research-and-development/ai-warehouse/ocr-business/ocrlxzzx ## Basic Information - **Project Name**: ocr_lx_zzx - **Description**: No description available - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-11-19 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OCR项目指导方案 ## 项目基本情况 项目是一个在香港使用的APP,APP中有一个环节:扫描录入商品信息,需要对商品信息进行OCR识别,从图片中提取文本。 图片文本中含有英文和中文,其中中文繁体字是重点与难点。 另外硬件环境是普通的安卓手机,性能不是很高, 需要在手机端完成OCR识别过程。 目前已经部署了一个版本,使用的是Mobile的OCR模型,可以完成OCR识别提取过程,但是对于繁体字的识别准确率不高。 用户提供了繁体字的PDF文件,希望能够有所帮助。 项目的目标是能够提升模型的准确率,同时能够满足硬件和识别速度的要求。 ## 项目指导方案 项目指导方案会根据项目的实际情况,分析项目的问题与核心难点,提出可行的实施方案,并给出核心技术点的指导与参考。 ## 方案内容与流程 整体方案内容包含: 《项目情况分析》分析项目存在的问题点难点; 《模型评估方案》 给出数据收集,指标设计,模型评估的整体方案,为模型提供有效的评价依据。 《模型样本数据增强方案》 提供数据样本数据增强方案,实现样本分析、构建、迭代等整体方案 《模型训练与部署方案》提供模型训练、评估方案。 流程:根据提供的方案对应提供实施指导。 工期:2周;在10个工作日内提供上述全部的方案。实际指导实施过程,需要根据双方实施情况确定。 ## 方案报价 项目指导方案总价:2800元; 实施开始时支付1400元,项目完成后支付剩余款1400元;如有需要可另签外包指导协议。 ----------------------------------------- 2024/8/28 - [X] 完成字库提取,样本生成基本流程,包括生成图像和标注文件 2024/8/29 - [X] 完成训练数据对接:生成训练样本(包含图像和标注数据),样本数据能够进行模型训练。 - [X] 生成增强数据集(500条),在上对模型准确率评估。 ----------------------------------------- git clone http://ezone.showma.com.cn:8860/soumakeji/OCRoff-line/fanti_code.git ### OCR样本数据增强方案、 针对OCR样本数据不足的情况,通过各种数据增强手段实现样本的扩充,生成可用于训练的样本。 样本是指带标注的样本,经过数据增强后,得到的样本同样也是带标注的样本; 在使用OCR模型的时候,需要针对用户提供的一些少量样本进行优化训练模型,样本数量大概只有10几条,同时对样本进行了标注。 现在希望使用数据增强的方式,对这些标注好的样本,进行扩充,生成几百甚至上千个标注好的样本,这样可以在原有的模型上进行再次训练。 请给出数据增强的方案,并描述下如何实现数据增强的同时保留标注结果。 ## OCR模型训练样本数据增强方案 # 项目概要分析 针对货物扫描OCR识别,识别内容为:字母、数字、符号等内容。 由于实际采集样本数据量少,覆盖量不足,需要使用数据增强方案,对训练样本进行扩充。 ## 数据增强技术方案 数据增强(Data Augmentation,简称DA),是指根据现有数据,合成新数据的一类方法。 常见的图像数据增强技术有: 几何变换: 平移:图像中的对象位置发生改变。 缩放:改变图像的大小。 旋转:旋转图像一定角度。 剪切:对图像进行剪切变形。 翻转:水平或垂直翻转图像。 颜色变换: 调整亮度:改变图像的整体亮度。 对比度调整:增加或降低图像对比度。 饱和度调整:改变图像的颜色饱和度。 增加噪声:向图像添加随机噪声,如高斯噪声。 裁剪与填充: 随机裁剪:从原始图像中随机选择一个区域作为新图像。 中心裁剪:仅保留图像的中心部分。 填充:当裁剪后尺寸小于原图时,可以用边缘像素或特定颜色填充。 合成变换: 混合图像:将两个不同的图像叠加在一起。 拼接:将多个图像拼接到一起形成一个新的图像。 特征空间变换: PCA颜色变换:在PCA特征空间中改变图像的颜色。 傅立叶变换:在频域中操作图像。 随机擦除: 在图像的随机区域添加黑色块或指定颜色的块。 仿射变换: 应用仿射变换矩阵来改变图像的形状。 透视变换: 改变图像的视角,模拟不同视角下的场景。 使用预设模板: 应用特定的滤镜或模板来修改图像。 本项目中的图像数据增强技术方案,主要包括以下增强技术: * 图像变形:指对图像进行的变形处理,模拟实现物品表面的弯曲变形等情况; * 图像裁剪:指对图像的剪切变形; * 图像旋转:指对图像进行旋转一定角度,模拟实际使用中设备对应的不同角度; * 图像模糊:指在图像中加入噪声,模拟实际不同使用环境下的模拟情况; * 文字变形:指对文字部分进行变形,模拟实际环境中文字的变形; 本项目数据增强方案,使用"样本+标注"统一的数据增强处理方式,在处理样本的同时,也对标注结果进行了同样的变换, 最终得到的样本仍然是"样本+标注"的标准数据集方式,可直接进行训练,不需要额外再进行标注处理,大大减少了投入成本与时间。 ## 项目封装 数据增强方案最终以独立模块的形式提供,可使用Module, API等方式接入到项目中使用。 项目提供完整的安装说明,API使用手册,便于开发人员快速引入项目。 ----------------------------------------- OCR识别结果为:text 和points text为识别的文本;例如:"5T20241003DA10Zd" points 为4个点的坐标,例如:[[487, 277], [994, 294], [991, 384], [484, 366]] 含义是:左上,右上,右下,左下4个点的坐标; 现在要根据text的文本长度,分别提取出每个字符的位置,假定每个字符的宽度是一样的, 请给出一个方法 testx_split(text, poinst) 计算出拆分后每个字符的坐标; 返回格式: {"char": "5", points:[[3,3],[4,4],[5,5],[6,6]]} 优化思路: 先构造一个插值函数: line_split(star_point, end_point, nums), 该函数将 star_point 和 end_point这两个点之间连线,分成 nums 段;得到 nums+1个点(加上头尾,中间有nums-1个点) 然后调用这个line_split函数: 根据text字符数量,计算出nums, 将left_top和 right_top 连接 得到“上边线”,调用: line_split(left_top, right_top, nums) 得到上顶点列表:up_points 将 left_bottom 和 right_bottom 连接得到 “下边线”; 调用: line_split(left_bottom, right_bottom, nums) 得到下顶点列表: down_points 最后 将 up_points 和 down_points 对应组合,即可得到每个字符的外框。 ``` 构造一个python函数:box_offset(points, value) 其中:points 为4个点的坐标,例如:[[487, 277], [994, 294], [991, 384], [484, 366]] 含义是: 左上,右上,右下,左下4个点的坐标; value 是一个数值; 现在要将points这4个点连接的矩形,偏移value的大小,如果value是正值,则向外偏移,就是新矩形变大,新矩形的边到旧矩形的边的距离为value, 如果value是负值,就是向内偏移,新矩形变小。 最终返回新矩形的4个点坐标。请使用numpy计算 ``` https://blog.csdn.net/didiaopao/article/details/119541103 ----------------------------------------- 语义分割数据增强——图像和标注同步增强-阿里云开发者社区 https://developer.aliyun.com/article/1292311 imgaug:强大的图像增强库_imgaug库-CSDN博客 https://blog.csdn.net/helloaiworld/article/details/143010912 【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)-阿里云开发者社区 https://developer.aliyun.com/article/1399042 Python图像增强imgaug详解_python_脚本之家 https://www.jb51.net/article/267368.htm ----------------------------------------- 2024/11/7 模型训练沟通 * 使用训练前的终端模型在数据集上评估指标 * 训练后的模型转为终端格式也对应成终端模型,在新数据集上做评估指标。 * 指标分析:比较训练前后模型指标变化情况,分析负样本的问题。 * 确认:数据增强中有些文字超出边界的情况,是否会影响模型。 2024/11/19 模型字符级评估指标 * 完成评估指标计算 ## 优化迭代的点 *** 1. 将ppocrv3升级为ppocrv4模型进行安卓部署 *** 2. 识别模型的选择; *** 3. 真实样本+增强(图像增强和文字增强)全数据增强 *** 4. 训练流程怎么对应训练 大模型蒸馏小模型 出小模型 ## ONNX 转化教程 ** 1. pip install paddleocr_convert ``` 转化paddle inference det 模型 tar -cvf infer_det.tar 训练好的det模型 ``` ** 2. paddleocr_convert -p ./der_infer_20221127.tar -o models ** 3. paddleocr_convert -p ./lixian_inferV4_rec.tar -o models -txt_path /home/word_space/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt -o models ** 3. paddleocr_convert -p ./rec_v4_10M.tar -o models -txt_path /home/word_space/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt -o models ##样本规则整理 ``` 16位字符 例如: 6C20240002EJ02Hb 规则如下: 第一位字符 0-9的数字随机一个; 第二位字符 A-Z(大写字母)随机一个 第三-十位为 年月日 第十一、十二: A-Z(大写字母)随机一个 第十三、十四位: 0-9的数字随机一个 第十五位: A-Z(大写字母)随机一个- 第十六位: a-z 随机一个 ``` ## 文本识别 ``` python -m paddle.distributed.launch --gpus '0' --log_dir='./log/rec' tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml python tools/export_model.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_hgnet.yml -o Global.checkpoints=./output/rec_ppocr_v4_hgnet/latest Global.save_inference_dir=./output/lixian_inferV4_rec python tools/export_model.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.checkpoints=./output/rec_ppocr_v4/latest Global.save_inference_dir=./output/rec_v4_10M 测试文本识别的推理部分: python tools/infer/predict_rec.py --image_dir="./2024-11-28/crop_img" --rec_model_dir="./output/rec_v4_10M" 检测模型和识别模型分别fine-tune并导出为inference模型之后,可以使用如下命令进行端到端推理并对结果进行可视化 python tools/infer/predict_system.py \ --det_model_dir=output/models/der_infer_20221127 \ --rec_model_dir=output/models/lixian_inferV4_rec \ --image_dir=./2024-11-28 \ --save_crop_res=False \ --draw_img_save_dir=./one_det_output1 \ --crop_res_save_dir=./two_rec_output ``` ## 文本检测调参过程 ``` name: DBPostProcess thresh: 0.3 box_thresh: 0.6 max_candidates: 1000 unclip_ratio: 2.4 ``` ## 文本检测微调 ``` 基于ch_PP-OCRv3_det_slim预训练模型微调 python -m paddle.distributed.launch --gpus '1' --log_dir='./log/det_log' tools/train.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml ``` ## 在RapidAI/PapidOCR中测试onnx模型的结果 ``` pip install rapidocr_api # 指定模型 export det_model_path=/home/word_space/PaddleOCR/output/models/xxz_det_infer_1213/xxz_det_infer_1213.onnx export rec_model_path=/home/word_space/PaddleOCR/output/models/lixian_inferV4_rec/lixian_inferV4_rec.onnx rapidocr_api -ip 0.0.0.0 -p 9005 -workers 2 ``` ## 2024/12/5 模型组合训练评估 * 多个模型组合训练,评估指标 详情见:[模型组合训练评估](random_image/readme.md#模型组合) ## 2025/1/20 据模型评估及错误字符统计 详情见:[模型组合训练评估](random_image/readme.md#错误样本字符统计)