验证码识别Demo实践

验证码识别,尝试破解一个真实第三方网站的验证码

目标:

猎聘网的验证码:wget https://passport.liepin.com/captcha/randomcode -O 001.jpg

参考Baseline:

https://blog.csdn.net/c2a2o2/article/details/75844775 //有github开源,貌似不错

过程记录:

  1. baseline版本是在运行时动态生成train和val数据的,这种方式必须事先知道test数据的字库等信息,不太具有实践意义,所以增加了能从文件读取train和val数据的功能

  2. 增加 test数据自动缩放的功能,这样无论在训练/验证/测试过程都是保持统一的height,比较实用。 统一的height是因为 num_feature = height * channel,目前都转成灰度的了channel=1

  3. 把默认图片格式png 改成支持和默认图片格式为 jpg,更实用一些

  4. 发现运行时动态生成数据的方式往往比读如文件的方式要效果好,猜测可能是两个原因:
    a. 运行时动态生成的train 和 val数据,随机性更大,更利于深度学习?
    b. 运行时动态生成的train 和 val数据,都是png格式,用png格式训练的模型效果更好?

  5. 设计方法验证上一个问题: “从随机生成的jpg图片读取并训练” 和 “直接动态生成训练数据”,保持同样的数据量进行训练(即 为了排除所谓的“随机性更大“),然后在同一份jpg格式验证集上对比效果。
    结果是: 印证了上述 b 是真正原因:读取jpg文件的方式没有直接fly生成train样本(默认是PNG格式)效果好。

读取jpg文件的:
00000002_tZXBdv.jpg cost time: 0.786,
res: tZXBdv
00000003_7zVRNT.jpg cost time: 0.068,
res: 7zVRNT
00000001_ZLS9GY.jpg cost time: 0.066,
res: zlS9GY
00000009_jQyqBE.jpg cost time: 0.068,
res: jQyqE
00000007_uu5J.jpg cost time: 0.077,
res: u5J
00000008_qL8G.jpg cost time: 0.085,
res: qL8G
00000004_hc2UHX.jpg cost time: 0.091,
res: hc2UHX
00000006_48Ued.jpg cost time: 0.098,
res: 48Ued
00000000_oziN.jpg cost time: 0.094,
res: oZN
00000005_xRrWK.jpg cost time: 0.088,
res: XRrWK
00000010_7HEP.jpg cost time: 0.148, // 这是个非同类的图片,可不算数
res: Jj
total acc:5/11=0.4545

直接生成训练样本的:
00000002_tZXBdv.jpg cost time: 0.748,
res: tZxBdv
00000003_7zVRNT.jpg cost time: 0.073,
res: 7zVRNT
00000001_ZLS9GY.jpg cost time: 0.067,
res: zls9GY
00000009_jQyqBE.jpg cost time: 0.096,
res: jQyqBE
00000007_uu5J.jpg cost time: 0.083,
res: uu5J
00000008_qL8G.jpg cost time: 0.078,
res: qL8G
00000004_hc2UHX.jpg cost time: 0.073,
res: hc2UHX
00000006_48Ued.jpg cost time: 0.085,
res: 48Ued
00000000_oziN.jpg cost time: 0.076,
res: oziN
00000005_xRrWK.jpg cost time: 0.065,
res: xRrWK
00000010_7HEP.jpg cost time: 0.151, // 这是个非同类的图片,可不算数
res: 5hib
total acc:8/11=0.7273

  1. 在多次试验的情况下,有一些心得:
  • train时候越随机 越好, 换句话说:如果样本少而轮次再多也没用,表现就是 loss降得很低了但在验证集上准确率却很低,通俗理解就是并未发现普适规律而只是在train上过拟合了
  • train的时候准确率是有突变的情况(不仅仅是因为“一个sample里几个字符全对才算对“的原因,因为突变得实在吓人), 看如下这连续3个100次迭代:

