一次对新浪微博验证码识别的尝试

花了半天的时间来搞了一下新浪微博的登录界面验证码,效果很差估计只有5%的识别率吧,被新浪微博的验证码击沉了,训练API演示放在了:http://myqsmy.com/weibo.php,有兴趣请看看。

update:后来优化了一下,识别率提高到了17.3%左右。

现在还是记录一下这次失败的验证码识别尝试吧,首先用了一个叫Goutte的php爬虫框架,爬了几K张的新浪验证码:

然后对验证码进行分析,发现新浪验证码背景都是白色,前景深色,这一点挺简单的。麻烦的是新浪验证码基本存在粘连,而且字符倾斜十分厉害,旋转也十分厉害。总之,我花了2个多小时采集了2k多张的字符,发现训练出来的效果特别差。分析原因觉得是新浪的字符倾斜和旋转太厉害了,这一点导致训练出来的效果很差。为了得到相对好一点的结果,我把字符的归一化大小调整,神经网络层数调整了一下,发现改进也并不大。我认为要改进识别效果,应该在特征提取上进行改进,只是目前我还没有好的办法就只能先不管这一块了。

分割仍然采取k均值聚类来做,在vs上把识别算法调好以后,再移植到centos6.5上做成了php的扩展。

之前提到了google做的可以完全识别自己的re-captcha的把localization、segmention和recognition放在一起做的那篇paper《Multi-digit Number Recognition from Street View
Imagery using Deep Convolutional Neural Networks》,我下下来看了一下没看懂。

那么继续来讨论一下对新浪微博验证码特征提取的改进吧,师兄有说过现在做验证码有不做分割直接分开识别的方法:比如新浪微博验证码有4个字母,现在有标定好的一批样本,那么用分别对应第1个、第2个、第3个和第4个字符的4个分类器去训练,根本不用去分割,识别的时候拿验证码直接去喂4个分类器,就分别得到了第1、2、3、4位的字符。只是这个做法需要很大的样本量,而且特征也不够,需要人工预处理样本来增大样本数量。

目前我并没有精力去尝试这些,于是还是把重点放在怎么提取特征上面,针对新浪微博验证码的扭曲和选择的特点,如果提取的特征具有旋转不变那么效果也许可能有提升。我有见过用SIFT做台标识别的,但是感觉SIFT和SURF之类的keypoint特征不太适合。
然后就是shape context特征了,这个特征计算很复杂,我去这个repo找了一个shape context的下下来在win上跑通了,发现把shape context用在ocr上需要更多的处理,于是就放弃这个了。

那么继续回到识别上来,后来我想了一下,新浪微博的字符拿来神经网络来训练并不合适,用PCA这种注重区分类与类的分类器感觉比较好。于是花了点时间换成了PCA的分类器,训练出来的识别率测出来效果要好很多(训练的字符又用来识别,只有几张识别失败,当然了拿去识别新的字符肯定识别率要下降,但是比起神经网络要好很多):
3

现在把新的验证码识别率算法在VPS上编译成php接口,然后在这个接口页面(http://myqsmy.com/weibo.php)采集了30*5张的验证码,并且统计了一下识别率:
(4/30 + 3/30 + 7/30 + 3/30 + 9/30)= 17.3%左右的识别率吧。

最后再分析一下,现在分析了一下结果,如果能够成功分割,那么基本上还是可以识别出来的,也就是说影响识别率的还是字符的粘连,而目前我只是用kmeans对2个字符粘连的情况做了处理,这是远远不够的。
如果要提高识别率,还是应该在分割上提高。

分割得到的2K张样本图片在这里提供给有兴趣的人,都是已经标定好的样本,各字符出现的频率不是一样的,但是和新浪验证码里字符出现的频率一致:cap.zip

一次对新浪微博验证码识别的尝试》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注