util.py
这个文件里主要提供了5个函数,提供给package.py使用,特别是对特征值的计算。
1 | import Image,os,ImageFilter |
- blur1函数实现的是对图片先进行灰度化,再进行二值化,结合table1数组的使用,将亮度大于某一较低阈值的统统设为纯白,否则为纯黑。这样就只保留了字符的骨架,生成的图片十分便于特征值的测量与计算,而且极大消除了噪声的影响。
- blur2函数实现的是对图片的模糊化再二值化,为的是将图片变“粗”一点,便于后续的学习(这也是后来偶然发现的提高学习准确性的方法)。注意模糊参数的调节。
- seed_fill函数实现种子填充,即返回空白联通块的个数,比如8返回3,0返回2等等。当然,首先得在外围加一圈虚拟的白圈防止边界的阻隔。
- count_border和count_fill函数实现的是边界黑点的计数,以及黑点数目的计数。这只是我开脑洞想到的特征,好像也有点用的。
logistic_sgd.py
这是官网上的学习的核心算法,我只是稍微修改了下参数还有predict函数,有些实现细节还没有彻底搞懂(话说theano还真不怎么好理解)。
1 | """ |
主要需要关注的就是 sgd_optimization_mnist 函数的传参,比如学习因子$\alpha$还有分组的大小。迭代的次数反倒不用管他,调到最高也成。
train.py
训练接口,很简单0.0,只是为了方便操作而已。
1 | import os |
运行之前所有的程序,然后直接训练。split.py会生成名叫number/的文件加,package.py会生成名叫vericode.pkl.gz的数据集,而logistic_sgd.py会直接进行训练,并把最好的结果输出到** best_model.pkl** 中加以保存,并在命令行中打印类似下面的信息:
1 | spliting |
细致的显示了训练集的训练结果。
check.py
这个文件封装了调用训练成果进行识别的接口。由于懒得优化之前的代码结构,这里没有实现代码重用而是相当于重新写了一边之前的图片处理的过程。
1 | import cPickle,os,Image,ImageFilter,theano,sys,time |
这里实现了对单个文件的识别以及文件夹下所有文件的批量识别。可以如下使用:
$python check.py test.png
以及$python check.py png/