一、准备条件
1.tensorflow的环境准备,直接pip install tensorflow ,查环境的话再去官网补。
2.去你要识别的网站上爬取验证码图片,用这种完全正确的数据集去训练模型,正确率几乎100%。但是这种方式打标签比较麻烦,因为如果你人工打标签,1W张验证码,你可能人都废了,但是这种人工打标的方式是正确率最高的。或者你使用代码生成和你验证码类似的验证码图片。这里推荐训练的数据集5K-1W张。但是这种代码生成的验证码肯定没有你直接拿别人网站下载出来的验证码效果好。但是方便你打标签,毕竟是程序生成的。
简单概念补充:
1.什么是数据集?
这里的数据集,就是你准备的一万张验证码的图片。
类似如下这种图片,准备类似一万张!放在同一个文件夹中。
2.what is label ?(什么是标签?)
如图:
这里的验证码里面的识别内容,就是标签,这个标签的作用就是让机器学习框架知道,这个图的正确结果是什么,你需要提前把正确结果标注出来,并告诉机器学习框架这个结果的值是多少,这个过程就是打标签。
比如我们这个图片的标签就应该是:26-3=?
一般而言,我们直接把标签打在照片的命名中,这样方便操作,把图片加载完成后,可以很方便把标签提取出来。类似这样,26-3=_question_01.png
这里的?采用了_question
代替
二、开始训练
在准备好数据集后,并标注好标签后,我们就可以着手训练呢。
1.getimg.py 这个是获取图片集合的代码
import os
from PIL import Image
import numpy as np
CAPTCHA_LEN = 7
CAPTCHA_HEIGHT = 80
CAPTCHA_WIDTH = 200
# 定义新的字符集
symbols = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', 'X', '=', '?']
# 使用新的字符集代替旧的CAPTCHA_LIST
CAPTCHA_LIST = symbols
def file_name(file_dir):
for files in os.walk(file_dir):
return files[2] # 当前路径下所有非目录子文件
def load_image(filename,isFlatten=False):
isExit=os.path.isfile(filename)
if isExit==False:
print("打开失败 ")
img = Image.open(filename)
if isFlatten:
img_flatten = np.array(np.array(img).flatten())
# print(img_flatten)
return img_flatten
else:
img_arr = np.array(img)
# print(img_arr)
return img_arr
def load_allimg():
flies = file_name("G://PythonTest//TestImages") # 这里填写验证码数据集的路径
list1 = []
for item in flies:
#print(item)
list1.append(load_image("G://PythonTest//TestImages//"+str(item))) # 这里填写验证码数据集的路径
return list1
注意:
值得注意的是symbols
,这个就是你训练的数据集中有哪些符号,比如字母数字符号,你都要给他写进去。我这里就是数字加几个运算符号。
CAPTCHA_LEN
我是根据验证码的总字符数算的,比如26-10=?总共就是7个字符,给的最大值。
然后就是2个路径G://PythonTest//TestImages
上面提到的这几个地方是你可能需要修改的地方。
2.process.py
import numpy as np
from getimg import file_name
from getimg import load_allimg
from getimg import CAPTCHA_HEIGHT, CAPTCHA_WIDTH, CAPTCHA_LEN, CAPTCHA_LIST
import random
import cv2
# 图片转为黑白,3维转1维
def convert2gray(img):
if len(img.shape)>2:
img = np.mean(img, -1)
return img
# 验证码文本转为向量
def text2vec(text,captcha_len=CAPTCHA_LEN, captcha_list=CAPTCHA_LIST):
text_len = len(text)
if text_len > captcha_len:
raise ValueError("验证码超过4位啦!")
vector = np.zeros(captcha_len * len(captcha_list))
for i in range(text_len): vector[captcha_list.index(text[i]) + i * len(captcha_list)] = 1
return vector