OCR实践—PaddleOCR

有个项目需求,对拍摄的问卷图片,进行自动得分统计【得分是在相应的分数下面打对号】,输出到excel文件

原始问卷文件见下图,真实的图片因使用手机拍摄的图片,存在一定的畸变,

在这里插入图片描述

技术调研

传统方法

传统方法,通过线检测 先对 表格进行矫正【仿射变换】,然后二次线检测 划分出不同表格cell,然后根据位置关系 拿到得分区的cell,利用统计手段或其他手段判断是否存在对号,同时得分区存在逆序关系,即有的问题是从 1-4,有的则是4-1,这样就需要对第一个数字区cell 即起始数字进行判断 是 1 or 4

深度学习方法OCR

了解到的方法就是paddle的OCR,从PaddleOCR Github出发

其中 PaddleOCR生态涉及

  1. 文本检测、印章文本检测
  2. 文本识别、公式识别
  3. 表格结构识别
  4. 版式分析(版面区域检测)
  5. 文档图像方向分类
  6. 关键信息抽取

在这里插入图片描述

提供的模型包括

  • PP-OCR 中文模型

  • PP-OCR 英文数字模型

  • PP-OCRv3 多语言模型

  • PP-Structure 文档分析

    • 版面分析+表格识别

    • SER 语义实体识别

    • RE 关系提取

PP-OCR https://paddlepaddle.github.io/PaddleOCR/latest/ppocr/overview.html 模型简介

PP-Structure https://paddlepaddle.github.io/PaddleOCR/latest/ppstructure/overview.html 简介

PaddleOCR/ppstructure/README_ch.md 代码库里的简介

吐槽,PaddleOCR 文档 有,但太乱了

当前使用的默认模型如下,第一次运行会自动下载

在这里插入图片描述

其中涉及的模型

分类cls,使用 ppocr_mobilet_v2

检测det,识别rec,使用PP-OCRV4

版式layout,使用 lcnet

表格结构table,使用 SLANet

针对项目需求,匹配的功能就是 通用表格分析(PaddleOCR 进行的一个整合),包括四个模块

  1. 表格结构识别模块 --> 表格结构划分 pp-structure

  2. 版面区域检测模块 --> 定位表格

  3. 文本检测模块 —> 检测文本

  4. 文本识别模块 —> 文本识别

整个流程,版面区域检测(定位出表格区域)—> 表格结构识别()—>文本检测(定位文字bbox)—>文本识别(识别出文字)

PaddleOCR实践

使用版本 PaddleOCR-2.7.0

在线测试 paddle 的通用表格识别结果 可以基本满足需求
https://aistudio.baidu.com/community/app/91661/webUI

  • 通用表格识别产线 - PaddleX 文档

其中针对打勾情况 (会无法检出 或者 误检);未打勾 可以正常检出 【可以进行反推】,效果如下
在这里插入图片描述

在这里插入图片描述

这里在线测试感觉还行【应该是还存在其他的后处理逻辑】,当我自行部署到本地测试推理,感觉有点差距

本地部署测试效果

在这里插入图片描述

其中测试 GitHub - xhw205/PaddleOCR_AlignText: PaddleOCR 输出结果的行对齐,表格制式图像OCR行对齐 在2.7.0 paddleOCR 会提示 第33行(y_i_points = [res[i][0][0][1], res[i][0][1][1], res[i][0][3][1], res[i][0][2][1]])表示数组越界

准备进行微调,适应当前数据

paddle 微调

根据文档建议,通用表格分析包括了 四个模块

表格结构识别模块 --> 表格结构
版面区域检测模块 --> 表格区域定位
文本检测模块 —> 文本未检测出来
文本识别模块 —> 文本识别错误

哪个检测效果不好,就去微调哪个模型;针对我的项目需求,感觉是 表格结构识别模块,无法对版式进行很好解析,因此对表格结构识别模型进行微调

  1. PaddleOCR/applications/中文表格识别.md 这个文件给出了整个训练的流程

  2. https://paddlepaddle.github.io/PaddleX/latest/module_usage/tutorials/ocr_modules/table_structure_recognition.html 给出了 表格结构识别模块使用教程,其中的二次开发部分,给出了微调的教程【使用了一个所谓的低代码PaddleX ,进行训练,进行了再一次封装,不是很推荐】

再次吐槽,PaddleOCR 相关文档,太乱了

总结:微调整体流程,准备图片数据—> PPOCRLabel 标注—> 使用PPOCRLabel 提供的脚本进行数据集制作划分—>预训练模型下载—>模型的配置文件修改—> 执行微调训练命令

数据标注

使用PPOCRLabel

pytho ppocrlabel.py --lang zh 启动

在这里插入图片描述

官方文档,表格识别任务标注

