2007年4月5日星期四

Digit Number Recognition

去年十二月写了一段针对仪表的数字识别代码,功能比较简单,现总结一下其中的过程。
分别用模板匹配和神经网络实现了识别过程,其中模板匹配算法借鉴了茅老师的idea。
template match :
image[in] => rgb2gray -> segment(ostu) -> find digits(flood) -> normalize -> NN or Correlation => recognized digits[out]

neuronetwork :
image[in] => rgb2gray -> segment(ostu) -> binary -> find digits(projection) -> normalize ROI -> skeletonize -> generate features(top, bottom, right, left, width, height) -> normalize feature -> BP network(3 layers) => recognized digits[out]

训练与识别过程类似。
template方法比较简单,而且在实际操作中发现识别准确率也比较高,事实上对于固定的摄像机位置和固定形状的数字,模板与实际提取出来的数字不会有太大的差别,因此效果好,速度快,比较适合仪表数字识别应用。
神经网络方法有些复杂,我参考的是一个手写数字识别算法,识别效果也可以,但ANN的参数比较难调,最终选择96-192-10的3层BP网络。在调BP时也遇到了一些问题,训练BP时很多次迭代后RMS老是不能收敛到比较小的值,仔细读了pattern classification中关于ANN的介绍,明白了一些数据处理要求,如训练数据归一化,S函数选择技巧等,实践一下后,效果确实好了些。利用十个样本(0~9)进行监督学习,然后在线识别,效果不如template方法,但也是不错的。猜想使用更多样本学习后,可能效果会更好(有待实验证实)。

这样的小工程还是挺有意思的,前后也就用了两个星期,练练手,不错的。c++代码也写得也还满意,factory模式,支持xml配置文件读写,cross platform(linux, windows),在windows上做了个Demo:一个数字仪表模拟器,一个USB摄像头视频捕捉和在线识别Demo(这些灵感也来自于茅老师,看过他们的电路实验:),下面是Demo截图:

一些说明:左图为数字发生器,模拟LED数字,可以定时随机生成,右图为视频采集与在线实时识别Demo,识别前先要手动选择数字区域,固定好位置后就能实时识别了。