Robust Reading的Task 4是今年才推出的比赛,与已经公开多年的Task1和Task2相比,Task4的样本是用手机随机拍摄的生活场景,不是刻意针对文字拍摄的。
Task1的图像样例
Task2 的图像样例
Task4的图像样例
比赛要求是只检测人眼可以看出来的文字,比较直观,不做过多赘述。
下面是一些我的感想吧。
代码部分
1. 推荐一些高效的开发语言
对于一些工具,不需要考虑性能的情况下,推荐用C#, Java, Matlab等解释型语言来进行编写。C#, Java在做交互工具方面的开发效率极高,很多类都是现成的,尤其是C#的智能感知列表是目前用户体验做的最好的;而Matlab的脚本可以做到在不建立工程的情况下实现一些小功能,比如修改文件名,后缀名,移动、复制文件等。
2. 一些比较好用的Matlab函数介绍,具体使用不做过多介绍,大家自行百度之吧
dir() 获取文件夹下的所有文件或者指定格式的文件
regexp(str_line, ‘\s+‘, ‘split‘) 将str_line以空格进行分割,C#中也有一样的函数,是string类下的split函数
regexp(str_line, ‘,‘, ‘split‘) 将str_line以逗号进行分割
inpolygon() 判断点是否在多边形内的函数
cp2tform() 透视变换函数
fp = fopen(‘test.txt‘, ‘r‘, ‘n‘, ‘utf-8‘); 以utf-8格式打开文件,文件头会有一个? 符合utf-8的编码方式
movefile() 移动文件
copyfile() 复制文件
CNN部分
CNN的特点是逐层提取特征,随着深度增加,提取的特征级别也越高,浅层一般是认为提取边缘特征或者颜色特征。
我将第一个Pooling层前的卷积都认为是浅层,这样CNN可以根据浅层的核大小分为两类,一类是Kernel Size=5,另一类Kernel Size=3。前者的设定在Caffe的样例里面非常常见,从可视化的角度来说,浅层的5×5能够表达更丰富的边缘信息,而后者Small Kernel只是在Ben Graham的论文[1]中见到,而且Ben Graham将网络结构设计的极其有规律,从Ben
Graham的结构中可以看出,他将结构信息转化到了大量的滤波器中,整个结构更像是一种编码,而3×3的Kernel并不算是一种浅层特征提取,因为3×3的Kernel能体现的边缘信息太有限了。所以说,我根据浅层卷积核的大小,大致将CNN分为两类,一类是逐层提取特征的CNN,另一类是逐层编码的CNN,但是这仅仅是一种理解,没有相关的实验做支撑。
从实验的过程来看,Ben Graham的结构非常小巧精致,训练起来要更快,对于小尺度的图像分类问题是很有效的。
一些小细节比如Leaky Relu代替了原来的Relu作为新的神经元激励函数,从对比实验上看Leaky Relu要比Relu好一些,但也不是绝对的,可以说是为网络细节的调整多了一个不错的选择。
样本部分
分类器结构的设计对于分类器训练的作用并不是特别大,因为论文摆在那里,开源的代码摆在那里,大家都会去试试,最后出来的结构都大同小异。而用什么样的数据进行训练是更为重要的。
其实过分依赖数据是分类器的缺陷,但是目前的判别模型又有哪个不依赖数据呢?
其他
1. 有一个清晰的系统框架,一定要清楚先做什么后做什么要做什么,这次比赛一个很大的失误就是没有很早的认识到连通部件提取的重要性,一开始没有把连通部件提取作为工作之一,结果到后面非常被动。
2. 尽量早做完系统,再去追究细节。这个问题并不是没有意识到,而是侥幸心理在作祟,一直是想万一这个改进会是分类器性能有很大改变,就可以给后面省下很多事情,结果是从没有出现过这么好的运气。不过也不是全然没有收获,做了这么多实验,感觉CNN的一个致命问题就是对于样本的数量与质量有很高的需求,CNN没有想象的那么好用。所以在深度学习这个方向,一味的追求数据集上的结果不是长久之策,反而是跟着别人的节奏,去解决深度学习中一些更有价值的问题是更长远的选择。
3. 良好的心态以及一个合适的冲刺时间。做有deadline的事情一定不能着急,不管出了多大的问题,第一个要想的是怎么能够用最高效的方式去解决,要花多大的时间以及人力成本;这样的比赛如果前期没有足够好的积累,肯定是在最后几天要熬夜的,前期不能熬夜,后面一定要提起精神来随时准备熬夜拼命。
4. 研究一下系统不同模块的互补性,可以事半功倍。比如训练CNN的模型,里面肯定有“疑难杂症”,但是很可能这些样本用MSER就很好解决,两者都不好解决的,可能用文本行聚合就轻松搞定,一个好的系统可以不是步步完美,互补也会得到很好的结果。
5. 对于工作要做时间估算。比如有100W的Large Patch样本要传到服务器进行训练,假如网络传输速度为10M/s,100W的样本差不多是25G,传到服务器要43min,假如还要对这些样本做扰动,至少要传输100G的数据,耗时为2.9小时,然后转为caffe能用的leveldb格式至少用1小时,整个过程下来,保守估计用时4小时,中间出点差错,可能一天都是在准备样本。而把扰动的工作放到服务器端来进行可以极大的缩减时间。
6. 定好标准:包括文件名命名格式,数据是二进制还是ANSI,建议用二进制形式的数据文件,可以通过文件大小来检查文件的完整性,而且读写也方便。
7. 将正确分类以及错误分类的样本挑出来查看,有利于分析分类器的缺陷,以及改进的方法。