当前位置:   article > 正文

python实现简单的验证码识别_用python的sklearn库.pkl模型识别验证码

用python的sklearn库.pkl模型识别验证码

验证码识别是一个机器学习分类问题

标签类别有大小写的a——z和数字的0——9

本文以KNN算法为例,实现简单的验证码识别

数据集简介

使用的数据集包括一个包含19999张图片的训练集、一个包含20000张图片的测试集

以第0个图像为例

读取并查看图像的形状,可以看出是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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

处理训练集之后再保存为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)
  • 1
  • 2
  • 3
  • 4

测试集同理:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

处理后保存:

# 测试集中图像名称为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)
  • 1
  • 2
  • 3
  • 4
  • 5

提取保存好的数据集,进行训练和预测

提取训练集和测试集:

x_train = np.load('./data/x_train.npy')
y_train = np.load('./data/y_train.npy')
x_test = np.load('./data/x_test.npy')
  • 1
  • 2
  • 3

将训练集转为一维:

# 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

特征降维:

# 特征降维
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)
  • 1
  • 2
  • 3
  • 4
  • 5

预测:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(decom_x_train, y_train)
knn.score(decom_x_test, y_test)
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/532206
推荐阅读
相关标签
  

闽ICP备14008679号