OCR实践-问卷表格统计

news/2025/3/12 19:26:36/文章来源:https://www.cnblogs.com/caibucai/p/18636788

前言

书接上文

  1. OCR实践—PaddleOCR
  2. OCR实践—Table-Transformer

本项目代码已开源 放在 Github上,欢迎参考使用,Star

table_process_tools

主要功能说明:对手动拍照的问卷图片进行统计分数(对应分数打对号),单张问卷各项得分写入excel文件,并汇总所有图片得分到 excel

模型

基于前面的模型知识,完成了这一需求

首先涉及到的模型(在技术测试过程中,也发现了一些效果更好的模型,放在后续迭代过程中加入)

表格定位模型,使用ppstructure

表格特征编码模型和表格结构识别模型 分别是 Detr,和 微软的table-transformer-structure-recognition

字符识别模型,使用 PaddleOCR

对号处理模型,使用 微调的Yolov8n-cls(Yolov8n-det 也可以)

模型的加载统一放在 ModelManager.py 中实现

UI

image-20241225161336794

UI,是用pyqt5简单实现的界面,主要包括

简单的进度展示

简单的图像状态展示

处理图像展示

打开单张图片、打开文件夹、以及 开始处理的三个按钮

其中模型加载,以及表格图像处理都是耗时操作,为了避免主进程阻塞,导致界面卡住,使用了 Worker 封装然后用线程执行,多提升点用户体验,在Workers.py 中定义

UI层逻辑

如有问题,欢迎留言、私信或加群交流【群号:392784757】

模型加载

self.model: TableProcessModel = None
self.thread = None
self.worker = None# load model by thread
self.load_model()

load_model函数

def load_model(self):self.thread = QThread()self.worker = ModelLoadWorker()self.worker.moveToThread(self.thread)# connectself.worker.model_loaded.connect(self.on_model_loaded)self.thread.started.connect(self.worker.run)self.thread.finished.connect(self.thread.deleteLater)#self.thread.start()

表格处理

def process_images_v2(self):if self.model is None:QMessageBox.information(self, 'info', "Model has not been loaded successfully! Please wait")returnif len(self.images_need_process) == 0:QMessageBox.information(self, 'info', "No Image loaded! Please load images")returnself.process_button.setEnabled(False)self.thread = QThread()self.worker = ImageProcessWorker(self.images_need_process, self.model, log=True)self.worker.moveToThread(self.thread)self.worker.image_processed.connect(self.update_ui)self.worker.finished.connect(self.on_processing_finished)self.worker.show_signal.connect(self.load_image_on_screen)self.thread.started.connect(self.worker.run)self.thread.start()

模型加载Worker

class ModelLoadWorker(QObject):model_loaded = pyqtSignal(object)def __init__(self):super().__init__()self.model = Nonedef run(self):try:self.model = TableProcessModel()except Exception as e:print('error loading model', e)else:self.model_loaded.emit(self.model)

Workers

如有问题,欢迎留言、私信或加群交流【群号:392784757】

图像(表格)处理 Worker

class ImageProcessWorker(QObject):image_processed = pyqtSignal(str)finished = pyqtSignal()show_signal = pyqtSignal(int)def __init__(self, images, model:TableProcessModel,log=False):super().__init__()self.images = imagesself.processor = modelself.log = log@pyqtSlot()def run(self):for i, image_path in enumerate(self.images):try:self.show_signal.emit(i)# 处理图片if self.log:print('processing ', image_path, '--->', end='')self.processor.run(image_path)if self.log:print('done')time.sleep(0.5)self.image_processed.emit(f"Processed: {image_path}")except Exception as e:self.image_processed.emit(f"Error processing {image_path}: {str(e)}")self.finished.emit()  # 处理完成

在具体执行时,交由线程处理,避免了主线程的阻塞

表格处理模块 TableProcess.py

涉及到的模型,表格定位模型、表格特征编码和表格结构识别模型

