前言
最近环境还真是差,很多大厂裁员,锁HC,小公司也很多都在硬撑着,还有一些公司连续几个月没有发出工资了。这些都是无关主题的废话,还是说说最近参加的一个比赛吧,科大讯飞组织的 数学手写公式识别挑战赛。这个比赛参赛人数不是很多,大概就只有30个队伍,到我发稿日期,最好的成绩为整行准确率0.6465,我花了一个星期参赛,行准确率为0.52125,和最好成绩差的还是挺多的(12%, OMG),也发博记录一下我的调参过程吧(佛系参赛,自娱自乐)。
正式内容
先说说这个比赛的背景吧,近些年,OCR逐渐成为教育领域中不可或缺的技术,与常规汉字、英文的文字识别不同的是,公式符号更具歧义性且包含二维结构,因此公式识别往往更难,而其作为数理化生等学科场景下出现得非常高频的符号,公式识别的重要性日渐凸显。此次赛事也将围绕数学公式结构泛化性和多学科混合建模两个难点问题设定两项公式识别任务。
比赛数据方面,包含测试集、开发集和训练集,其中训练集包含15w条公式数据,分为数学、物理和化学三科,每科5w条数据,开发集其实就是验证集,1w条,测试集4k。对训练集中的数据进行了简单分析,图片尺寸差别很大,当高度固定为48个像素的时,图片宽度最大可以达到2000多像素,最小在100个像素以下,经过统计,80%图片尺寸宽度小于600以内。公式标签是用latex表示,所有字符大概有256个,出现次数最多的字符是‘{’ 和 ‘}’大概有361138个,有69个字符出现10以下。
在模型选择方面,公式识别的模型和一般的中文、英文识别不太一样,不能单纯的硬上CRNN架构,因为很多公式存在各种各样的结构,比如上下结构的分数、右上角的指数、带下标的公式等,所以一般来说,公式识别都会用到很火的注意力机制,经过我稍微的一调研,发现了一个叫MASTER-ocr的开源代码,号称在某次手写公式识别比赛中获得了第二名的好成绩,于是乎,我拿来train了一下,当然,其中还对这个源码进行了一些小小的不值一提的修改,才让这个模型跑起来。
1)第一次训练,基本上就啥参数也没有改,甚至连模型训练的字典都是从其他开源代码中拿过来的,字典长度高达可怕的700+,图片输入尺寸为48*480,optimizer的type是Adam,学习率设置为1e-4,batch size设置的是64,训练了100个epoch,最后获得了0.39的准确率
2)第二次训练,简单的分析了一下训练数据标签,发现字典总共也有256个,然后把字典长度改成256,其余参数不变,同样训练100个epoch,最终提交结果,获得了0.49的准确率
3)第三次训练,又简单的分析了图片尺寸,发现80%数据在将图片高度固定为48时,宽度都在600以内,所以将模型输入尺寸改为48*600,再将字典中出现次数小于10的字符去掉,其余参数不变,最终提交结果,获得了0.521的成绩
然后,我就没有了提交机会,因为每周只有三次,中间还提交过一些模型训练了70个epoch的预测结果,显示都没有最终训练100的好,感觉模型还可以再训练多一些epoch。
通过这个对比可以看出来,模型的字典长度、输入图片尺寸和训练的epoch数量,基本上都对模型精度有很大的影响
这是我的提交结果:
最后
总结一下这个比赛,因为是临时起意参加的,其实也没有太多时间去分析模型预测的结果为什么不对,大概看了一下图片,因为是真实场景下的手写公式图片,大多数情况下还是有些模糊的,也存在很多人肉眼也看不清楚的测试图片,所以有一些即使结构比较简单的公式也容易识别出错,当然还有很多结构比较复杂的公式,要做到整行识别对也比较难。
继续的优化思路的话有以下几点:(1)就可以先把测试集4000行,先自己标注一遍,然后分析一下错误的情况,再做 一些针对性的数据增强、或者数据的重采样;(2)换其他的一些带有注意力机制的模型尝试;(3)还有就暂时没有想到了