Skip to content
宅教授 edited this page Oct 2, 2019 · 20 revisions

统计学方案

我的目标是从根本上排除人工识别(这也是我为什么在简介中写的是自动识别)。

如果有人能给我一堆验证码,并告诉我说,这都是让寻找打字机的。即使我不知道什么叫打字机,什么不叫打字机,但也可以根据统计学(抱歉,我并不知道这样称呼是否准确)来寻找打字机,不是吗?因为这里某样东西是打字机的概率高于1/8,而是其它某样东西的概率仅仅只有1/80。将以此思路获取的结论放到整个验证集上的正确率达到91%。这个结果是根据10万条验证码统计的,如果100万条,1000万条呢?

我把统计学的结果命名为images.npz

  1. 改用更准确的文字识别器可使正确率提到93.8%
  2. 同时改用更好的哈希算法可使正确率提到96.7%

图片识别

让统计学专家来教卷积神经网络识别图片(我希望专家能提供更大的训练集,超越人工提供的训练集,让其仅仅当作验证集)。

第一步,让统计学专家来提供训练集

~$ ll -h captcha.npz
... 149M ... captcha.npz
~$ python -c "~;print(t['images'].shape);print(t['labels'].shape)"
(11280, 67, 67, 3)
(11280, 80)

第二步,获取验证集

来源:https://www.kaggle.com/libowei/12306-captcha-image

将其转换为captcha.test.npz文件。

~$ ll -h captcha.test.npz
... 148M ... captcha.test.npz
~$ python -c "~;print(t['images'].shape);print(t['labels'].shape)"
(11794, 66, 66, 3)
(11794,)

第三步,深度学习

让卷积神经网络从captcha.npz中学习。在验证集上的正确率浮动在99%

由于训练集来自于统计学,而不是人工识别的,所以需要给定一个可信度。毕竟,对于出现次数少的图片,统计出来的结论可信度也不够。在实践中我根据统计值来给每一个图片提供权重,来表示其可信度。对于可信度低的图片,即使识别错误扣分也不多,当然答对了加分也不多。我觉得这是有必要的,但是我不清楚我提供的权重有多少效果。

数据的下载地址:

  1. https://pan.baidu.com/s/1OsBIBM4rl8EnpZt7VYiD9g
  2. https://drive.google.com/drive/folders/1GDCQyaHr36c7y1H-19pOKjc_EdAI1wn0

各种相似图搜索算法

根据训练集来验证各相似图搜索算法在此领域的能力。

  1. avhash 错了8次,将整体压缩到6069个哈希值
  2. phash ~ 0次,~ 6234个
  3. phash_simple ~ n次,6533个。看来不能图简单呀
  4. dhash ~ 0次,~ 7120个
  5. dhash_vertical ~ 0次,~ 7244个
  6. whash 留给大家的作业…

错的意思是指把两个不同类型的图片压缩到同一个哈希值。