2024年第十四届MathorCup数学应用挑战赛B题思路分享(妈妈杯)
B题 甲骨文智能识别中原始拓片单字自动分割与识别研究
作为我国目前已知的最早形成的成熟文字系统,甲骨文是刻在龟甲兽骨上的具有重要历史价值的文字系统。其研究价值极为显著不仅对中华文明的起源研究具有重要意义,在世界文明的发展历程中也发挥了重要作用。在国家政策引导和学术界共同努力下,甲骨文研究已经进入一个全新的发展阶段。人工智能和大数据技术被应用于甲骨文全息性研究及数字化工程建设成为甲骨文信息处理领域的研究热点[1]。
甲骨文拓片图像分割被视为一项关键任务,在数字化工程领域具有重要意义。其核心目标在于通过数字图像处理技术和计算机视觉方法,在复杂背景下准确识别出具有清晰界限且相互独立的文字单元。这项技术是甲骨文字修复、形体复原与建模等工程的基础支撑[2]。然而,在实际应用中该技术面临多重挑战:首先受到点噪声、人工纹理特征以及固有纹理结构三类干扰因素的严重影响[3];其次由于获取手段(如拓片拍摄、相机拍照或扫描等)不同导致的干扰表现也存在显著差异;此外缺乏针对甲骨文字形态特征的独特先验认知限制了现有通用分割算法在区分甲骨文文字特征与各类干扰元素方面的有效性[4]。目前这类算法在实际应用中往往难以实现对文字目标与各类干扰要素的有效分离与判别,在处理复杂背景下的拓片图像时不可避免地存在一定的局限性与误差率;如何突破这一瓶颈并实现更加精确的文字区域提取仍是一个亟待解决的关键科学问题
如图1所示,在研究与展示领域中具有重要意义的一个关键环节是图像分割技术的应用。其中左侧是一幅完整的原始拓片样本,在右侧则经过精确处理后实现了对单个汉字单元的有效分离与识别。值得注意的是,在同一汉字的不同书写形式下可能会出现多种表现形态(即所谓的异体字现象),这种多变性无疑提升了识别过程的技术挑战性(如图2所示)。以"人"这一典型汉字为例,在其不同书写的形态下会呈现出丰富的变化特征。
图1甲骨文原始拓片和自动识别单字分割情况
图2甲骨文中“人”字的不同异体字
期望通过分析已标记甲骨文图像并提取其特征来进行建模,并进而完成对单一汉字在新图象中的自动分离与辨识。
问题1
对附件1中(Pre_test文件夹)提供的三张甲骨文原始拓片图片实施图像预处理工作,并提取其中的图像特征信息。随后构建针对甲骨文图像的预处理模型方案,并实现对甲骨文图像中干扰因素的识别与初步去除。
问题2
分析甲骨文原始拓片图像,并构建高效的甲骨文图像分割模型以实现对不同类型的甲骨文原始拓片图像的自动单字识别。通过多维度对模型性能进行全面评估,并参考附件2(Train文件夹)中的已标注数据集作为训练数据
分析甲骨文原始拓片图像,并构建高效的甲骨文图像分割模型以实现对不同类型的甲骨文原始拓片图像的自动单字识别。通过多维度对模型性能进行全面评估,并参考附件2(Train文件夹)中的已标注数据集作为训练数据
问题3
基于所构建的甲骨文图像分割模型,在附件3(Test文件夹)中处理200张甲骨文原始拓片图像,并将所得结果放置于' Test_results.x1sx' 中,请将其单独上传至竞赛平台系统。
问题4
基于前三个问题的研究聚焦于对甲骨文原始拓片图像的单字分割优化工作,请指导我们采用适当的方法完成对甲骨文原始拓片图像的文字识别任务。其中附件4中的Recognize文件夹提供了若干实例(这些实例不限于当前训练集范围,在必要时可参考外部资源),并请求针对测试集中的50张甲骨文原始拓片图像完成文字自动识别任务,并提供相应的识别结果。
参考文献
[1]高旭.基于卷积神经网络的甲骨文识别研究与应用[D].吉林大学,2021.
[2]Yabing S. Manifold and splendid: 120 Years of research on the oracle bone inscriptions
and Shang history[J]. Chinese Studies in History, 2020,53(4):351-368.
[3]宋传鸣,乔明泽,洪题.边缘梯度协方差引导的甲骨文字修复算法[J].辽宁师范大学学报(自然科学版),2023,46(02):194-207.
[4]Zhang C, Zong R, Cao S, et al.AI-powered oracle bone inscriptions recognition andfragments rejoining[C]I/Proceedings of the Twenty-Ninth Intemational Conference onInternational Joint Conferences onArtificial Intelligence.2021:5309-5311.
附件说明
附件下载链接
https://pan.baidu.com/s/1cp-DUwgS3cd8EFhBwXRHw2pwd=pflt
提取码:pflt
附件1:Pre_test文件夹
三张甲骨文图像(.jpg)
附件2:Train文件夹
该目录下包含甲骨文图片集合(共6150枚),每枚图片均附带其对应的标定文件(.json格式)。
其中"image_annotation"表示对应图像的注释信息,"annotation"代表图像上的标记信息。注释信息由四个数字构成的坐标编码,尾部的校验码用于标识该图像是否属于甲骨文字库:1.0表示该图像确实来自甲骨文数据库,而0.0则表明其不属于这一类别。注释信息用于标识该图像是否属于甲骨文字库
附件3:Test文件夹
实验数据集,在Figures文件夹中包含200张未注释的甲骨文图像(.jpg格式)以及Test_results.xlsx表格。
附件4: Recognize文件夹
用于甲骨文识别的训练数据集与测试数据集之间存在明显的区分。其中训练数据集中共有76种常见甲骨文字符,并附有与其相对应的异体字作为参考依据;而作为测试用例的50张真实原始拓片则展示了该技术在实际应用中的表现潜力。
附件5:MathorCup高校数学建模挑战赛历年优秀论文下载
该竞赛优秀论文集(2017-2022)已可通过以下途径获取:{https://mbd.pub/o/bread/ZZyUlJ9y}该平台不仅提供了丰富的资源库, 还专门整理了历届比赛的经典案例和参赛者的详细信息, 为研究人员和参赛者提供了便捷的服务
该任务涉及基于甲骨文原始拓片图像完成自动单字分割与识别的技术研究。该过程可划分为若干关键步骤进行系统性处理
思路与求解
问题 1: 图像预处理和特征提取
数据探索与清洗 :
对图像数据质量进行评估,并对存在缺失或损坏的数据进行相应的处理流程;实施格式标准化前对原始拓片图像进行预处理
图像预处理 :
-
采用图像增强技术中的直方图均衡化方法,从而提升图像对比度.
-
采用高通或低通滤波器来去除噪声信号,并列举了一些常见的处理方法,例如高斯滤波和中值滤波.
特征提取 :
- 通过应用边缘检测技术(包括Sobel和Canny边缘检测方法)来确定文字边界。
- 进一步分析纹理特征,并涵盖局部二值模式(LBP)、灰度共生矩阵(GLCM)等多种方法。因此能够提取丰富的纹理信息。
问题 2: 图像分割模型
模型设计 :
建议采用深度学习驱动的卷积神经网络架构进行图像分割任务求解,并推荐U-Net架构作为一种成熟的解决方案。该算法以其精确的空间分辨率重建能力著称,在医学图像分割领域展现出显著的优势。
模型训练 :
-
基于附录二中的标注样本用于构建训练集。
-
采用交叉验证法用于检验模型在不同数据分布下的表现。
模型评估 :
通过准确率、召回率和F1分数等多种指标对模型性能进行评估。
展开对模型误差的分析研究,以识别其存在的不足并提出优化建议。
问题 3: 单字分割的实际应用
模型应用 :
- 经过对模型的训练和部署,在附件3中的200幅图像上进行测试。
- 通过系统地完成对分割输出文件的数据处理和存储操作,在指定的结果文件中实现了数据的有效保留。
问题 4: 文字识别
文字识别模型 :
-
主要依赖于深度学习模型包括卷积神经网络(CNN)和循环神经网络(RNN),以实现自动化文字识别。
-
通过采用迁移学习方法,并结合已有的预训练模型结构,进一步提升分类准确率。
模型训练与验证 :
基于附件4提供的标注数据集对模型进行训练与验证;为了全面评估模型性能,在独立测试集上进行预测效果分析。
结果展示 :
- 生成识别结果,并对模型进行全面评估。
- 在识别过程中可能需要后续处理步骤,在这种情况下建议采用语义校正技术以确保识别的精确性。
示例代码(图像预处理和分割)
以下是使用Python和OpenCV进行图像预处理的基本代码示例:
import cv2
import numpy as np
def preprocess_image(image_path):
# 读取图像
image = cv2.imread(image_path)
# 灰度转换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 直方图均衡
equ = cv2.equalizeHist(gray)
# 高斯模糊去噪
filtered = cv2.GaussianBlur(equ, (5, 5), 0)
# 边缘检测
edges = cv2.Canny(filtered, 50, 150)
return edges
def segment_image(image):
# 假设已经加载并训练了一个模型 `model`
segmented = model.predict(image)
return segmented
# 图像路径
image_path =
'path_to_image.jpg'
preprocessed_image = preprocess_image(image_path)
segmented_image = segment_image(preprocessed_image)
# 显示结果
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读
此代码仅作为示例存在,在实际情况中需配合具体的数据集和任务需求进行详细设计与优化
