返回信息流1.软件介绍
自己写的一个能识别手写数字的Android软件,目前是version1.0。整个软件还是概念性的,UI比较挫,可能会有一些bug。一些基于此的相关实用功能目前正在开发中。
2.使用方法
目前支持的机型:CPU>=800MHz、摄像头支持对焦功能、系统>=android2.2以上的手机。
软件只有两个按钮,“识别”和退出。软件每两秒会自动对焦一次,只要把手机摄像头对着待识别的数字,等到手机自动对焦完毕,显示的数字比较清晰了,按下识别,识别出的数字信息就会显示在手机屏幕上。
3.涉及的模式识别技术
特征采用168维的多层HOG。这个是基于几篇经典的HOG论文进行的改进,论文里都是在电脑上用libsvm跑的,动不动就2000多维,运算量太大,在手机上根本不能用。我精简了一下,目前的特征保持了大概98.5%-98.3%的准确率(在MNIST上的测试)。实际测试的时候发现(6,5),(7,9)误判率较高。
分类器用的SVM.训练和测试用的libsvm,训练集&测试集用的是经典的MNIST。kernel用的线性核,主要是考虑计算量小速度快,而且我参考的论文里面说效果比高斯核好。最后得到了3799个支持向量。
我把浮点运算全换成整形运算了,也是为了加快计算。在1.2GHz双核和800MHz单核的手机上都测试过,速度都还可以,没有太明显的延迟感。在1.2GHzCPU的手机上(小米青春版)单个数字识别时间大概在50ms左右。
一些明显的缺点:目前只支持亮色背景暗色数字,没有拒识(如果是纯亮色背景的话,会有拒识),图像中除了待识别的数字不能有太大的噪声(较小的污点或椒盐噪声是没问题的)。光照不均匀会影响识别结果。
4.涉及的编程技术
核心识别是C++编写的,所以用到了NDK(其实就是JNI),小部分代码是Java写的,都一些简单逻辑和必须调用的Android API的部分。
5.其他
有什么意见和建议可以和我交流,如果对这个比较感兴趣可以站内联系我。下一步怎么做我目前还没想好,可能会试试其他的分类器、特征值以及其他的物体识别,也考虑过搭成CS架构的,这样识别率应该会提高很多。个人觉得目前智能终端上成熟的识别应用还很少,而且大多数集中在语音识别,比如Siri,其他方面的都处于起步阶段,还是有一定发展空间的。
6.软件截图
软件下载:
附件(874.9KB) DigitRecognize.apk
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #9279同步于 2012/6/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
自己做的一款手写数字识别手机软件
handspeaker
2012/6/15镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我用的特征维数比较少,所以计算量还可以,一次判决大概需要o(168×3799)次运算,另外我调高了线程的优先级。不过我现在的确在考虑用其他分类器,正在看random forest。您说的贝叶斯模型这种方法我不太了解,能介绍一下吗?
【 在 ccjguangzhou 的大作中提到: 】
: 手机上用svm分类会不会负载过大?精简为贝叶斯模型?
【 在 handspeaker 的大作中提到: 】
: 1.软件介绍
: 自己写的一个能识别手写数字的Android软件,目前是version1.0。整个软件还是概念性的,UI比较挫,可能会有一些bug。一些基于此的相关实用功能目前正在开发中。
: 2.使用方法
: ...................
Hello, 东西挺好, 但是好像你的这个结果离最好的结果还有一点距离吧, 好像最好结果在1%以下, 具体不记得了。 下面谈一下你的分类器选择问题, 个人见解, 觉得有用, 可以参考一下。
分类器的选择, 如果使用linear SVM, 一般是不使用Libsvm, 你可以使用svmlight, 或者liblinear. liblinear训练非常快, 而且性能也比较好。 还有就是要用kernel, 可能你现在用的训练样本觉得太多, 用不了kernel, 现在有些好的方法可以先做直接的特征隐射, 然后用liblinear, 性能能够达到kernel svm的效果, 基本不增加计算量, 是未来大规模分类问题的一个方向, 今年的ECCV就有一个这样的tutorial, 这个工具你可以使用Vlfeat中的explicit additive kernel mapping, 或者使用新加坡一个叫jianxin wu人的最新工作, 应该是有源码, 我相信能够进一步提升现有性能, 而不影响现有的速度。
从coding的角度来讲, 应该没有太大难度, kernel mapping 使用vlfeat, 只需要取出一两个相关文件, 加入到你的工程。 Liblinear的使用和libsvm差不多。
多谢指教~
目前世界上用svm在MNIST上最好的结果目前能达到0.6%左右,我这个主要考虑到速度,所以没有使用比较复杂的特征提取方法,效果肯定也差一些。另外就是实际的效果和用MNIST测试还挺不一样的,我主要想追求准确率和速度之间的平衡,毕竟软件和单纯做算法追求极限还挺不一样的。你说的kernel的确是最好要用的,我看的论文里用的是一个非线性的kernel,比较非主流,我需要自己写,有点偷懒就直接用的最简单的线性核。
再次感谢,你说的这些我都去查一下,的确还有挺多提升空间。
【 在 jasonchi 的大作中提到: 】
:
: Hello, 东西挺好, 但是好像你的这个结果离最好的结果还有一点距离吧, 好像最好结果在1%以下, 具体不记得了。 下面谈一下你的分类器选择问题, 个人见解, 觉得有用, 可以参考一下。
: 分类器的选择, 如果使用linear SVM, 一般是不使用Libsvm, 你可以使用svmlight, 或者liblinear. liblinear训练非常快, 而且性能也比较好。 还有就是要用kernel, 可能你现在用的训练样本觉得太多, 用不了kernel, 现在有些好的方法可以先做直接的特征隐射, 然后用liblinear, 性能能够达到kernel svm的效果, 基本不增加计算量, 是未来大规模分类问题的一个方向, 今年的ECCV就有一个这样的tutorial, 这个工具你可以使用Vlfeat中的explicit additive kernel mapping, 或者使用新加坡一个叫jianxin wu人的最新工作, 应该是有源码, 我相信能够进一步提升现有性能, 而不影响现有的速度。
: ...................