基于 SegFormer 语义分割模型的手写文字擦除系统设计

项目介绍

基于 SegFormer 语义分割模型,识别手写笔迹生成掩码并去除,实现 AI 笔迹橡皮擦,擦除试卷中的手写笔迹。项目训练数据主要是试卷中的手写文字,因此在试卷上效果较好,在其他场景下的手写文字去除效果较差。

训练数据介绍

手写文字擦除训练数据分为源数据和目标数据,源图像数据是各种试卷图像(含有手写文字),目标数据是其对应的去除手写文字后的图像,如图所示。

数据集处理

生成手写文字掩码图

通过对比去除文字后和去除文字前的图像,对于大于设定阈值的地方,认为是需要除去的部分,置为 1 值,其余置为 0 值,以此生成 Mask,如下图所示:

图像输入预处理

输入的图像往往是矩形图像,为了保持横纵比,对于非正方形图像,填充图像边缘形成正方向图像作为输入,同时输入图像的大小一,且有些图像像素尺寸较大,因此统一下采样图片至 384 * 384。

数据增强处理

在训练时,对数据进行一定的增强,加入了随机水平反转和随机裁剪等操作,增强模型的泛化能力。

训练模型

模型主要是对SegFormer模型进行改进,将模型最后的输出层改成转置卷积上采样,通过局部区域特征上采样,不断补充精细结构来生成掩码结果,相较于无参数的上采样(如双线性插值),能够更好利用局部信息进行更高阶上采样。

一般的语义分割任务中的对象往往大尺寸的结构占主体,因此交叉熵损失就足够解决问题;但是手写痕迹的细化结构,会导致交叉熵损失效果不能起到最好效果,因此我们在交叉熵损失基础上还加入了 dice loss 针对细化结构进行有效惩罚。

Dice=\frac{2|X \bigcup Y| }{|X|+|Y|}

L_{dice}=1-Dice

最终的损失函数为:

L=L_{ce}+\lambda \times L_{dice}

式中,L_{ce}为交叉熵损失,\lambda为平衡超参数,这里设置为0.5。

简单QT界面设计

代码调试

代码主要是涉及环境配置问题,第一个报错是SegFormer库的问题,版本一直报错,后来改了库代码;第二个报错是:ImportError: Qt bindings are not installed,虽然安装了但一直有问题,这个问题主要是在简单qt界面处出现的,后来查询后应该是pillow这个库版本不兼容导致的,将其降低为9.3.0解决。这个错误修改参考这篇博客

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种简单易学的编程语言,被广泛用于各种领域的开发。在人工智能领域中,Python也有着极大的应用价值。CNN,即卷积神经网络,是一种用于图像识别和处理的深度学习模型。 在笔迹识别中,CNN可以用于识别手写字体的图像。它的工作原理是通过多层卷积层和池化层来提取图像中的特征,并通过全连接层将这些特征映射到不同的类别。通过大量的样本数据训练CNN模型,它可以自动学习到字体的特征,从而进行准确的识别。 要实现Python的CNN笔迹识别,首先需要准备训练数据集和测试数据集。训练数据集包含大量带有标签的手写字体图像,用于训练CNN模型。测试数据集用于评估模型的性能和准确度。 接下来,需要选择合适的CNN架构。可以使用Python中的深度学习框架,如TensorFlow或Keras,来构建CNN模型。可以选择不同层数和不同的卷积核大小,以及其他超参数,来优化模型的准确度和性能。 构建好CNN模型后,需要将训练数据集输入模型进行训练。训练过程将优化模型的权重和偏置,以最小化损失函数。可以使用梯度下降等优化算法来加快训练过程。 训练完成后,使用测试数据集对模型进行评估。可以计算模型的准确率、召回率、精确率等指标,来评估模型的性能。 最后,可以使用训练好的模型进行预测。输入手写字体的图像,模型会输出其对应的字母或数字。 总之,Python的CNN笔迹识别是一种基于深度学习的图像识别方法,通过使用合适的CNN架构和训练数据集,可以实现准确且高效的手写字体识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值