机器学习领域有很多现成的数据集,它们由个人或组织制作、整理,且向外界公开下载,比如在字符识别领域有mnist数据集等,数据挖掘领域有Iris,Adult数据集等。这些数据集为相关技术研究者提供了很大的便捷,有了这些资源,研究者就可以把更多的精力放在模型的研究上,可以说这些数据集的制作整理者对推动数据挖掘和机器学习的发展做出了巨大的贡献。
不过,在不少情况下,这些数据集未必能满足我们的需求,这时就要我们自己制作数据集了。不得不说,这次的字符识别项目中制作数据集的经历着实让我感受到了那些数据整理者的伟大。接下来,我把数据集的制作过程写下来,希望能给大家带来帮助和启发。
这次需要识别的字符共110个,其中英文大小写共52个,数字10个,中文46个,标点符号2个。大家都知道,深层神经网络是靠海量数据喂出来的,因此,每个字符都需要大量的样本支撑,为了解决样本数量的问题,我是这样做的:
- 1、首先将字符依次显示在白色背景上,然后以.jpg格式保存下来。
- 2、删去字符周围的空白像素,使字符顶格。
- 3、比较行数和列数,在较小的那个方向上两边均匀填充像素,直至行数和列数相等,这样,字符必然在行或者列的至少一个方向上是顶格的,而且整张图片是一个正方形。然后适当在图像的四周均匀添加背景像素。
- 4、对每一张图片以其法线为轴做-10°到10°步长为2°的旋转变换,并绕图像平面的x轴、y轴,做-10°到10°步长为1°的透视变换。每个字符可得到112121=4851张样本图片。
- 5、在这4851张图片中,随机选出147张图片用于验证和测试,剩余4704张用于训练。
大家可能会对第二步和第三步有所疑问,原因其实很简单,在caffe框架中,一个网络只接受一种大小的输入图片,这会带来两个问题:
- 1、每张图片中的字符处于不同位置,在图片中占的比例也不同,这对训练是不利的,其原因涉及到卷积,我会在后面具体说一下。
- 2、每张图片的长宽比不同,如果统一分辨率,有些图片会失真。
- 3、如果图像顶格,边缘的处理可能会有麻烦。这涉及到卷积操作在模型中的具体实现,后面会有详解。
图1 字符‘3’
因此,第二步的作用就是让字符在图片中占的比重最大,之后的文章中我会介绍这样做的好处。第三步则是避免出现图片失真,影响训练效果。
第四步的作用是提高模型的泛化能力,如果大家在看这篇文章之前已经做过功课,应该知道,卷积神经网络对仿射变换是有一定的抗性的。
这样,图片的训练集就做好了,当然,caffe不能直接从图片进行训练,还需要转换成.mdb格式才行。这些资料,网上有很多,这里就不赘述了。