笔迹识别(writer recognition)是生物特征识别的一个重要分支.对于每个书写者而言,其笔迹总体上具有相对稳定性,而笔迹的局部变化则是每个书写者笔迹的固有特性;而对于不同的书写者而言,其笔迹的差别则比较大[1].基于这种特性,笔迹识别是一种可行的身份鉴别方法.
前言
目前的笔迹识别方法或多或少都要用到一些传统方法,如切割字符、特征提取等过程.这些方法比较常用的有投影法、滴水法、HOG特征、Gabor特征、SIFT特征等.
在提取特征后,使用机器学习方法,如KNN、SVM等对笔迹进行分类识别,现有的文献显示出不错的结果,如DeepWriter对 300 个作者,输入一个汉字,识别准确率达到 93.85%[3].基于这种光明的前景??,我也抱着玩一玩的心态去尝试一下这个项目.
我的想法是笔迹识别就是图像分类,使用ResNet、VGG等网络,把处理好的笔迹图像拿去训练应该就能出结果.当我想找公开的数据集时,碰壁了,文献中提到的数据集都比较古老,下载网站已经无法访问,或者是有笔迹图像,但是没有一一对应的作者身份.
在这种情况下,我准备自制数据集,在互联网上以"手写"、"笔记"、"作文"等关键词搜集笔迹图片,最后构成了有740人的笔迹数据集(就称作HTID吧,HTID_0放kaggle上了,有需要可以去看看).HTID_0有740人的笔迹数据,在训练集中每人有100张笔迹纹理图(这里我参照[4]的方法),每张纹理图大小为160*160像素,内含5*5个单字笔迹(单张纹理图内不会出现相同的单字笔迹),每个单字笔迹大小为32*32像素(单字切割后先进行四周白边切除,然后大小归一化到32*32).
测试集中,总共有11047张纹理图,是由每个人随机生成10到20张纹理图,测试集的标签我没有上传??,如果要评估自己的模型请把训练集切开使用或者去kaggle下面留言.我使用了ResNet18和mobilenet_v3_large进行测试,在测试集上的准确率分别为98%和99.17%.准确率那么高???
我也测试了一下传统方法,提取了Gabor特征,结果如下:
方法 | 测试集准确率 |
---|---|
KNN,k=100,无归一化 |
13.80% |
KNN,k=100,MinMaxScaler |
30.17% |
KNN,k=100,StandardScaler |
28.29% |
Naive Bayes classifier |
24.98% |
XGBoost,learning_rate=0.1, n_estimators=200, max_depth=3 |
39.59% |
只能说惨不忍睹......
HTID_0这个数据集在设计上有缺陷,含有且不止含有以下缺陷:
- 每个人的原始笔迹图像进行单字切割后构成这个人的笔迹库,每张纹理图在生成时会从中随机挑选25个单字然后再打乱构成一张纹理图.测试集和训练集没有对笔迹库进行分割,使用的是同一笔迹库生成纹理图,也就意味着数据泄露了,训练集中的单字可能出现在测试集中.
- 原笔迹图像上的直线等非笔迹元素使用OpenCV进行检测并覆盖,存在单字笔迹不完整的情况.单字切割是使用投影法进行的,可能切错.
做这个数据集我主要验证了两件事:笔迹识别就是图像分类;传统方法的单字切割效果不好(而且调参太费人了,不能一条龙直接过).
其他内容在下一篇文章,包括新数据集生成方法、模型架构以及一些细节,目前实验已经完成,在新数据集中,测试集准确率为top_1为92%,top_5为98%
参考文献
[1] 丁晓青. (2012). 《计算机笔迹鉴别与验证的理论和方法》. 清华大学出版社. ISBN:9787302283553.
[2]“【OCR技术系列之二】文字定位与切割 - 最难不过二叉树 - 博客园,” Cnblogs.com, 2015. Available: https://www.cnblogs.com/skyfsm/p/8029668.html
[3]L. Xing and Y. Qiao, “DeepWriter: A Multi-Stream Deep CNN for Text-independent Writer Identification,” arXiv.org, 2016. Available: https://arxiv.org/abs/1606.06472
[4]“笔迹鉴别 - 文章分类 - 吕震宇 - 博客园,” Cnblogs.com, 2015. Available: https://www.cnblogs.com/zhenyulu/category/47600.html