seq 0: origin: [6, 15, 23, 6] decoded:[6, 15, 6]
seq 1: origin: [19, 28, 25, 35] decoded:[19, 26, 28]
seq 2: origin: [32, 27, 33, 9] decoded:[32, 33, 9]
seq 3: origin: [30, 34, 17, 17] decoded:[8, 13, 17]
seq 4: origin: [24, 26, 29, 24] decoded:[24, 29, 33]
accuracy: 0.00000
seq 0: origin: [6, 34, 18, 13] decoded:[29, 34, 13]
seq 1: origin: [36, 15, 32, 6] decoded:[36, 15, 6]
seq 2: origin: [16, 21, 2, 15] decoded:[16, 21, 15]
seq 3: origin: [29, 30, 11, 30] decoded:[29, 11, 30]
seq 4: origin: [10, 34, 26, 2] decoded:[10, 26, 34]
accuracy: 0.03125
seq 0: origin: [20, 5, 3, 28] decoded:[20, 5, 3, 28]
seq 1: origin: [3, 8, 20, 8] decoded:[3, 8, 20, 8]
seq 2: origin: [10, 25, 32, 28] decoded:[10, 25, 32, 28]
seq 3: origin: [2, 28, 26, 27] decoded:[2, 28, 26, 27]
seq 4: origin: [2, 33, 35, 18] decoded:[2, 33, 35, 18]
accuracy: 0.68750

  • 验证集上accurancy 从0到非零的突变一般发生在 train上loss到(NUM_CLASS / 字符数)左右时,如果loss是ppx的话 这很容易理解。
  • loss持续降但accurancy徘徊上不去了,就是 学的情况还不够全(很可能数据多样性不够,或多样性够但模型care得不够细),达不到举一反三,要注意train与val数据不一致,注意过拟合。
  • 如果 loss不降,不管accurancy在改进与否,都说明模型或算法压根儿就不对,没有 “执行力”。说明取的特征和目标函数之间本来就没有相关或者模型尝试寻找的手段不对
  1. 在网上找个数据集试试: 在 这个type2数据集上(http://www.pkbigdata.com/common/cmpt/%E9%AA%8C%E8%AF%81%E7%A0%81%E8%AF%86%E5%88%AB%E7%AB%9E%E8%B5%9B_%E8%B5%9B%E4%BD%93%E4%B8%8E%E6%95%B0%E6%8D%AE.html),稍微跑一下就到100%准确率了。这个赛事已经close了,如此之简单么?疑惑。

  2. 增加了export的功能,并写了client,以便通过TFServing对外提供服务。这基本参考之前折腾TFServing时的Sample改的,问题不多。有一点注意的就是应该在test完后export, 不需要在train后就export,否则export出来的文件里会包含一些train才用到的东西(比如 warp-ctc)就比较麻烦。

  3. 回到目标上,因为猎聘网的图片下载下来还需要人工标记,一时半会儿并不能拿到太多训练数据; 而且它的生成方法及字库也看不出来,不好直接模拟训练数据。 怎么办?

  • 直接用别的数据上训练很好的模型? --别开玩笑,绝对不行:

Restoring from /home/ML/image/lstm_ctc_ocr/output/lstm_ctc/lstm_ctc_iter_10000.ckpt... done
0_7HEP.jpg cost time: 0.723,
res: 53
10_DZHD.jpg cost time: 0.054,
res: IA
11_KFBA.jpg cost time: 0.060,
res: 5
12_9T8Y.jpg cost time: 0.061,
res: 68
13_NEYH.jpg cost time: 0.062,
res:
14_989X.jpg cost time: 0.051,
res: S
15_EA5P.jpg cost time: 0.052,
res: L
16_UVZA.jpg cost time: 0.053,
res: U3
17_758N.jpg cost time: 0.052,
res: 56
18_ZYC5.jpg cost time: 0.054,
res: I
19_D8DN.jpg cost time: 0.051,
res: I5
total acc:0/11=0.0000

  • 在通用的数据训练出的模型上,增加少量目标图片进行加强训练,不知道是否有效? Let's Try.
    没有用,loss很快就降低,然后就没法继续降下去了,accurancy持续上不去(因为数据集小,很快过拟合,即train中的滚瓜烂熟但val中却有一些压根儿不懂, 所以如此)

seq 0: origin: [31, 32, 36, 11] decoded:[31, 10, 34]
seq 1: origin: [14, 9, 14, 24] decoded:[14, 12, 18, 24]
seq 2: origin: [8, 6, 9, 24] decoded:[8, 6, 14, 24]
seq 3: origin: [14, 36, 18, 14] decoded:[14, 11, 12, 1]
seq 4: origin: [36, 35, 13, 6] decoded:[36, 8, 13, 6]
accuracy: 0.00000
loss: 0.014991194 Wrote snapshot to: /home/ML/image/lstm_ctc_ocr/output/lstm_ctc/lstm_ctc_iter_2.ckpt
seq 0: origin: [10, 9, 10, 34] decoded:[10, 12]
seq 1: origin: [21, 16, 12, 11] decoded:[21, 18, 6, 11]
seq 2: origin: [8, 6, 9, 24] decoded:[8, 6, 14]
seq 3: origin: [24, 15, 35, 18] decoded:[24, 21, 32]
seq 4: origin: [15, 11, 6, 26] decoded:[15, 8]
accuracy: 0.00000

不信你看看在train上的结果 和 在test上的结果对比:

59_UXD7.jpg cost time: 0.057,
res: UXD7
61_C2HY.jpg cost time: 0.058,
res: C2HY
63_FYVH.jpg cost time: 0.065,
res: FYVH
88_8ZE8.jpg cost time: 0.071,
res: 8ZE8
97_75UN.jpg cost time: 0.065,
res: 75UN
total acc:90/90=1.0000


0_7HEP.jpg cost time: 0.705,
res: 7EB
10_DZHD.jpg cost time: 0.052,
res: DZ5U
11_KFBA.jpg cost time: 0.065,
res: KH5A
12_9T8Y.jpg cost time: 0.051,
res: 8THF
13_NEYH.jpg cost time: 0.054,
res: NKV
14_989X.jpg cost time: 0.051,
res: 987
15_EA5P.jpg cost time: 0.055,
res: E7
16_UVZA.jpg cost time: 0.052,
res: U9A
17_758N.jpg cost time: 0.060,
res: 75DN
18_ZYC5.jpg cost time: 0.053,
res: ZYC5
19_D8DN.jpg cost time: 0.058,
res: D8K
total acc:1/11=0.0909

  1. 所以没什么取巧办法,还是多取与目标的同类数据才有用,取到多少为止呢?试试~
  • 190个增强train还是不行:

0_7HEP.jpg cost time: 0.678,
res: 7E3
10_DZHD.jpg cost time: 0.055,
res: D5D
11_KFBA.jpg cost time: 0.050,
res: K3A
12_9T8Y.jpg cost time: 0.052,
res: 9T
13_NEYH.jpg cost time: 0.050,
res: NEY
14_989X.jpg cost time: 0.055,
res: 9B9
15_EA5P.jpg cost time: 0.052,
res: E57
16_UVZA.jpg cost time: 0.054,
res: U9A
17_758N.jpg cost time: 0.051,
res: 75N
18_ZYC5.jpg cost time: 0.053,
res: ZYC5
19_D8DN.jpg cost time: 0.052,
res: D5N
total acc:1/11=0.0909

  • 190个直接train试一下,也不行:

0_7HEP.jpg cost time: 0.706,
res: 7H9
10_DZHD.jpg cost time: 0.055,
res: D2H3
11_KFBA.jpg cost time: 0.048,
res: K8
12_9T8Y.jpg cost time: 0.051,
res: 9TY
13_NEYH.jpg cost time: 0.049,
res: NH
14_989X.jpg cost time: 0.051,
res: 98X
15_EA5P.jpg cost time: 0.050,
res: EAT
16_UVZA.jpg cost time: 0.052,
res: UA
17_758N.jpg cost time: 0.053,
res: 785U
18_ZYC5.jpg cost time: 0.051,
res: ZY8
19_D8DN.jpg cost time: 0.054,
res: D8N
total acc:0/11=0.0000

继续自力更生数据吧,数据,数据。。。

  • 490个增强train已经像回事了:

0_7HEP.jpg cost time: 0.702,
res: 7HED
10_DZHD.jpg cost time: 0.053,
res: DZHD
11_KFBA.jpg cost time: 0.051,
res: KF8A
12_9T8Y.jpg cost time: 0.049,
res: 9T8Y
13_NEYH.jpg cost time: 0.048,
res: NEYH
14_989X.jpg cost time: 0.049,
res: 989X
15_EA5P.jpg cost time: 0.050,
res: EA5P
16_UVZA.jpg cost time: 0.052,
res: UVZA
17_758N.jpg cost time: 0.049,
res: 75N
18_ZYC5.jpg cost time: 0.050,
res: ZYC5
19_D8DN.jpg cost time: 0.051,
res: D8DN
total acc:8/11=0.7273

  • 490个直接训的话,效果还是有差距的:

0_7HEP.jpg cost time: 0.682,
res: 7HE9
10_DZHD.jpg cost time: 0.052,
res: DZHD
11_KFBA.jpg cost time: 0.051,
res: KA
12_9T8Y.jpg cost time: 0.048,
res: 9Y
13_NEYH.jpg cost time: 0.050,
res: NEYH
14_989X.jpg cost time: 0.052,
res: 989X
15_EA5P.jpg cost time: 0.050,
res: EA5P
16_UVZA.jpg cost time: 0.049,
res: UVA
17_758N.jpg cost time: 0.049,
res: 7CN
18_ZYC5.jpg cost time: 0.051,
res: ZYC5
19_D8DN.jpg cost time: 0.050,
res: D5N
total acc:5/11=0.4545

  1. 再加200条训练数据试试
    --- 没效果了,居然会更差,说明目标数据质量不好的话,越多还噪声越大。

0_7HEP.jpg cost time: 0.649,
res: 7HED
10_DZHD.jpg cost time: 0.057,
res: DZHD
11_KFBA.jpg cost time: 0.057,
res: KA
12_9T8Y.jpg cost time: 0.060,
res: 9T6Y
13_NEYH.jpg cost time: 0.061,
res: NEY3
14_989X.jpg cost time: 0.064,
res: 989X
15_EA5P.jpg cost time: 0.077,
res: EA5P
16_UVZA.jpg cost time: 0.089,
res: UVZA
17_758N.jpg cost time: 0.093,
res: 75BN
18_ZYC5.jpg cost time: 0.088,
res: ZYC5
19_D8DN.jpg cost time: 0.094,
res: D5DN
total acc:5/11=0.4545

  1. 偶然发现更简单的验证码网站,准确率应该能高一些吧?
    就是 CSDN的验证码:https://passport.csdn.net/ajax/verifyhandler.ashx
  • 用了500个数据,直接训完全不行。。。
  • 先用自动生成的数据训一个base,再用这500增强训,收敛速度和效果都好得不要不要的。。。

90_WFPIp.jpg cost time: 0.794,
res: WFPIp
91_ptyAB.jpg cost time: 0.083,
res: ptyAB
92_NI3kj.jpg cost time: 0.105,
res: NI3kj
93_oLQHj.jpg cost time: 0.118,
res: oLQHj
94_4Nd2H.jpg cost time: 0.118,
res: 4Nd2H
95_q6hJ8.jpg cost time: 0.121,
res: q6hJ8
96_AB6yU.jpg cost time: 0.122,
res: AB6yU
97_Hqtfk.jpg cost time: 0.112,
res: Hqtfk
98_8Ixy6.jpg cost time: 0.083,
res: 8Ixy6
99_X6W2P.jpg cost time: 0.068,
res: X6W2P
total acc:10/10=1.0000

  1. 再看看具体网络吧,总有人喜欢面试问这个,目前我觉得基本都是抄来抄去的,鲜有大牛研究者;记这好像没啥用吧?
(self.feed('data')
    .conv_single(3, 3, 64 ,1, 1, name='conv1',c_i=cfg.NCHANNELS)
    .max_pool(2, 2, 2, 2, padding='VALID', name='pool1')
    .conv_single(3, 3, 128 ,1, 1, name='conv2')
    .max_pool(2, 2, 2, 2, padding='VALID', name='pool2')
    .conv_single(3, 3, 256 ,1, 1, name='conv3_1')
    .conv_single(3, 3, 256 ,1, 1, name='conv3_2')
    .max_pool(1, 2, 1, 2, padding='VALID', name='pool2')
    .conv_single(3, 3, 512 ,1, 1, name='conv4_1', bn=True)
    .conv_single(3, 3, 512 ,1, 1, name='conv4_2', bn=True)
    .max_pool(1, 2, 1, 2, padding='VALID', name='pool3')
    .conv_single(2, 2, 512 ,1, 1, padding = 'VALID', name='conv5', relu=False)
    #.dropout(keep_prob = self.keep_prob, name = 'dropout_layer')
    .reshape_squeeze_layer(d = 512 , name='reshaped_layer'))

 (self.feed('reshaped_layer','time_step_len')
    .bi_lstm(cfg.TRAIN.NUM_HID,cfg.TRAIN.NUM_LAYERS,name='logits'))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容