前言
本文使用的Python版本为3.7
之前使用KNN做字符识别,效果不是特别好,本文尝试使用CNN进行字符识别。
https://www.psvmc.cn/article/2024-09-05-opencv-num-recognize-knn-python.html
经过测试
通过CNN识别的效果要比KNN好一点,但是识别的相对慢一点。
相同素材训练的模型KNN比CNN的大。
附:阿里云识别
后文
在做简单字符的识别的前提下,CNN并没有相比KNN有太大的优势,但是无论训练还是识别却慢不少,所以最终还是使用的KNN。
字符识别图片尺寸推荐
常见的简单字符识别任务通常使用以下几种尺寸:
- 28x28像素:这是MNIST手写数字数据集的标准尺寸,适合简单字符识别任务。
- 32x32像素:CIFAR-10数据集中的图片尺寸,适用于需要稍多细节的简单字符识别任务。
- 64x64像素:适用于需要更多细节或者更复杂字符的识别任务。
添加依赖
项目目录下初始化
1 | pipenv install |
为了实现字符识别任务,你需要安装以下依赖库。
这些库包括用于图像处理的OpenCV、深度学习框架TensorFlow、以及数据处理库NumPy和Scikit-learn。
说明
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理功能。
TensorFlow是一个流行的深度学习框架,用于构建和训练神经网络模型。
NumPy是一个用于科学计算的基础库,提供了高性能的多维数组对象和用于处理这些数组的工具。
Scikit-learn是一个用于机器学习的库,提供了数据分割、模型评估等功能。
安装依赖
一定要注意版本
1 | pipenv install opencv-python==4.5.4.60 |
不用的时候卸载
1 | pipenv uninstall tensorflow-cpu |
GPU版本的TensorFlow
1 | pipenv install tensorflow==2.3.0 |
或者编辑Pipfile文件
1 | [[source]] |
修改后执行安装
1 | pipenv install |
安装确认
安装完成后,你可以在Python环境中确认这些库是否正确安装:
1 | import cv2 |
模型训练
工具类
cnn_train.py
1 | import csv |
代码解释:
数据分割
1 | X_train, X_test, y_train, y_test = train_test_split(images, int_labels, test_size=0.2, random_state=42) |
方法及参数:
train_test_split
是scikit-learn
库中的一个函数,用于将数据集分割为训练集和测试集。images
是输入图像数据,int_labels
是对应的标签数据。test_size=0.2
表示将数据集的 20% 作为测试集,剩下的 80% 作为训练集。random_state=42
用于设置随机种子,确保每次运行代码时数据分割的结果都是一致的。
数据重塑
1 | X_train = X_train.reshape(-1, 64, 64, 1) |
方法及参数:
reshape
方法用于改变数组的形状。-1
表示自动计算该维度的大小,以使总元素数量保持不变。64, 64
表示图像的宽度和高度。1
表示图像的通道数,这里假设图像为灰度图像(单通道)。
模型定义
1 | model = models.Sequential([ |
方法及参数:
models.Sequential
是一个用于构建顺序模型的类,即一层一层堆叠的模型。第一层:
1
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 1))
Conv2D
表示二维卷积层。32
是卷积核的数量。(3, 3)
是卷积核的大小。activation='relu'
表示使用 ReLU 激活函数。input_shape=(64, 64, 1)
表示输入图像的形状为 64x64 像素,单通道。
第二层:
1
layers.MaxPooling2D((2, 2))
MaxPooling2D
表示二维最大池化层。(2, 2)
表示池化核的大小。
第三层:
1
layers.Conv2D(64, (3, 3), activation='relu')
- 类似第一层,但卷积核的数量增加到 64。
第四层:
1
layers.MaxPooling2D((2, 2))
- 类似第二层。
第五层:
1
layers.Conv2D(64, (3, 3), activation='relu')
- 类似第三层。
第六层:
1
layers.Flatten()
Flatten
层用于将多维输入展平为一维。第七层:
1
layers.Dense(64, activation='relu')
Dense
表示全连接层。64
是输出维度。activation='relu'
表示使用 ReLU 激活函数。
第八层:
1
layers.Dense(len(label_to_int), activation='softmax')
Dense
层用作输出层。len(label_to_int)
是输出类别的数量。activation='softmax'
表示使用 softmax 激活函数,用于多分类问题。
字符识别
工具类
cnn_recognition.py
1 | import json |
测试
1 | import os |