验证码识别之效果不太理想(上)
Posted 大师兄师傅去哪了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码识别之效果不太理想(上)相关的知识,希望对你有一定的参考价值。
package
os: 对系统的文件、目录进行操作,用于图片存储路径读取
PIL:图片处理标准库
keras:python深度学习框架,简单易用
验证码图片
下面的验证码由数字、字母和简单的图形组成,其图片的命名方式为验证码内容
图片大小统一为203x66,所以之后也不需要对图片大小进行处理
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
img = 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 os
def 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 np
def 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)
这里用到的神经网络为密集连接层,其从输入特征空间中学到的是全局模式,也就是说如果其中一个字符位置发生变化,其预测准确性会大幅降低。而卷积层可以学到模式的空间层次结构,并且学到的模式具有平移不变性,在更少的训练样本就可以学到更具泛化能力的数据表示,这也是之后尝试的方向。
最后,感谢赵老师提供的验证码图片。
以上是关于验证码识别之效果不太理想(上)的主要内容,如果未能解决你的问题,请参考以下文章