项目介绍
基于 SegFormer 语义分割模型,识别手写笔迹生成掩码并去除,实现 AI 笔迹橡皮擦,擦除试卷中的手写笔迹。项目训练数据主要是试卷中的手写文字,因此在试卷上效果较好,在其他场景下的手写文字去除效果较差。
训练数据介绍
手写文字擦除训练数据分为源数据和目标数据,源图像数据是各种试卷图像(含有手写文字),目标数据是其对应的去除手写文字后的图像,如图所示。
数据集处理
生成手写文字掩码图
通过对比去除文字后和去除文字前的图像,对于大于设定阈值的地方,认为是需要除去的部分,置为 1 值,其余置为 0 值,以此生成 Mask,如下图所示:
图像输入预处理
输入的图像往往是矩形图像,为了保持横纵比,对于非正方形图像,填充图像边缘形成正方向图像作为输入,同时输入图像的大小一,且有些图像像素尺寸较大,因此统一下采样图片至 384 * 384。
数据增强处理
在训练时,对数据进行一定的增强,加入了随机水平反转和随机裁剪等操作,增强模型的泛化能力。
训练模型
模型主要是对SegFormer模型进行改进,将模型最后的输出层改成转置卷积上采样,通过局部区域特征上采样,不断补充精细结构来生成掩码结果,相较于无参数的上采样(如双线性插值),能够更好利用局部信息进行更高阶上采样。
一般的语义分割任务中的对象往往大尺寸的结构占主体,因此交叉熵损失就足够解决问题;但是手写痕迹的细化结构,会导致交叉熵损失效果不能起到最好效果,因此我们在交叉熵损失基础上还加入了 dice loss 针对细化结构进行有效惩罚。
最终的损失函数为:
式中,为交叉熵损失,
为平衡超参数,这里设置为0.5。
简单QT界面设计
代码调试
代码主要是涉及环境配置问题,第一个报错是SegFormer库的问题,版本一直报错,后来改了库代码;第二个报错是:ImportError: Qt bindings are not installed,虽然安装了但一直有问题,这个问题主要是在简单qt界面处出现的,后来查询后应该是pillow这个库版本不兼容导致的,将其降低为9.3.0解决。这个错误修改参考这篇博客。