前言
在接触keras之后,一开始的实验都是用keras内置的数据集,比如mnist数据集,直接用一行代码直接导入就好了。但是在学习的深入,想要导入自己所需要的数据集,下面就分两个大部分介绍
第一部分:keras数据集的制作
这一部分是参考这篇博客的:https://blog.csdn.net/baidu_35113561/article/details/79413308
以下类容作为自己的笔记记录下来
第一步:寻找和建立样本
captcha本身提供了用户自定义验证码生成API,利用它,我们可以轻松的建立样本。样本数目不要太少,视项目具体情况而定(本项目一般50000个左右)。网上有很多资源关于如何用captcha生成*.png的验证码,这里就不再赘述。
第二部:为样本打好标签(label)
得到了样本后我们下面一步要做的就是给样本打标签。作为一个监督学习的项目,我们有义务告诉计算机什么样的结果是正确的,什么样的结果是错误的。如果说X_train为样本的话,我们这里要做的便是得到y_train。打标签的方法有很多,比如建立*.txt文件对应样本一一做标签。Concretely, 本项目中,captcha在随机生成验证码 的同时已经将相应验证码样本命名为了代表其含义的png文件前缀(下图所示),这非常利于我们做标签。
训练这个项目的最简单方法就是建立n个神经网络并训练机器使其能够分辨第n位字符(n为验证码长度)。例如要训练机器识别第一位字符,我们要做的便是检索每个样本文件名,将其对应的ASCII码提取出来,经过处理①并写入*.txt中,这样就得到标签了。关于如何提取字符ascii,可自行网上搜索,相关资源很丰富。
①处理:将26个字母编码,比如:0代表A,1代表B,2代表C...........这样keras之后就能通过one_hot编码了。
第三部:导入数据集
这里,我们通过numpy和PIL两个库。
先说导入图片,这里我们的图片格式是RGB 60*160 png。单张图片灰度化和导入使用PIL(opencv也可以)。因为我们需要导入整个样本库,所以需要用append函数把新的单张图片矩阵加到整个矩阵集合里,这之前当然要定义一个数组来作为集合,如images = []。之后再使用X = numpy.array(images),这样便得到了numpy格式的数据集。导入完毕后,我们可以通过print(X.shape)看看导入是否正确,例如我们导入了30000张60*160的图片,应得到:(30000, 60, 160)
然后是导入标签,即y。直接y = numpy.loadtxt('*.txt')即可。之后print (y.shape)应得到:(30000,),注意样本数和标签数一定要对应。
第四步:得到训练集和测试集(X_train,X_test,y_train,y_test)
此项目,我们可以使用sklearn库中的train_test_split函数将整个数据集分成训练集和测试集(X_train,X_test,y_train,y_test),此函数还有一个优点是会打乱顺序,比较好。关于该函数用法可自行百度。提供个参考:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state= 30)
通过上述四步,我们便人工完成了如下函数功能:(X_train, y_train), (X_test, y_test) = mnist.load_data()
之后reshape下X_train,X_test,y_train,y_test,搭建网络,训练即可。
源码:https://github.com/YingjieZhang31/Captcha-Verification-Code-Recognition
import os
import numpy as np
np.random.seed(1337)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dropout, Dense, Activation, Convolution2D, MaxPooling2D, ZeroPadding2D, Flatten
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from PIL import Image
###########################################################################
def read_image(img_name):
im = Image.open(img_name).convert('L')
data = np.array(im)
return data
images = []
for fn in os.listdir('./images'):
if fn.endswith('.png'):
fd = os.path.join('./images',fn)
images.append(read_image(fd))
print('load success!')
X = np.array(images)
print (X.shape)
y = np.loadtxt('out.txt')
print (y.shape)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state= 30)
print (X_train.shape)
print (X_test.shape)
print (y_train.shape)
print (y_test.shape)
print("Changing format......")
X_train = X_train.reshape(-1, 1,60, 160)/255.
X_test = X_test.reshape(-1, 1,60, 160)/255.
y_train = np_utils.to_categorical(y_train, num_classes=26)
y_test = np_utils.to_categorical(y_test, num_classes=26)
print (X_train.shape)
print (X_test.shape)
print (y_train.shape)
print (y_test.shape)
print("Changing succeeded!")
os.system("pause")
#########################################################################
model = Sequential()
##1:64
model.add(Convolution2D(
nb_filter = 64,
nb_row = 3,
nb_col = 3,
border_mode = 'same',
input_shape=(1,60,160)
)
)
model.add(Activation('relu'))
model.add(Dropou