https://gitcode.com/gh_mirrors/pa/PaddleOCR/blob/release/2.7/doc/doc_ch/table_recognition.md

标注视频 过于简单【遇到的问题无法解决】

https://www.bilibili.com/video/BV1wR4y1v7JE/?share_source=copy_web&vd_source=cf1f9d24648d49636e3d109c9f9a377d&t=1998

数据标注问题(针对表格结构训练标注)

利用PPOCRLabel标注工具大批量自动标注自己的数据集-CSDN博客

【PaddleOCR-PPOCRLabel】标注工具使用-CSDN博客

提到

表格标注针对表格的结构化提取,将图片中的表格转换为Excel格式,因此标注时需要配合外部软件,打开Excel同时完成。在PPOCRLabel软件中完成表格中的文字信息标注(文字与位置)、在Excel文件中完成表格结构信息标注,推荐的步骤为:

  1. 表格识别:打开表格图片后,点击软件右上角 表格识别 按钮,软件调用PP-Structure中的表格识别模型,自动为表格打标签,同时弹出Excel

  2. 更改标注结果:以表格中的单元格为单位增加标注框(即一个单元格内的文字都标记为一个框)。标注框上鼠标右键后点击 单元格重识别
    可利用模型自动识别单元格内的文字。

    注意:如果表格中存在空白单元格,同样需要使用一个标注框将其标出,使得单元格总数与图像中保持一致。

  3. 调整单元格顺序:点击软件视图-显示框编号 打开标注框序号,在软件界面右侧拖动 识别结果 一栏下的所有结果,使得标注框编号按照从左到右,从上到下的顺序排列,按行依次标注。

  4. 标注表格结构:在外部Excel软件中,将存在文字的单元格标记为任意标识符(如 1,保证Excel中的单元格合并情况与原图相同即可(即不需要Excel中的单元格文字与图片中的文字完全相同)

  5. 导出JSON格式:关闭所有表格图像对应的Excel,点击 文件-导出表格JSON标注 获得JSON标注结果。

总结:好像正确的流程,先自动表格识别,打开excel 调整结构与图片表格一致 有文字 标注任意标识符都可,然后 导出 gt.txt

https://github.com/PaddlePaddle/PaddleOCR/issues/6242 表格标注存在的疑问

  1. 能否一次性标注所有表格?现有的模式是只能一张张标注么?
  2. 如何进行表格结构的调整?readme中给出的使用方法是“将表格图像中有文字的单元格,在Excel中标记为任意标识符(如1)”。请问能稍微详细介绍么?不是很明白这个操作。
  3. 在pplabel中对表格单元格内的文字进行位置标注和单元格内容重新识别的结果会直接修改已经生成的excel么?因为我在ubuntu系统下使用的wps,所以需要自己手动打开生成的exel文档,但是发现并没有随标注结果改变
  4. 单元格内容重新识别的功能对跨两行以上的文本识别效果比较差

官方回复

问题2:表格结构调整成和图片中表格一样的就行,比如有单元格合并,Excel对应调整,对于单元格里的内容随便写,不关心;

问题3:重新识别不会改变Excel;

单元格内的信息,只和 html 中的一个 td 标签内容对应

cells 里面的 tokens 信息不参与表格结构模型 训练,只有坐标信息有用

空单元格也是需要标注的

总结:这里是手动调整excel,在标注时 添加矩形框没有用,我在代码debug时也发现,就是基于生成的excel表生成的对应 html,也就是说 我们可以手动做一个对应的图片表格,去生成 html excel->gt.txt->show html

GitHub - WenmuZhou/TableGeneration: 通过浏览器渲染生成表格图像 提供了一个可视化的脚本,可用来可视化 输出的gt.txt,查看标注情况,如果渲染的 html 表格结构 和 图片的表格结构不一致,就要重新处理 excel.xlsx 【gt.txt 是由excel.xlsx 导出的,处理完后 重新导出gt.txt】

预训练模型下载

下载的是SLANet模型权重

模型列表 https://paddlepaddle.github.io/PaddleOCR/latest/ppstructure/models_list.html#22

根据自己的微调任务来下载预训练模型

模型配置文件修改

本文是做表格结构模型微调,所以使用表格配置文件,PaddleOCR-2.7.0/configs/table/SLANet_ch.yml
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b53723bf8b2549f3a8c31131792b2f0d.png#pic_center =500)

根据任务类型,选择配置文件

备份一份,进行修改 PaddleOCR-2.7.0/configs/table/SLANet_ch_for_finetune.yml

PaddleOCR-2.7.0/applications/中文表格识别.md ,可以根据这个修改配置

涉及到的有

Global:use_gpu:Trueepoch_num: # 训练轮次eval_batch_step: [0,10] # evaluation is run every 331 iterations after the 0th iterationpretrained_model: # 预训练模型路径
Train:dataset:data_dir:label_file_list:loader:batch_size_per_card:num_workers:
Eval:dataset:data_dir:label_file_list:loader:batch_size_per_card:num_workers:

根据需要进行修改

模型训练

执行命令,加载对应配置 -c

python3 tools/train.py -c configs/table/SLANet_ch_for_finetune.yml

模型转换与推理

模型转换+推理
https://blog.csdn.net/qq_41273999/article/details/135692215

验证精度—>训练引擎 推理单张图片 —> 模型导出inference模型 —> 预测引擎 推理

注意路径

# 验证精度
python3 tools/eval.py -c /home/aistudio/SLANet_ch.yml -o Global.checkpoints=/home/aistudio/PaddleOCR/output/SLANet_ch/best_accuracy.pdparams# 训练引擎 推理单张图片
python3 tools/infer_table.py -c /home/aistudio/SLANet_ch.yml -o Global.checkpoints=/home/aistudio/PaddleOCR/output/SLANet_ch/best_accuracy.pdparams Global.infer_img=/home/aistudio/data/data165849/table_gen_dataset/img/no_border_18298_G7XZH93DDCMATGJQ8RW2.jpg# 模型导出inference模型 
python3 tools/export_model.py -c /home/aistudio/SLANet_ch.yml -o Global.checkpoints=/home/aistudio/PaddleOCR/output/SLANet_ch/best_accuracy.pdparams Global.save_inference_dir=/home/aistudio/SLANet_ch/infer# 预测引擎推理python3 table/predict_structure.py \--table_model_dir=/home/aistudio/SLANet_ch/infer \--table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt \--  image_dir=/home/aistudio/data/data165849/table_gen_dataset/img/no_border_18298_G7XZH93DDCMATGJQ8RW2.jpg \--output=../output/inference

其他更详细命令可参考 PaddleOCR-2.7.0/applications/中文表格识别.md

微调效果

数据量太少,微调效果基本没有变化

再次吐槽,PaddleOCR文档有,但太乱了;问题回复有,但不理解

相关报错

paddlepaddle-gpu
https://www.paddlepaddle.org.cn/documentation/docs/zh/2.4/install/pip/windows-pip.html

通过修改 下载链接 来更换模型

https://blog.csdn.net/zhanglei5415/article/details/126603380

IndexError: list index out of range

这个越界错误,很多人都遇到,引发的原因也不一致

  1. if ‘bbox’ in cells[bbox_idx] and len(cells[bbox_idx][‘tokens’]) > 0: IndexError: list index out of range

官方给出说法,excel里的单元格数量和你在PPOCRLable里绘制的矩形框的数量不匹配。

  1. https://blog.csdn.net/haoDe9242/article/details/132078422

也遇到,排查说是 多了个 td

  1. 官方issue中 (回答 感觉并不太能解决疑问)

https://github.com/PaddlePaddle/PaddleOCR/issues/11572 也遇到

–> https://github.com/PaddlePaddle/PaddleOCR/discussions/12708

https://github.com/PaddlePaddle/PaddleOCR/issues/10243 —> box_type 设置不对
https://github.com/PaddlePaddle/PaddleOCR/issues/7857

  1. 解决paddle_ocr训练过程中IndexError: list index out of range的问题_paddleocr list index out of range-CSDN博客

https://blog.csdn.net/weixin_51302403/article/details/134818251)

  1. PaddleOCR list index out of range 问题_paddleocr识别训练训练数据提示list index out of range-CSDN博客

https://blog.csdn.net/bailanren/article/details/141815706

ZeroDivisionError: float division by zero

metric[‘fps’] = total_frame / total_time
ZeroDivisionError: float division by zero

https://bbs.csdn.net/topics/612067297

best metric acc:0

模型评估未开始导致

https://github.com/PaddlePaddle/PaddleOCR/issues/2299

AttributeError: ‘ParallelEnv‘ object has no attribute ‘_device_id‘

解决paddleocr报错之AttributeError: ‘ParallelEnv‘ object has no attribute ‘_device_id‘

https://blog.csdn.net/very_big_house/article/details/135402790

感谢

  1. ocr 专栏 OCR数字仪表识别_吨吨不打野的博客

  2. GitHub - WenmuZhou/TableGeneration: 通过浏览器渲染生成表格图像

  3. GitHub - xhw205/PaddleOCR_AlignText: PaddleOCR 输出结果的行对齐,表格制式图像OCR行对齐

  4. GitHub - RapidAI/TableStructureRec: 整理目前开源的最优表格识别模型,完善前后处理,模型转换为ONNX

  5. TableDetAndRec - a Hugging Face Space

  6. 表格检测与识别入门 - My Github Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套:初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…

【测试】Pytest

建议关注、收藏! 目录 功能pytest 自动化测试工具。 功能 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。 简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试:P…

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中,UI是不可缺少的模块,而在UI中又使用着大量的图片,特别是2D游戏还有很多精灵图片存在,如果不加以处理,会导致很高的Batches,影响性能。 比如如下的例子: Batches是9&#xff0…

环境和工程搭建

1.案例介绍 1.1 需求 实现⼀个电商平台 该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的. 巨多的会员, 巨⼤的流量, 微服务架构是最好的选择. 微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发" 1.2 服务拆分 拆分原则 …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后,发起的请求显示[no cookies]jmeter问题复现:这里同样使用postman进行重试,发现是可以正常获取数据的&…

操作系统课后习题2.2节

操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度,这个是由CPU的设计和它的硬件来决定的,具体的调度算法是不能提高CPU的效率的; 第3题 互斥性: 指的是进程之间的同步互斥关系,进程是一个动态的过程&#…

二叉搜索树 平衡树(c嘎嘎版)

定义: 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为…

Everything搜索实现

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 速度快还小巧, 于是花了约3周进行研究, 总结下学习过程中一些经验 实现分3部分完成 一. 解析NTFS 主文件表(MFT) 这一步是获取文件数据的唯一迅速且可靠的来源 NTFS_MFT_Parse.h #pragma once #include "NTFS_Bas…

23.DDD与微服务

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现,也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

vscode 打开 setting.json

按下Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)来打开命令面板。输入open settings,然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----: 1、 html代码的行长度&am…

