赞
踩
验证码识别是一个机器学习分类问题
标签类别有大小写的a——z和数字的0——9
本文以KNN算法为例,实现简单的验证码识别
使用的数据集包括一个包含19999张图片的训练集、一个包含20000张图片的测试集
读取并查看图像的形状,可以看出是30*150的三通道彩色图像
可视化图像:
首先需要对图像进行灰度化处理,将图像转化为单通道的灰度图像:
再进行二值化处理:
此时会发现背景还有少许的噪声点,目前本菜鸡还没有找到比较好的方法去除T^T
三次尝试:
1、第一次使用了先膨胀再腐蚀,正确率0.88
2、第二次使用了中值滤波器,正确率0.67
3、第三次没有进行降噪,正确率0.90
此时得到的图像形状为:
因为每个图像包含5个字符,所以我们可以把图像reshape,分割为5个小部分:
第0个小块的形状:
可视化第0个小块:
将预处理的代码封装成函数:
x_train, y_train = [], [] # 处理训练集 def threshold_train(path): # 读取图像 img = cv2.imread(path) # 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 腐蚀和膨胀是对白色部分而言的,膨胀,白区域变大,最后的参数为迭代次数 #dst = cv2.dilate(dst, None, iterations=1) # 腐蚀,白区域变小 #dst = cv2.erode(dst, None, iterations=1) # 中值滤波器 #dst = cv2.medianBlur(dst, 3) # 将图像进行分割 dst = dst.reshape([30, -1, 30]) # 分别保存每个字符 for i in range(5): x_train.append(dst[:, i]) y_train.append(str(path[8 + i])) #plt.imshow(dst)
处理训练集之后再保存为npy文件
for path in pathDir:
threshold_train('./train/' + path)
np.save('./data/x_train.npy', x_train)
np.save('./data/y_train.npy', y_train)
测试集同理:
x_test = [] # 处理测试集 def threshold_test(path): # 读取图像 img = cv2.imread(path) # 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 腐蚀和膨胀是对白色部分而言的,膨胀,白区域变大,最后的参数为迭代次数 #dst = cv2.dilate(dst, None, iterations=1) # 腐蚀,白区域变小 #dst = cv2.erode(dst, None, iterations=1) # 中值滤波器 #dst = cv2.medianBlur(dst, 3) # 将图像进行分割 dst = dst.reshape([30, -1, 30]) # 分别保存每个字符 for i in range(5): x_test.append(dst[:, i]) #y_test.append(str(path[7 + i])) #plt.imshow(dst)
处理后保存:
# 测试集中图像名称为0——19999,所以不能用文件系统提取目录,否则数据顺序为0、1、10、100、1000...
#pathDir2 = os.listdir('./test')
for i in range(0, 20000):
threshold_test('./test/' + str(i) + '.jpg')
np.save('./data/x_test.npy', x_test)
提取训练集和测试集:
x_train = np.load('./data/x_train.npy')
y_train = np.load('./data/y_train.npy')
x_test = np.load('./data/x_test.npy')
将训练集转为一维:
# reshape训练集
n_samples, n1, n2 = x_train.shape
x_train = x_train.reshape(n_samples, n1*n2).astype(np.float32)
# reshape测试集
n_samples_test, n1_test, n2_test = x_test.shape
x_test = x_test.reshape(n_samples_test, n1_test*n2_test).astype(np.float32)
特征降维:
# 特征降维
from sklearn.decomposition import PCA
pca = PCA(n_components = 64)
decom_x_train = pca.fit_transform(x_train)
decom_x_test = pca.transform(x_test)
预测:
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(decom_x_train, y_train)
knn.score(decom_x_test, y_test)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。