V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
awanabe
V2EX  ›  Python

想识别豆瓣的验证码, 做了一点尝试, 求指导

  •  
  •   awanabe · 2015-04-10 14:40:52 +08:00 · 5739 次点击
    这是一个创建于 3310 天前的主题,其中的信息可能已经有所发展或是发生改变。
    先讲讲我的想法:
    1. 豆瓣验证码都是英文单词类型, 就想用OCR识别. Python上的库有: pytesseract
    2. 图片背景太花, 单词颜色都是黑色. 就用图像图 Pillow 讲图片非纯黑 变成白色. 当然给了一点缓冲余地, 用RGBA的颜色, 每个色标正负5之内都算符合.
    3. 然后获取只有黑色点阵图像, 会发现噪点很多. 写了一个递归遍历算法 类似于 Flood fill 算法 , 将可以连接在一起的黑色点算出最大面积, 面积小于一个阈值的全部置为白色.
    4. 然后通过OCR识别.

    代码在 https://github.com/awanabe/douban_captcha_identify

    原图:

    去掉背景杂色之后:

    转换成点阵:

    去除噪点:



    问题:
    1. 发现pytesseract 对于扭曲的字母识别度很低
    2. 去背景色, 去噪点太粗暴, 容易把字母弄破. 每次图片识别都要通过调整好几次阈值, 然后用识别出来的单词去对比英文单词库. 有些肯定就无解了.

    请问那些地方可以改进来提高准确率
    16 条回复    2015-05-13 14:08:57 +08:00
    int64ago
        1
    int64ago  
       2015-04-10 14:55:33 +08:00   ❤️ 1
    前提:分割为当个字母
    1、通过长宽比过滤一些
    2、通过黑白像素点比值过滤一些
    3、?
    TangMonk
        2
    TangMonk  
       2015-04-10 14:58:00 +08:00
    豆瓣的好像都是单词。。看下这个点能不能入手
    hao123yinlong
        3
    hao123yinlong  
       2015-04-10 15:00:22 +08:00
    楼主,降噪、二值化后,针对处理后的图片进行字库训练,识别率可达百分之九十九点九九九。。训练很伤眼睛,自己训练的话请先买几箱眼药水备用
    awanabe
        4
    awanabe  
    OP
       2015-04-10 15:02:10 +08:00
    @hao123yinlong 就是不会搞图形化的那一套..才想走走别的途径..通过OCR识别..
    awanabe
        5
    awanabe  
    OP
       2015-04-10 15:02:52 +08:00
    @TangMonk 搜索的时候..看到有人说..豆瓣的验证码可以穷举..不过这个是多大一个的工程...
    awanabe
        6
    awanabe  
    OP
       2015-04-10 15:04:16 +08:00
    @int64ago 分割成单词字母可能识别率会高一点...这个确实可以验证下
    dingyaguang117
        7
    dingyaguang117  
       2015-04-10 15:06:03 +08:00
    LZ 我觉得我们可以加个友情链接 https://github.com/dingyaguang117/ImageRecognizeOf58
    gowithwind
        8
    gowithwind  
       2015-04-10 15:13:54 +08:00
    这个验证码的边缘比较强,可以先进行边缘检测吧.确定字符的位置.应该对分离字符有帮助.

    对于扭曲的情况可以适当进行矫正.计算字符的重心.根据偏向做相反的调整.

    建议还是使用高级点的机器学习技术.
    hao123yinlong
        9
    hao123yinlong  
       2015-04-10 15:23:42 +08:00
    @awanabe OCR识别是需要根据字库(训练库)来进行识别的。豆瓣特定的字体,如果没有相应的训练库,你把图片质量做得再高,也一样识别率低
    liboyue
        10
    liboyue  
       2015-04-10 15:34:00 +08:00 via Android
    要是用点深度学习的东西正确率应该会很高

    参考LeNet-5,90年代商用的手写数字识别算法
    superhack
        11
    superhack  
       2015-04-10 15:35:43 +08:00
    『去掉背景杂色之后』直接切分(按垂直投影),切分之后的求出来个最小矩形闭包,之后的结果就可以作为训练集了,每个字符积累几百个,直接 KNN 算法,你的预处理效果看起来能做到单字符 85% 的正确率,五六个字符几乎能做到 3、4 次成功登录一次。
    awanabe
        12
    awanabe  
    OP
       2015-04-10 15:37:57 +08:00
    @dingyaguang117 哟西...思路差不多
    int64ago
        13
    int64ago  
       2015-04-10 15:38:25 +08:00
    @superhack 对,分割的时候用投影是比较好的方式
    awanabe
        14
    awanabe  
    OP
       2015-04-10 15:38:33 +08:00
    @hao123yinlong 扭曲的字体确要训练
    h4x3rotab
        15
    h4x3rotab  
       2015-04-12 15:00:29 +08:00
    对于单词的话还可以利用字典提高识别率,尤其是这种严格出现在字典里的词,只要拿字典里的每个词套进来,然后计算整体的准确率,取最高就好了
    pythoner
        16
    pythoner  
       2015-05-13 14:08:57 +08:00
    春节的时候我用楼主的思路做过,识别率不是特别好。
    正好有两篇博客简单记录了以下,欢迎交流: http://t-y.me/p/233
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   773 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:17 · PVG 06:17 · LAX 15:17 · JFK 18:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.