汽车电子元件的可靠性保障:AEC-Q102认证

AEC-Q102标准的起源与价值 随着汽车电子系统的日益复杂,电子器件必须能够在极端的温度、湿度、振动和电磁干扰等恶劣条件下保持性能。AEC-Q102标准由汽车电子委员会(AEC)制定,专门针对LED、激光二极管和光电二极管等光电器件&…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头,开发过程中遇到一个奇怪的事情,通过V4l2框架接口申请内存时,相同的板子,只是内存一个4G一个8G。4G的内存可以申请成功,8G就不行。提示“内存不足” 内存更大反而内存不足&…

RK356X camera 配置

目录 一、RK356x camera硬件 Mipi接口 DVP接口 二、软件链路 三、dts配置 DVP MIPI sensor->dphy->isp_vir 一、RK356x camera硬件 RK356X包含RK3566和RK3568,在camera方面,两颗芯片的软硬件是兼容的,共有两种硬件连接方式:DVP和MIPI。 Mipi接口 图一 如图…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…

GLM4模型详解 - 智谱AI开源大模型全面解析

&#x1f4da; 2024年6月5日,智谱AI在开发者大会上正式开源GLM-4-9B系列大模型。本文将全面解析GLM4的技术特点、部署方案和应用场景。 GLM-4-9B 模型具备了更强大的推理性能、更长的上下文处理能力、多语言、多模态和 All Tools 等突出能力。 “All Tools” 一、模型概述 1.…