其中表格处理模块 在完成结构识别后,会调用统计分数模块,二者存在一定的低耦合性,但主要逻辑还是互相分离,比较清晰,也方便适配其他业务逻辑,只需要修改或添加 后面的业务模块,如统计分数

统一调用接口

def run(self, next_image_path):try:self.reset_results()self.image_path = next_image_pathself.load_image()self.initialize_cache_dir()self.run_parse_table()self.score_eval.eval_score()self.score_eval.to_xlsx()except Exception as e:print('run error ', e)

核心函数 run_parse_table()

def run_parse_table(self):table_image = self.infer_locate_table() # bgrif len(self.locate_table_bbox) == 0:raise Exception("定位表格失败")table_image = Image.fromarray(cv2.cvtColor(table_image,cv2.COLOR_BGR2RGB))target_sizes = [table_image.size[::-1]]self.encoding_for_table_split(table_image)if self.table_split_result['encoding'] is None:raise Exception("表格特征编码失败")self.infer_split(self.table_split_result['encoding'], target_sizes)if len(self.table_split_result.keys()) <= 1:raise Exception("表格切分失败")self.parse_table_split_result()# visualize first for debugif CACHE:self.draw_boxs(table_image.copy(), cut_cell=False)self.setup_score_eval(table_image)

整体流程:表格定位 -> 表格图像编码 -> 表格结构识别 -> 表格分数评估

中间图,settings.py 中提供了 CACHE = True 开启,默认False 关闭

middle_images

其中

self.infer_locate_table()

self.encoding_for_table_split(table_image)

self.infer_split(self.table_split_result['encoding'], target_sizes)

分别涉及了模型的推理

完整代码,请前往 Github 下载查看

如有问题,欢迎留言、私信或加群交流【群号:392784757】

统计分数模块 ScoreEvaluation.py

涉及到的模块,字符识别模型、对号处理模型

主要函数 eval_score()

def eval_score(self):for row_i in range(self.n_row):if row_i == 0:continuescore_boxs = self.cells[row_i*self.n_col +self.score_col_start_idx:row_i*self.n_col+self.score_col_end_idx+1]line_score = self.eval_line_score(score_boxs)self.row_scores.append(line_score)self.score_history.append((f'{self.cur_image_name}_score.xlsx', sum(self.row_scores)))

eval_line_score() 评估每一行得分,涉及到模型推理,以及顺序的判断

完整代码,请前往 Github 下载查看

性能测试

4060 8G 16G内存 i9-13900HX

100张图片 GPU 3.5s/张,CPU4.6s/张

注意事项

编程过程注意

  • 使用一定的方法,防止模型重复加载(一次加载,多次推理)

  • paddle的模型 GPU的使用应该是自动管理的,use_gpu = True;其他模型的GPU推理,需要自行管理,同时需要设置 输入 和 模型 所在设备位置一致 CPU/GPU

  • 模型的推理与解析,需要先了解模型输入输出,根据官方demo/sample学习;然后结合自己的需求修改;多Debug;

  • 不同模型默认使用的图像读取,有的是 PIL.Image,或者是 cv2.imread() ,读取后送入模型处理,发现模型结果有一定区别,甚至完全不对,当发现你的模型结果很奇怪,不妨查看一下 输入

  • 耗时操作不要在主线程做【我的模型加载在ui初始化里完成,虽然使用了额外线程去做,但还是会影响到主线程,主界面,有大佬知道怎么处理,还请指点!!!】

  • 对于某些操作,如处理单张图片和文件夹多张图片 应该要统一;加载图片接口统一 不要分别实现

  • 注意资源的清理,临时变量的清理

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

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

相关文章

blog-3

