验证码
验证码字符只有 英文加数字; 我的思路:转为灰度,二值化处理,除去干扰横线(正在做),然后用 pytesseract 识别。干扰线除去有点儿复杂 正在做还不知道识别率有多大...
干掉干扰线 你们有没有啥头绪? 干扰线纵向都是 3 个像素,我目前的想法就是:纵向检测 3 像素的黑线
这是简单处理后的 还没有解决干扰线
1
loadingimg 2018-11-18 19:52:10 +08:00
用 CNN
|
2
hitrust 2018-11-18 19:55:51 +08:00
直接用 OCR 呢
|
3
Nick2VIPUser 2018-11-18 21:07:45 +08:00 2
安利一下简单粗暴的卷积神经网络脚本: https://github.com/nickliqian/cnn_captcha
|
4
crystom 2018-11-18 22:16:09 +08:00
这个是用谷歌开源的 kaptcha 生成的,可以使用机器学习进行训练
|
5
crystom 2018-11-18 22:17:09 +08:00
似乎不是,但方法是一样的
|
6
crystom 2018-11-18 22:22:54 +08:00
不用机器学习的话,看上去字比线粗,可以使用一个像素周围一定范围不是黑就去掉的办法,结果是线没了,字变细
|
7
wdc63 2018-11-18 22:45:37 +08:00
这种样本量少的话真不好做,建议使用收费的打码平台 api。
|
8
Procumbens 2018-11-18 22:49:57 +08:00
pytesseract 暑假里面用的时候发现其对手写文本的识别率极差,这种倾斜变形的字体可能识别效果也不会很好。
|
9
Northxw 2018-11-18 23:48:52 +08:00
如果没有图像处理的知识,建议还是打码吧! 简单粗暴效率超高!
|
10
kanex 2018-11-19 00:50:49 +08:00 via iPhone
图像处理里有一个操作叫 erosion,你可以试试看
|
11
szxczyc 2018-11-19 01:27:26 +08:00 via iPhone
一楼说的对,cnn 比较好。
|
12
glacer 2018-11-19 02:32:01 +08:00
这种类型的验证码用传统的图像算法和 tesseract 效果应该都不会好。会算法技术就试下训练网络,不行的话找打码平台吧
|
13
martyartrt1 2018-11-19 09:08:09 +08:00
看了以后,我还是选择第三方的接口吧
|
14
SeaRecluse 2018-11-19 09:11:40 +08:00
只有数字和字母?? CNN100 张就够,在线训练的网址也有
|
15
kuangwinnie 2018-11-19 09:19:35 +08:00
打码平台挺便宜的,可以考虑一下,30 块可以打 1000 张。。。
|
16
snoopy1024 OP @kuangwinnie 不行的 老哥,项目上线了远不止 1000 张 而且只是个 个人项目,没有收入来源。
|
17
snoopy1024 OP @crystom 我了解一下
|
18
hubqin 2018-11-19 09:48:14 +08:00 via Android
之前写爬虫用过 pytesseract,用各种常规方法处理验证码图片,最后效果反而不好,我最终的解决方案是不处理图片,直接识别,识别失败则重新请求验证码,再识别,无限循环。一般十几次之内能识别出来。
|
19
hakono 2018-11-19 09:50:55 +08:00 via Android
|
20
snoopy1024 OP @hubqin 这有干扰线的 根本识别不出来。有干扰线的 肯定要解决干扰线
|
21
snoopy1024 OP @SeaRecluse 老哥 求个链接
|
22
sigmaxp 2018-11-19 10:31:13 +08:00
把高为 3 个像素的黑点都去掉,然后正常的字母中间会有白色的空白线,然后在把上线都有黑色像素点且空白宽度为 3 的空白像素点置为黑色,这样字母部分就补齐了。不知道行不行
|
23
crawl3r 2018-11-19 10:51:34 +08:00
pytesseract 不能识别这种会变形的文字,所以还是上 cnn 吧
|
24
Marsss 2018-11-19 12:40:40 +08:00
好的点子就是悬赏。。。出个 500、800 的,问题就解决了。。。
|
25
Destiny97 2018-11-19 12:48:51 +08:00 via Android
腐蚀再膨胀说不定能去掉
|
26
loryyang 2018-11-19 12:57:04 +08:00
有个问题,你能写出生成这种验证码的代码吗?可以的话,就可以用 CNN 开心的训练了
数据量足够的话,这种的 case 肯定能解决的 |
27
loryyang 2018-11-19 12:59:05 +08:00
|
28
kuangwinnie 2018-11-20 09:29:41 +08:00
@snoopy1024 那我就爱莫能助了
|
29
Marsss 2018-11-21 13:00:14 +08:00
你或许需要一些 hacker 思维,寻找干扰线与正常字符之间的差别规律,然后针对这个规律写处理代码。其实还挺有意思的,这是测试效果:
只要能做到有效分割,也就基本意味着破解成功了,分割之后大概只需要标注 100 张左右,这点体力活比起直接用 CNN 撸(需要标注上万张)还是很容易接受的,后面再随便在 sklearn 里挑一个算法来训练就行了。 |
30
Marsss 2018-11-21 13:04:22 +08:00
对了,对于你这种验证码,如上图连在一起的,直接从中间分开就行了,不会差很多,对于单个字符,只要你人能认出来,多层感知器训练后认出来没问题。大不了就跳过,从新刷新一张。识别成功率能到 50%就能用了。
|
31
ChangHaoWei 2018-12-06 14:40:42 +08:00
@Marsss 思路很棒,谢谢
|