ssm-day04 mybatis

mybatis是一个持久层框架&#xff0c;针对的是JDBC的优化 简化数据库操作&#xff0c;能进行单表、多表操作&#xff0c;在这个框架下&#xff0c;需要我们自己写SQL语句 Mapper接口和MapperXML文件就相当于Dao和Dao层的实现 通常将xml文件放在resources包下 &#xff0c;放在…

观测云亮相 Doris Summit,展示流式聚合创新技术

01 技术亮点&#xff1a;重新定义流式聚合的效率与体验 在演讲中&#xff0c;熊豹详细介绍了 GuanceDB 如何支撑观测云的全量业务场景&#xff0c;并分享了 SelectDB 在处理复杂查询中的应用与挑战。从动态表结构管理到函数下推优化&#xff0c;观测云通过灵活的架构设计有效解…

qt中tr的使用

在 Qt 中使用 tr 函数对字符串进行翻译时&#xff0c;通常会通过 Qt Linguist 工具来处理翻译。以下是一个基本的步骤说明&#xff0c;展示如何将 QPushButton *btnnew QPushButton(tr("Hello World"),this); 翻译成其他语言&#xff0c;比如中文&#xff1a; 1.创建…

基于X410的LabVIEW FPGA跳频通信系统开发

跳频通信系统是一种高效的无线通信技术&#xff0c;通过在多个频率间快速切换&#xff0c;提高抗干扰能力和信号安全性。以NI USRP X410为硬件平台&#xff0c;利用LabVIEW FPGA实现一个实时跳频通信系统&#xff0c;涵盖信号生成、触发控制、接收检测及实时数据处理。 系统架构…