百度魅族手写四则运算识别比赛笔记
这个目前还是初赛,不得不说这个比赛的初赛其实还是蛮简单的.
要说复杂性表现在有些图片背景和文字颜色很相近,人眼根本看不清,所以某种意义上目前排行榜上所有的算法准确率可能都已经超过了人眼?哈哈
要处理这种拖的话可能需要更好的数据预处理方式,目前我试了二值化,可能是参数没调好,效果还不如不处理.
这次把代码放出来大家一起学习提建议哈.本人初学tensorflow,很多程序写的都不咋地.期待一起学习进步.
首先给出代码地址github code.另外,大家下载的同时不要忘记star一下哈.
目前的代码最后大概在官网的测试集上能够到99.97%的准确度.当然还是那句话,我也不保证运行了这个代码你也一定能到99.97%,毕竟参数初始化和训练轮数对于模型影响都是很大的哈.
这次的图片其实是生成的我感觉,如图所示,每张图片上会写一个运算式子.目标当然就是预测出来完整的式子并且给出计算结果.下面是官方的说明.
模型
这次采用的模型大家一看代码大概就能明白,用的很暴力.大致思路就是叠加了很多层卷积层+pooling层,而后到达全连接层.而后在这个全连接层后接7个(因为式子长度最大为7)16分类器(因为0-9加上三个运算符加上两个括号加上空白一共16种可能),这7个分类器分别计算loss而后反向传播迭代模型.因为很简单就不多说了.
主要说下我在这之上做的小小修改.以下面代码为例子:
with tf.variable_scope('digit2'):
h = tf.layers.dense(self.num1,units=self.CLASSNUM)
dense = tf.layers.dense(hidden10, units=self.CLASSNUM)
self.num2 = tf.add(h,dense)
可以看到我在预测第二个数字或者符合的时候是tf.add(h,dense),分别是上一个分类器的输出和这一个分类器的输出这样直接加起来.这里我主要考虑的是相邻两个符合的相关性.
举例来说左括号后面一定会接一个数字而不可能是运算符,一个运算符右边不可能再接一个运算符这样.这样算是增加了一下类似于序列关系这样的东西.效果的话其实在99.9%这么高的准确度的量级上是看不出什么提升来的..
再者我还加了一个预测式子长度的输出.这个的话我感觉这个加入可以更好的提升准确度,因为网络预测长度还是很靠谱的,那么网络就可以根据长度去切分图片进行分别预测这样的.
综上,这是一个端到端的模型,直接输入图片直接输出识别结果,省去了切图的过程.思路的话是借鉴了几年前Google曾经用在街景图片里门牌号识别的模型,不过估计google现在早不用这样原始的模型了...那篇论文的名字是[Multi-digit Number Recognition from Street View
Imagery using Deep Convolutional Neural Networks].
这篇论文里还猜想为什么这样的端到端可行呢,可能是网络很深,所以前几层学会了切图后几层学会识别这样的.
另外,这个东西也有很多人是拿CTCloss做的,效果也不错.并且从原理看来,ctc似乎是更加好的.不过ctc的缺点是训练速度会慢,这个看使用的机器吧,我这里跑ctc还是略微有点吃不消的.