[python]RadioActive切题系统-外包比赛

本系统利用Canny边缘检测和霍夫直线检测进行试卷预处理,通过百度OCR识别文字,结合自然语言处理技术自动划分题目,实现高效准确的试卷分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述bilibili宣传视频:https://www.bilibili.com/video/av53893090
github:https://github.com/blue-sky-sea/Paper-Question-recognition

当前系统及库版本

Windows:win10
anaconda: Anaconda navigator 1.9.2
opencv: Opencv3 3.1.0
AipOcr: 百度ocr库最新
re: re库,自带
python:Python 3.7.0

系统总体思路

在这里插入图片描述

预处理

在这里插入图片描述
透视矫正:目标找到纸的四个点然后矫正成右下图的样子
在这里插入图片描述
如何找到四个点?
有两大方法:Canny边缘检测和霍夫直线检测
边缘检测效果:得到近似轮廓从而获得四个点的位置
在这里插入图片描述
霍夫直线效果:找出所有‘’可疑‘’直线
在这里插入图片描述
根据条件和实际情况筛选出竖线和横线,计算交点即可找到纸张的四个点
在这里插入图片描述
在这里插入图片描述
最终可以根据实际情况综合考虑上述两个方法

双页试卷处理:
类似这种图片,需要把试卷分成左右两份
在这里插入图片描述
我们的思路是:
1.选取中间部分的区域(如40%~60%)我们考虑上下也各截取了一部分,将该区域二值化
在这里插入图片描述
2.找到连续白色区域最多,但又远大于字与字空隙的距离的区域
在这里插入图片描述
3.计算这个区域的中心线后,这条线就是我们要找的双页试卷的切割线(橙色)
在这里插入图片描述
这个方法甚至可以处理两页之间中间有直线的试卷。只要存在满足一定条件的空白区域就可以找到分割线。

文字识别

最初我们用teseeract库作识别,但是识别精度感人,jTesssBoxEditor训练字库的效果也很感人。
时间紧迫,我们就选择了百度Ocr的API接口作为文字识别的工具。缺点是,免费版低精度一天只有500次的使用次数。

自然语言处理

这一部分是划分题目的重中之重。
我们之前的想法是,判断识别出的某一段是否为题干,如果是题干,那么就把它和上面的部分划分开来。
但是,判断题干的效果并不好。原因在于:
1.ocr文字识别出现误差,没有识别出必要的题号等标志性词。
2.没有良好的分词。
3.正则表达式判断题干情感(比如:‘’请问…的答案是‘’、‘’以下…正确的是“ 这种一看就是题目的题干的结构)难以尽善尽美,往往需要后期debug才能补充;
简而言之,能否正确识别出题干,是我们最需要关心的。
只要识别出题干,那么上一题就被分出来了。

在这里插入图片描述另外还要考虑一下 注意事项,等无关紧要的东西不要被划分成题目。
划分出选择题的思路大致也和上面一样

划分题目区域

由于百度ocr接口除了文字还附带位置信息,所以我们只需要把每道题的题干+题目内容的位置信息合并就可以知道整道题的位置信息了。
ocr接口位置信息有4个变量(top,left,height,width),如下。
在这里插入图片描述一道题按理来说就包括了图中的两个红框的位置信息,只要综合考虑位置信息,一定可以得到整道题的位置信息。
在这里插入图片描述但是实际操作中出现了意外,一道题当最后一行压根没有识别出来怎么办。
解决办法是,根据下一道题的top信息来计算上一道题的height,这样就避免了 A.北京人遗址这一行没被识别出来的尴尬。
在这里插入图片描述

前端

综合考虑,我们还是使用了python的tkinter库制作前端。
很简单,很朴素。
在这里插入图片描述
包括了选择图片所在的文件夹,切题结果保存的文件夹,预处理,是否 人工校对,开始切题的功能。

如果开启了人工校对,切题完成后会出现校对页面。右边是原图,左边是切题结果。
在这里插入图片描述

以上

### 大模型在试卷切题中的技术实现 #### 背景介绍 随着预训练大模型的发展,其强大的效果、泛化能力和标准化的研发流程使其逐渐成为人工智能技术的核心基础[^1]。这些特性也为教育领域的智能化提供了新思路,尤其是在自动化处理方面,如试卷生成、题目切割和解析等。 #### 技术原理 试卷切题是指通过算法将一张完整的试卷图像分割成多个独立的题目部分。这一过程通常涉及计算机视觉技术和自然语言处理技术的结合。以下是基于大模型的技术实现方式: 1. **目标检测与特征提取** 利用目标检测框架(例如特征金字塔网络FPN)可以有效地定位试卷上的各个题目区域[^3]。通过对不同层次的特征进行提取,能够提高对各种大小目标(即题目)的检测精度。 2. **文本识别与语义理解** 预训练的语言模型可以帮助理解和分类题目内容。例如,在完成目标检测后,可以通过OCR技术将图片转换为可编辑的文字,并借助大模型对文字内容进行深入分析,判断题型以及难度等级。 3. **随机抽题机制优化** 结合题库管理系统的设计理念,可以在已有的大量标注数据基础上构建更加灵活高效的随机抽题策略[^2]。具体来说,就是利用机器学习方法预测哪些类型的题目组合最有利于评估学生知识点掌握情况的同时降低重复率。 4. **端到端解决方案** 整体来看,从原始扫描件输入到最后输出结构化的电子版试题列表,整个流水线都可以由深度神经网络驱动完成。这不仅提高了效率还减少了人为干预带来的误差风险。 ```python import cv2 from transformers import pipeline, AutoTokenizer, AutoModelForTokenClassification def detect_questions(image_path): # 加载目标检测模型 detector = pipeline('object-detection', model='facebook/detr-resnet-50') image = cv2.imread(image_path) results = detector(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) questions = [] for result in results: box = result['box'] cropped_image = image[int(box[1]):int(box[3]), int(box[0]):int(box[2])] # OCR 文字识别 text_extractor = pipeline('ocr', model="microsoft/trocr-base-printed") question_text = text_extractor(cropped_image) tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") model = AutoModelForTokenClassification.from_pretrained("dbmdz/bert-large-cased-finetuned-conll03-english") nlp_pipeline = pipeline("ner", model=model, tokenizer=tokenizer) ner_results = nlp_pipeline(question_text["text"]) processed_question = { 'image': cropped_image, 'text': question_text["text"], 'entities': ner_results } questions.append(processed_question) return questions ``` 此代码片段展示了如何使用现代深度学习工具链来执行基本的任务——从图像中找到并解释单独的问题项。 #### 总结 综上所述,采用先进的大模型架构和技术手段可以使传统纸质考试向数字化方向迈进一大步。它不仅能显著改善用户体验还能极大地方便后续的数据统计工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值