前言 在过去的几周内,我们完成了家居强电电路模拟程序-3以及 家居强电电路模拟程序-4的练习,涉及多个知识点和编程技巧。整体来说,这两次题目集共包含了2道题目,题目难度逐步增加。(折叠代码是不在行列计算内的,只是我觉得结合代码能讲的更清楚我的思路,由于上次可能因为…

3.1美化网页元素

1.为什么要美化网页有效的传递页面信息美化网页,页面漂亮才能吸引用户凸显页面主题提高用户体验span标签:重点要突出的字,使用span标签套起来 字体样式: 文本样式: 1.颜色 2.对齐方式 3.首行缩进 4.行高 line-height=height 可以实现上下居中 5.装饰(下划线)

nacos根据业务需要自定义命名空间

创建个订单的命名空间 配置列表这里就有了 本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18636783

平芜尽处是春山

这个作业属于哪个课程软件工程2024 这个作业要求在哪里 个人总结 这个作业的目标 平芜尽处是春山:我的软件工程之旅学号 102202130📖平芜尽处是春山:我的软件工程之旅 📝总体回顾 在2024年,软件工程的出现,使我的大学生活变得异常繁忙,陪伴我度过了许多漆黑的夜晚,也…

Amazon Bedrock 实践 - 利用 Llama 3.2 模型分析全球糖尿病趋势

本文将探讨如何在 Amazon Bedrock 上,使用 Meta Llama 3.2 90B Instruct 模型来分析全球不同国家或地区的糖尿病患者的患病率分布数据。黄浩文 资深开发者布道师 亚马逊云科技 拥有电信、互联网以及云计算等行业超过 20 年的丰富经验,曾任职于微软、Sun 和中国电信。他目前专…

释放自我,智界新S7成为年轻人最爱的“第三空间”

年轻人最喜欢的时尚潮流是什么? 是音乐,是摇滚,是轰趴! 要不怎么说,国内最懂年轻人的汽车品牌,还得是智界呢。 12月25日,紧跟年轻人潮流的智界汽车,举办了“智界「7」妙派对夜直播歌会”活动,并邀请到了果味VC、旅行团乐队以及“小七”赖美云一起狂欢。 值得关注的是,…

记录一些AI实践课程的课后作业

0. 前记 创建这个随笔的想法其实也很简单,这个学期因为有一些课程需要线下上课所以回学校上了AI实践的课程,然后做了几个比较简单的AI实践项目,同时感觉有的项目还挺有意思,就记录一下。比较有代表性,之后有需要的话大概可以通过这篇随笔来简要回顾自己当时的一个做的策略…

【硬件测试】基于FPGA的QPSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章基于FPGA的QPSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR_fpga qpsk-CSDN博客的硬件片内测试版本。系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:…

uml类图总结

类图用于描述系统的静态结构,通过展示类、接口及其之间的关系,以便理解和设计系统 类图的基本元素 1.类(Class):类通常使用矩形框表示,其中包含三部分:类名、属性和方法。示例: 2.接口(Interface):表示方法类似类,但是会在矩形框顶部加上<<interface>>标…

任重道远

2024秋软工实践个人总结这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 课程总结学号 102201425一、学期回顾 1.1 回顾你对于软件工程课程的想象 在学期开始之前…

基于MPPT最大功率跟踪和SVPWM的光伏三相并网逆变器simulink建模与仿真

1.课题概述基于MPPT最大功率跟踪和SVPWM的光伏三相并网逆变器simulink建模与仿真。包括PV模块,MPPT模块,SVPWM模块,电网模块等。2.系统仿真结果 1不同光照大小的输出电压2不同光照大小的输出功率3不同光照大小的有功功率-无功功率 4不同光照大小的直流母线实时电压 5不同光…

请问云服务器数据库偶尔自动关闭的原因及解决方案

最近两天,我的云服务器上的数据库偶尔会自动关闭。这种情况导致了网站无法正常访问,影响了用户体验。请问这是什么原因引起的?是否有根本性的解决办法? 答案: 您好,根据您的描述,云服务器上的数据库偶尔自动关闭可能是由多种原因引起的。为了帮助您更好地理解并解决问题…