验证码识别(Captcha Recognition)

Emmm…虽说是一篇总结报告,但是作为当代首屈几亿指的逗比青年,还是不想让文章太拘泥于形式,表达更不想太过于正式与严肃,so……还是轻松一点符合我的个性嘛。作为开博第一篇,本博主决定以此来确定自己的博客基调,方为正道验证码识别(CaptchaRecognition)总结报告~
言归正传,最近做了一个关于验证码识别的程序,虽说几经波折吧,不过好在经过一段时间的“折腾”,效果还算不错,至少实现出来了。作为新人小白,也算是值得高兴的吧~
在开始的时候,拿到这个题目,作为一名资深的肥宅快乐水的大四品尝家,不免有些手足无措,不知道如何开始才是最可怕的……经过某位高人指导(其实是研究生导师),本柠檬决定采用pytorch框架,然后开始了搞事之旅……
所谓工欲善其事必先利其器,由于之前柠檬对机器学习以及神经网络有了一定的了解,所以这次柠檬决定直接先连滚带爬的在pytorch上鼓秋鼓秋~
本柠檬在开始的时候按着pytorch官网(https://pytorch.org/)上的tutorials进行操作,首先进行手写数字体识别,以此来熟悉pytorch的使用,不得不说,60分钟入门教程还是不错的~
搭好CNN网络,打包数据,训练,测试,这一系列操作完成之后,基本对pytorch的使用心里有那么一点点的数了。给柠檬印象最深的一点体验就是,一定要把每一步的作用分析清楚,这样才有利于之后进行别的工程,对于一名小白来说,基础尤为重要。
在此,柠檬列出几点自己认为应该注意的问题:
由于当时数据集是pytorch教程中给好的MNIST数据集,是人家已经做好的,那么作为新人所需要做的就是调用特定函数,将其下载并用特定函数打包就可以了,可如果新到手的一组数据集,应该怎么打包输入给网络呢?
既然要熟悉整个流程,就要仔细研究每一个函数,每一步是怎么做的。明确每一个函数的作用和影响,以及每一个参数代表怎么样的意思,柠檬觉得这样的基础还是很重要滴。
不过嘛,手写数字识别的问题还是比较简单的,所以自然也不会花费太多时间,毕竟代码都是现成的~作为小白来说,只需要认真分析,多查查资料就好咯~
在解决了手写数字体识别问题后,柠檬小白开始逐渐进入了升级之旅,着手对验证码识别问题进行“研究”……
有了之前的经验,柠檬对这个问题的实现有了一个流程轮廓,不过依然面对以下几个问题:
不清楚应该选择怎么样的深度学习网络进行验证码识别
数据打包问题依然是柠檬的心腹大患……(主要是之前的手写数字识别问题,柠檬并没有搞明白对于新到手的数据如何进行数据打包)
更尴尬的是,不清楚数据集应该如何获取
对于这些问题的解决,柠檬参考了这个网站写的代码https://github.com/dee1024/pytorch-captcha-recognition(同样是做验证码识别的~)
网站上写的代码很详细,但是稍微有些bug,比如在定义数据集的时候并没有加入小写字母,但是在编码解码时却对此有涉及。
不得不说,这份代码写得的确很详细,针对于熟悉深度学习的新手来说确实是一份相当不错的例程。柠檬按着这位大佬的代码认真学习了大约一周的时间后,逐步实现了一下,发现只有60%的准确率???在柠檬万分诧异的情况下,柠檬本着可能是自己对代码做一些改动时不小心改错了什么的心情,重新检查了一遍代码,发现并没什么与原代码的表达有什么分歧的地方。为了彻底排查是否代码有一定的小bug,柠檬Ctrl+C & Ctrl+V ,结果发现……Emmm……原代码也是这样的结果,那么到底是哪里除了问题,这个一直困扰了我好几天……
最后,柠檬的老师发现了代码的一个小坑。代码的训练过程中存在着BN和dropout两个过程,但是代码中在测试过程中,并没有把BN和dropout两个过程给固定住,换句话说,就是在测试过程中,BN和dropout所产生的的结果和训练集是不一样的,他们还在继续变,而并不是训练好的储存到模型中的值!因此,明确了问题所在之后,只需要在测试和训练之前分别加上一句cnn.train() 和 cnn.eval_r() 就OK啦~这个过程我们称之为模式切换,这样才能得到最准确的结果~实验表明,这次的测试结果还是颇令人满意的~
继解决问题之后,柠檬学习了一种新的深层网络Resnet网络,来进行验证码识别。为此还先读了一下Resnet的论文,搞明白了大致思想之后,本着论文中的深层网络性质在最优化方案下一定会比浅层网络性能好的观点,柠檬实现了一个34层的Resnet网络,最终实现了四位英文大小写以及数字混合验证码的测试集准确率达到96%的效果,验证码识别工作至此完成~
这几个星期以来,柠檬从一个新人小白开始慢慢入门理解,到现在对整个过程有一个相对清晰的认识~
第一次写博客,只是为了对于这段时间的工作做一个总结,一是我实在不太会写这个总结报告,二是我确实不想写成那种严肃措辞的书面报告一类,所以,就比较轻松的将自己这段时间的工作做了一个大致的陈述,将自己的工作以及所思所想做了一个概括吧~
差不多就是这样了,验证码识别的工作至此告一段落,自己仍需努力咯~
分享:

你可能感兴趣的:(工作总结)