验证码识别之效果不太理想(上)

Posted 大师兄师傅去哪了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码识别之效果不太理想(上)相关的知识,希望对你有一定的参考价值。

package

os: 对系统的文件、目录进行操作,用于图片存储路径读取
PIL:图片处理标准库
keras:python深度学习框架,简单易用

验证码图片

下面的验证码由数字、字母和简单的图形组成,其图片的命名方式为验证码内容
图片大小统一为203x66,所以之后也不需要对图片大小进行处理

from PIL import Imageimport matplotlib.pyplot as plt%matplotlib inlineimg = Image.open(r'/Users/yhl/Desktop/machinelearning/验证码数据/yzm_text_1/1ee2x8.jpg')plt.imshow(img)plt.show()print('图片的尺寸:',img.size) #图片的尺寸print('图片的模式:',img.mode) #图片的模式print('图片的模式:',img.format) #图片的格式


图片的尺寸: (203, 66)
图片的模式: RGB
图片的模式: JPEG

图片读取与处理

先对图片进行读取,读取过程需要用到os模块

import osdef get_file_path(path): path_set = [] filenames_set=[] for dirpath,dirnames,filenames in os.walk(path): for filename in filenames: if '.jpg' in filename: filenames_set.append(filename)#用于将文本转化为label path_set.append(os.path.join(dirpath,filename))#用于图片读取 return(path_set,filenames_set) mypath = r'/Users/yhl/Desktop/machinelearning/验证码数据'path_set,filename_set = get_file_path(mypath)#存放所有图片路径以及图片名称print('验证码文件路径:',path_set[1])print('验证码文件名:',filename_set[1])#用于转换为之后的输出label
验证码文件路径: /Users/yhl/Desktop/machinelearning/验证码数据/yzm_text_4/f7dr45.jpg

验证码文件名: f7dr45.jpg


在将图片数值化之前,可以用PIL中的enhance进行处理,增加图片的对比度

from PIL import ImageEnhance#图片增加对比度img = Image.open(r'/Users/yhl/Desktop/machinelearning/验证码数据/yzm_text_1/1ee2x8.jpg')img = img.convert('L')img = ImageEnhance.Contrast(img)img = img.enhance(3)plt.imshow(img)plt.show()


接下来将图片转化为向量,将其作为神经网络的输出参数

import numpy as npdef map2vec(mappath):#将图像转化为向量 im = Image.open(mappath) im = im.convert('L') #im.show() im = ImageEnhance.Contrast(im) im = im.enhance(3) #im.show() data = im.getdata() data = np.array(data)*(1./255)#数据标准化 return(data)imgpath = r'/Users/yhl/Desktop/machinelearning/验证码数据/yzm_text_1/1ee2x8.jpg'Input_data = map2vec(imgpath)print(Input_data)print('输入向量大小:',len(Input_data)) # 将203x66的推按转化为13398个数值
[0.82745098 0.82745098 0.82745098 ... 0.81568627 0.81568627 0.81568627]
输入向量大小: 13398


搞定输入,接下来是神经网络的输出,因为最后的神经节点要用到softmax函数,所有需要对标签值进行one-hot处理

def name2label(labelname):#数据标签one_hot处理 label = np.zeros(36)#26字母+10数字 name = labelname[0:6] for c in name: if ord(c) >= ord('a'): idx = ord(c) - ord('a') if ord(c) <= ord('9'): idx = ord(c) - ord('0') + 26 label[idx] = 1 return(label)#将数值8转化为标签ch_num = name2label('8')print(ch_num)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]


测试时,需要将这些标签转化为对应的字符,所以需要编写一个逆向转化函数

def Charact_map2word(arraynum):#36个数字---对于单个字符 indexnum = np.where(arraynum == np.max(arraynum))[0] if indexnum <=25: indexnum = ord('a') + indexnum  else: indexnum = ord('0') + indexnum - 26 return(chr(indexnum))
print('对上面ch_num转换为字符结果为:', Charact_map2word(ch_num))

对上面ch_num转换为字符结果为: 8


批量对数据进行处理,构建神经网络

def map_Characterization(path,filename):#将处理过数据整合 alldata = [] alllabel = [] for p,f in zip(path,filename): alldata.append(map2vec(p)) alllabel.append(name2label(f)) return(alldata,alllabel)
input_data,out_data = map_Characterization(path_set,filename_set)#将数据分为验证集和数字级train_data = input_data[:5376]train_data = np.array(train_data)train_label = out_data[:5376]train_label = np.array(train_label)test_data = input_data[5376:]test_label = out_data[5376:]#构建神经网络model = models.Sequential()#输入节点与输入数据相同,激活节点使用relu函数model.add(layers.Dense(10000,activation = 'relu', input_shape = (13398,)))model.add(layers.Dense(10000,activation = 'relu'))#加入Dropout函数防止过拟合model.add(layers.Dropout(0.1))model.add(layers.Dense(500,activation = 'relu'))model.add(layers.Dropout(0.1))model.add(layers.Dense(100,activation = 'relu'))model.add(layers.Dropout(0.1))#输出为softmax函数model.add(layers.Dense(180,activation = 'softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])#设定各参数
model.fit(train_data,train_label,epochs = 20, batch_size = 128)#训练模型
#####模型训练完之后,对数据进行转化和对比#########classes = model.predict(test_data)

这里用到的神经网络为密集连接层,其从输入特征空间中学到的是全局模式,也就是说如果其中一个字符位置发生变化,其预测准确性会大幅降低。而卷积层可以学到模式的空间层次结构,并且学到的模式具有平移不变性,在更少的训练样本就可以学到更具泛化能力的数据表示,这也是之后尝试的方向。

最后,感谢赵老师提供的验证码图片。


以上是关于验证码识别之效果不太理想(上)的主要内容,如果未能解决你的问题,请参考以下文章

验证码识别之二值化

tesseract 验证码识别前预处理之去干扰线

图片识别之验证码识别

简单的验证码识别

精选文章 | 机器学习在图形验证码识别上的应用

图片识别之验证码识别