用 Python 处理这种验证码有没好的点子? - V2EX
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 7709 次点击
    这是一个创建于 2537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    验证码 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     Solana     5285 人在线   最高记录 6679 &bsp;     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 984ms UTC 09:00 PVG 17:00 LAX 02:00 JFK 05:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86