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
snoopy1024
V2EX  ›  Python

用 Python 处理这种验证码有没好的点子?

  •  1
     
  •   snoopy1024 · 2018-11-18 18:29:14 +08:00 · 7299 次点击
    这是一个创建于 2195 天前的主题,其中的信息可能已经有所发展或是发生改变。

    验证码 captcha

    验证码字符只有 英文加数字; 我的思路:转为灰度,二值化处理,除去干扰横线(正在做),然后用 pytesseract 识别。干扰线除去有点儿复杂 正在做还不知道识别率有多大...

    干掉干扰线 你们有没有啥头绪? 干扰线纵向都是 3 个像素,我目前的想法就是:纵向检测 3 像素的黑线

    这是简单处理后的 还没有解决干扰线 captcha

    第 1 条附言  ·  2018-11-19 09:46:33 +08:00
    楼下多个老哥提议使用 CNN,我昨晚上尝试了下 3 楼老哥写的脚本;由于这只是个个人项目 项目里有多个地方验证码识别,上线了之后验证码识别的需求量有点儿大,打码平台我有点负担不起。谢谢各位老哥的提议
    31 条回复    2018-12-06 14:40:42 +08:00
    loadingimg
        1
    loadingimg  
       2018-11-18 19:52:10 +08:00
    用 CNN
    hitrust
        2
    hitrust  
       2018-11-18 19:55:51 +08:00
    直接用 OCR 呢
    Nick2VIPUser
        3
    Nick2VIPUser  
       2018-11-18 21:07:45 +08:00   ❤️ 2
    安利一下简单粗暴的卷积神经网络脚本: https://github.com/nickliqian/cnn_captcha
    crystom
        4
    crystom  
       2018-11-18 22:16:09 +08:00
    这个是用谷歌开源的 kaptcha 生成的,可以使用机器学习进行训练
    crystom
        5
    crystom  
       2018-11-18 22:17:09 +08:00
    似乎不是,但方法是一样的
    crystom
        6
    crystom  
       2018-11-18 22:22:54 +08:00
    不用机器学习的话,看上去字比线粗,可以使用一个像素周围一定范围不是黑就去掉的办法,结果是线没了,字变细
    wdc63
        7
    wdc63  
       2018-11-18 22:45:37 +08:00
    这种样本量少的话真不好做,建议使用收费的打码平台 api。
    Procumbens
        8
    Procumbens  
       2018-11-18 22:49:57 +08:00
    pytesseract 暑假里面用的时候发现其对手写文本的识别率极差,这种倾斜变形的字体可能识别效果也不会很好。
    Northxw
        9
    Northxw  
       2018-11-18 23:48:52 +08:00
    如果没有图像处理的知识,建议还是打码吧! 简单粗暴效率超高!
    kanex
        10
    kanex  
       2018-11-19 00:50:49 +08:00 via iPhone
    图像处理里有一个操作叫 erosion,你可以试试看
    szxczyc
        11
    szxczyc  
       2018-11-19 01:27:26 +08:00 via iPhone
    一楼说的对,cnn 比较好。
    glacer
        12
    glacer  
       2018-11-19 02:32:01 +08:00
    这种类型的验证码用传统的图像算法和 tesseract 效果应该都不会好。会算法技术就试下训练网络,不行的话找打码平台吧
    martyartrt1
        13
    martyartrt1  
       2018-11-19 09:08:09 +08:00
    看了以后,我还是选择第三方的接口吧
    SeaRecluse
        14
    SeaRecluse  
       2018-11-19 09:11:40 +08:00
    只有数字和字母?? CNN100 张就够,在线训练的网址也有
    kuangwinnie
        15
    kuangwinnie  
       2018-11-19 09:19:35 +08:00
    打码平台挺便宜的,可以考虑一下,30 块可以打 1000 张。。。
    snoopy1024
        16
    snoopy1024  
    OP
       2018-11-19 09:39:58 +08:00 via Android   ❤️ 1
    @kuangwinnie 不行的 老哥,项目上线了远不止 1000 张 而且只是个 个人项目,没有收入来源。
    snoopy1024
        17
    snoopy1024  
    OP
       2018-11-19 09:46:55 +08:00
    @crystom 我了解一下
    hubqin
        18
    hubqin  
       2018-11-19 09:48:14 +08:00 via Android
    之前写爬虫用过 pytesseract,用各种常规方法处理验证码图片,最后效果反而不好,我最终的解决方案是不处理图片,直接识别,识别失败则重新请求验证码,再识别,无限循环。一般十几次之内能识别出来。
    hakono
        19
    hakono  
       2018-11-19 09:50:55 +08:00 via Android
    @snoopy1024 个人项目的话如果不是后台跑着帮用户 24 小时收集数据的项目的话,就直接把验证码扔给用户让用户填啊。

    剩下打码平台用不起的话,那就只能自己学图像处理了。或者简单粗暴上 cnn
    snoopy1024
        20
    snoopy1024  
    OP
       2018-11-19 09:56:27 +08:00 via Android
    @hubqin 这有干扰线的 根本识别不出来。有干扰线的 肯定要解决干扰线
    snoopy1024
        21
    snoopy1024  
    OP
       2018-11-19 10:29:19 +08:00 via Android
    @SeaRecluse 老哥 求个链接
    sigmaxp
        22
    sigmaxp  
       2018-11-19 10:31:13 +08:00
    把高为 3 个像素的黑点都去掉,然后正常的字母中间会有白色的空白线,然后在把上线都有黑色像素点且空白宽度为 3 的空白像素点置为黑色,这样字母部分就补齐了。不知道行不行
    crawl3r
        23
    crawl3r  
       2018-11-19 10:51:34 +08:00
    pytesseract 不能识别这种会变形的文字,所以还是上 cnn 吧
    Marsss
        24
    Marsss  
       2018-11-19 12:40:40 +08:00
    好的点子就是悬赏。。。出个 500、800 的,问题就解决了。。。
    Destiny97
        25
    Destiny97  
       2018-11-19 12:48:51 +08:00 via Android
    腐蚀再膨胀说不定能去掉
    loryyang
        26
    loryyang  
       2018-11-19 12:57:04 +08:00
    有个问题,你能写出生成这种验证码的代码吗?可以的话,就可以用 CNN 开心的训练了
    数据量足够的话,这种的 case 肯定能解决的
    loryyang
        27
    loryyang  
       2018-11-19 12:59:05 +08:00
    kuangwinnie
        28
    kuangwinnie  
       2018-11-20 09:29:41 +08:00
    @snoopy1024 那我就爱莫能助了
    Marsss
        29
    Marsss  
       2018-11-21 13:00:14 +08:00
    你或许需要一些 hacker 思维,寻找干扰线与正常字符之间的差别规律,然后针对这个规律写处理代码。其实还挺有意思的,这是测试效果:





    只要能做到有效分割,也就基本意味着破解成功了,分割之后大概只需要标注 100 张左右,这点体力活比起直接用 CNN 撸(需要标注上万张)还是很容易接受的,后面再随便在 sklearn 里挑一个算法来训练就行了。
    Marsss
        30
    Marsss  
       2018-11-21 13:04:22 +08:00
    对了,对于你这种验证码,如上图连在一起的,直接从中间分开就行了,不会差很多,对于单个字符,只要你人能认出来,多层感知器训练后认出来没问题。大不了就跳过,从新刷新一张。识别成功率能到 50%就能用了。
    ChangHaoWei
        31
    ChangHaoWei  
       2018-12-06 14:40:42 +08:00
    @Marsss 思路很棒,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3463 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 106ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.