1.研究背景与意义
项目参考AAAI Association for the Advancement of Artificial Intelligence
随着教育的发展和普及,学生人数的增加和教师的工作量也随之增加。传统的作业批改方式通常需要教师花费大量的时间和精力,而且容易出现主观评分的问题。因此,开发一种自动化的作业批改系统具有重要的意义。
近年来,计算机视觉和深度学习技术的快速发展为解决这一问题提供了新的可能性。OpenCV是一个广泛使用的计算机视觉库,提供了丰富的图像处理和分析功能。而YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,具有高效和准确的特点。结合OpenCV和YOLO,可以实现对学生作业的自动批改和评分。
作业自动批改计分系统的研究具有以下几个方面的意义:
-
提高教学效率:传统的作业批改方式需要教师花费大量的时间和精力,而且容易出现主观评分的问题。通过开发自动化的作业批改系统,可以大大提高教学效率,减轻教师的工作负担。
-
提高评分准确性:人工批改作业容易出现主观评分的问题,不同的教师可能会给出不同的评分结果。而基于OpenCV和YOLO的作业自动批改系统可以根据预先设定的评分标准进行客观评分,提高评分的准确性和一致性。
-
个性化教学:作业自动批改系统可以根据学生的作业情况和评分结果,为每个学生提供个性化的教学反馈和建议。通过分析学生的错误和不足,系统可以针对性地提供相应的学习资源和指导,帮助学生提高学习效果。
-
学术研究的推动:作业自动批改计分系统的研究涉及到计算机视觉、深度学习和教育评估等多个学科领域的交叉,对于推动相关学术研究具有重要的意义。通过研究和开发这一系统,可以探索和应用计算机视觉和深度学习技术在教育领域的应用,为教育评估和教学改进提供新的思路和方法。
综上所述,基于OpenCV和YOLO的作业自动批改计分系统具有重要的研究背景和意义。通过开发这一系统,可以提高教学效率和评分准确性,实现个性化教学,并推动相关学术研究的发展。这将对教育领域的教学改进和学生学习效果的提高产生积极的影响。
2.图片演示
3.视频演示
基于OpenCV和YOLO的作业自动批改计分系统_哔哩哔哩_bilibili
4.系统流程图
本系统运行流程如图所示。首先用高拍仪拍照获取试卷图像,试卷图像是实时显示在软件界面中的,截得图像后将其做预处理,然后提取图像中的手写字符信息,进行剔除防止干扰,识别判定的答案、计算最终分数,然后将最终成绩存储并分析。
5.核心代码讲解
5.1 Grader.py
以下是我认为最核心的部分封装为类:
class HomeworkGrader:
def __init__(self, yolo_model_path):
self.yolo_model_path = yolo_model_path
def _detect_answers(self, image):
results = [("right", 0.9, (50, 50, 150, 150)),
("false", 0.8, (200, 200, 300, 300)),
("half", 0.75, (350, 350, 450, 450))]
return results
def _calculate_score(self, detections):
total_count = len(detections)
right_count = sum(1 for d in detections if d[0] == "right")
half_count = sum(1 for d in detections if d[0] == "half")
if total_count == 0:
return 0
per_question_score = 100.0 / total_count
score = right_count * per_question_score + half_count * per_question_score * 0.5
return score
def grade_homework(self, image_path):
image = cv2.imread(image_path)
detections = self._detect_answers(image)
score = self._calculate_score(detections)
......
这个类封装了一个作业批改器,其中包含了初始化YOLO模型、检测答案、计算得分和批改作业的功能。grade_homework
方法接受一个作业图片的路径作为输入,然后调用_detect_answers
方法检测答案,再调用_calculate_score
方法计算得分,最后在图像上标注检测结果并显示批改后的作业。_detect_answers
方法和_calculate_score
方法分别用于检测答案和计算得分,可以根据实际情况进行修改。
这个程序文件名为Grader.py,它是一个作业批改器的类。该类有一个构造函数__init__
,接受一个YOLO模型的路径作为参数,并将其保存在self.yolo_model_path
中。
该类还有三个私有方法:
_detect_answers
方法使用YOLO模型来检测图片中的答案。它返回一个列表,列表中的每个元素是一个元组,包含答案的类别标签、置信度和边界框坐标。_calculate_score
方法根据检测到的答案类型计算得分。它统计了总共的答案数量、正确答案的数量和半对答案的数量,并根据一定的规则计算得分。grade_homework
方法对给定的作业图片进行批改和计分。它首先读取作业图片,然后使用YOLO模型检测答案,接着计算得分。最后,在图像上标注检测结果并显示批改后的作业。
整个程序的功能是使用YOLO模型来检测作业图片中的答案,并根据检测结果计算得分,最后在图像上标注检测结果并显示批改后的作业。
5.2 PaperProcessor.py
class PaperProcessor:
def __init__(self, image_path):
self.image = cv2.imread(image_path)
def resize_image(self, height=800):
"""调整图像大小"""
h, w = self.image.shape[:2]
ratio = height / float(h)
new_dim = (int(w * ratio), height)
resized = cv2.resize(self.image, new_dim, interpolation=cv2.INTER_AREA)
return resized
def thresholding(self):
"""图像阈值化"""
gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
return thresh
def correct_skew(self, image):
"""图像倾斜矫正"""
coords = np.column_stack(np.where(image > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
return rotated
def remove_handwritten(self):
"""手写字符图像去除"""
# 这里简单使用阈值化和形态学处理来去除一些手写字符
thresh = self.thresholding()
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
return opening
def morphological_processing(self):
"""形态学处理"""
# 这里以膨胀为例
thresh = self.thresholding()
kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(thresh, kernel, iterations=1)
return dilated
def denoise(self):
"""图像去噪"""
# 使用高斯滤波进行去噪
......
PaperProcessor.py是一个用于处理纸张图像的程序文件。它包含了一个名为PaperProcessor的类,该类具有以下方法:
-
__init__(self, image_path)
:初始化方法,接收一个图像路径作为参数,并使用OpenCV库的imread
函数读取图像。 -
resize_image(self, height=800)
:调整图像大小的方法,接收一个可选的参数height,将图像的高度调整为指定的值,并保持宽高比例不变。 -
thresholding(self)
:图像阈值化的方法,将彩色图像转换为灰度图像,并根据阈值将图像二值化。 -
correct_skew(self, image)
:图像倾斜矫正的方法,接收一个二值化图像作为参数,通过计算图像中非零像素的坐标,确定图像的倾斜角度,并对图像进行旋转矫正。 -
edge_detection(self)
:边缘检测的方法,将彩色图像转换为灰度图像,并使用Canny算法进行边缘检测。 -
remove_handwritten(self)
:手写字符图像去除的方法,通过阈值化和形态学处理,去除图像中的一些手写字符。 -
normalize_segment(self)
:勾叉归一化分割的方法,根据具体情况实现。 -
morphological_processing(self)
:形态学处理的方法,以膨胀为例,对图像进行形态学处理。 -
denoise(self)
:图像去噪的方法,使用高斯滤波进行去噪。
这些方法可以根据需要在PaperProcessor类的实例上调用,以对输入的纸张图像进行相应的处理操作。
5.3 ui.py
class YOLOv5Detector:
def __init__(self, weights='./best.pt', data='./data/coco128.yaml', device=''