captcha_break

github链接:https://github.com/ypwhs/captcha_break

自动生成验证码图片,构建ctc网络训练从图片到验证码的网络

ctc1.pth

原始模型(见ctc_pytorch.ipynb),训练学习率及次数 [(1e-3, 6), (1e-4, 3)]

准确率达到0.96,据说调成[(1e-3, 30), (1e-4, 15)] 准确率能达到0.9954

ctc2.pth

将4位大写字母+数字验证码替换为大写+小写+数字验证码,并且结果统一使用小写

4’/epoch,准确率近0.96

ctc3*.pth

image-20211005000227959

  1. 增加batch_size从70到128:训练Acc脱离0的速度明显加快
  2. 对图像使用数据增强(添加了更多的干扰点和干扰线):训练得到的鲁棒性提高
  3. 将验证码从4位变成5位

这次遇到训练集上准确率提升,而测试集降低的情况,可能是学习率太高,模型训练学习率及参数[(1e-3, 4), (1e-4, 3), (1e-5, 3)]

5’22/epoch,模型准确率最高达到0.9791(准确率见文件后缀)

训练集 测试集
Epoch: 1 Loss: 0.0933 Acc: 0.8746 Test : 1 Loss: 0.1367 Acc: 0.8248
Epoch: 2 Loss: 0.0577 Acc: 0.9166 Test : 2 Loss: 0.9233 Acc: 0.4788
Epoch: 3 Loss: 0.0464 Acc: 0.9270 Test : 3 Loss: 0.0720 Acc: 0.8893
Epoch: 4 Loss: 0.0309 Acc: 0.9483 Test : 4 Loss: 0.0345 Acc: 0.9477

ctc4*.pth

将5位大写+小写+数字调整为仅小写字母,以适应需求,准确率最高达0.9944

ctc5*.pth

如果使用上述模型直接预测CCDC的验证码,仍然得到很低的准确率,甚至一直是0%,不能直接使用,需要在原有的基础上进行模型微调。

使用webber/webber.pyhttps://www.ccdc.cam.ac.uk/captcha.gif上收集数据,同时人工标注,得到61个小样本数据作为数据源,webber/tune.py将10%放入测试集,进行微调训练,学习率及训练轮次为[(1e-3, 5), (1e-4, 5), (1e-5, 5)],最终的准确率达到0.9864,已经可以使用了

found model at /home/sunie/Desktop/pythonFiles/wencai/wencai/torch/captcha_break/model/ctc4_9944.pth
{0: 'qfstl', 1: 'ktwqn', 2: 'imuay', 3: 'kflna', 4: 'vwksm', 5: 'aprlt', 6: 'avtmy', 7: 'jsakq', 8: 'wknys', 9: 'ckajx', 10: 'bwlva', 11: 'xbiuu', 12: 'piabk', 13: 'uxffp', 14: 'nkqka', 15: 'hsyfw', 16: 'dwxnu', 17: 'hrffm', 18: 'umrmd', 19: 'yfilm', 20: 'nfloy', 21: 'yisws', 22: 'usbpf', 23: 'kwvkk', 24: 'iatau', 25: 'cobfi', 26: 'htjob', 27: 'ssjmv', 28: 'kaavy', 29: 'ppakb', 30: 'xaowo', 31: 'djiqy', 32: 'yaayx', 33: 'dfuoa', 34: 'bhqft', 35: 'rrhap', 36: 'pnuks', 37: 'jxbxa', 38: 'wnuju', 39: 'canah', 40: 'ixaoa', 41: 'pidaw', 42: 'xluyu', 43: 'lkuiu', 44: 'aakca', 45: 'jvuha', 46: 'fafff', 47: 'nanka', 48: 'oalyp', 49: 'spmcx', 50: 'bqtua', 51: 'ualaf', 52: 'jkjaq', 53: 'jjdtf', 54: 'jfcca', 55: 'yqiyq', 56: 'aquas', 57: 'achin', 58: 'mqyai', 59: 'fatab', 60: 'pltbc'} 61
61
Epoch: 1 Loss: 548.4429 Acc: 0.0000 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 19.31it/s]
Test : 1 Loss: 372.9237 Acc: 0.0000 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 49.62it/s]
Epoch: 2 Loss: 287.6609 Acc: 0.0000 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.04it/s]
Test : 2 Loss: 302.8201 Acc: 1.5385 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 52.39it/s]
Epoch: 3 Loss: 175.5503 Acc: 3.8676 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.04it/s]
Test : 3 Loss: 142.0168 Acc: 7.6923 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 54.42it/s]
Epoch: 4 Loss: 91.7983 Acc: 36.4367 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 19.99it/s]
Test : 4 Loss: 187.6178 Acc: 6.1538 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 52.08it/s]
Epoch: 5 Loss: 45.9393 Acc: 49.5636 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.77it/s]
Test : 5 Loss: 27.1821 Acc: 70.7692 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 51.96it/s]
Epoch: 1 Loss: 19.4479 Acc: 89.1736 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.49it/s]
Test : 1 Loss: 18.1197 Acc: 86.1538 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 52.05it/s]
Epoch: 2 Loss: 11.2714 Acc: 94.7509 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 20.51it/s]
Test : 2 Loss: 9.3687 Acc: 95.3846 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 53.95it/s]
Epoch: 3 Loss: 8.7694 Acc: 97.7672 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.49it/s]
Test : 3 Loss: 6.3883 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 54.14it/s]
Epoch: 4 Loss: 7.2718 Acc: 95.4640 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 19.83it/s]
Test : 4 Loss: 5.5415 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 52.09it/s]
Epoch: 5 Loss: 5.6165 Acc: 98.5420 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.77it/s]
Test : 5 Loss: 4.7112 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 53.75it/s]
Epoch: 1 Loss: 5.0451 Acc: 97.6811 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 20.78it/s]
Test : 1 Loss: 3.9280 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 51.86it/s]
Epoch: 2 Loss: 5.0236 Acc: 98.5420 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.83it/s]
Test : 2 Loss: 3.8065 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 48.23it/s]
Epoch: 3 Loss: 4.7173 Acc: 98.5420 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.09it/s]
Test : 3 Loss: 3.6730 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 53.45it/s]
Epoch: 4 Loss: 4.4497 Acc: 98.5420 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 19.04it/s]
Test : 4 Loss: 3.5570 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 53.87it/s]
Epoch: 5 Loss: 4.3903 Acc: 97.4791 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 21.84it/s]
Test : 5 Loss: 3.4462 Acc: 98.4615 : 100%|█████████████████████████████████████| 13/13 [00:00<00:00, 53.62it/s]

使用方法

github链接:https://github.com/sunieee/wencai

wencai包:http://d.sunie.top:9007/packages/

pip install http://d.sunie.top:9007/packages/wencai-0.0.4.sunie.2021_10_06t09_43-py3-none-any.whl --user --upgrade
wc.update

命令行版本wc.torch ocr /tmp/wencai/tmp.png -m 5

其中,ocr后接验证码图片路径,-m表示mode,后接数字,代表使用的模型是上面5个中的哪一个

函数版本def __OCR(path='/tmp/wencai/tmp.png', verbose=False, mode=3):

from wencai.torch.cli import __OCR
result = __OCR('/tmp/wencai/tmp.png', mode=5)