新的项目需要去一个网站上获取一些数据,做一个爬虫,网站上有验证码,以前的时候简单的验证码可以直接使用tesseract直接识别,但是这次的验证码长这个样子:
尝试了几次OCR的解决方案,发现不能成功,这里面有斜线干扰,数字是彩色的,且歪歪扭扭的。
所以计划使用tensorflow训练个模型,在尝试的过程中发现了一个参数都已经调好的python lib, CaptchaCracker。
训练的时候,需要调整的参数不是很多,只需要给定验证码的图片宽度高度就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import glob import CaptchaCracker as cc
train_img_path_list = glob.glob("./image/*.png")
img_width = 120 img_height = 50
CM = cc.CreateModel(train_img_path_list, img_width, img_height)
model = CM.train_model(epochs=100)
model.save_weights("./weights.h5")
|
利用脚本从网站上获取了1000多的验证码图片,批量命令后,利用excel记录标记的结果,这个过程比较辛苦,需要一点一点的标记所有的图片。
标记了1500张图,基本上样本就够了,因为这个验证码的范围是0-8,且只是4位数字。
开始运行训练代码后,我的电脑ntel(R) Core(TM) Ultra 5 (16核), 32G内存,跑了大概十来分钟,生成了一个.h5的模型文件。
下面的代码是使用模型识别新的验证码图片,同样也是需要设置一下验证码图片的高度宽度,数字长度,字符的识别范围。
应用模型后,就可以识别出来结果了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import os
import CaptchaCracker as cc
img_width = 120 img_height = 50
max_length = 4
characters = {'0', '1', '2', '3', '4', '5', '6', '7', '8'}
weights_path = "./weights.h5"
AM = cc.ApplyModel(weights_path, img_width, img_height, max_length, characters)
target_img_path = "../img_2.png"
pred = AM.predict(target_img_path) print(pred)
|
最后的识别效果还是非常棒的,基本能到95%以上的成功率。