大家好,我是java1234_小锋老师,最近写了一套基于Python深度学习的车辆车牌识别系统(PyTorch2卷积神经网络CNN+OpenCV4实现)视频教程,持续更新中,计划月底更新完,感谢支持。
视频在线地址:
https://www.bilibili.com/video/BV1BdUnBLE6N/
课程简介:

本课程采用主流的Python技术栈实现,分两套系统讲解,一套是专门讲PyTorch2卷积神经网络CNN训练模型,识别车牌,当然实现过程中还用到OpenCV实现图像格式转换,裁剪,大小缩放等。另外一套是基于前面Django+Vue通用权限系统基础上,加了车辆识别业务模型,Mysql8数据库,Django后端,Vue前端,后端集成训练好的模型,实现车牌识别。
基于Python深度学习的车辆车牌识别系统(PyTorch2卷积神经网络CNN+OpenCV4实现)视频教程 - 自定义字符图片数据集
之前学习Pytorch2的时候,我们用得数据集都是库自带的。但是我们这边的数据集需要自定义。
可以继承data.Dataset,实现 __init__初始化方法,__len__返回长度方法,__getitem__根据索引获取元素方法。因为数据集内容是图片,所以定义X属性,作为训练数据,定义y属性,作为目标数据
# 字符图片数据集
class CharPicDataset(data.Dataset):
# 根据路径获取所有文件
def list_all_files(self, root):
files = []
list = os.listdir(root) # 获取根目录下的所有文件名
for i in range(len(list)):
element = os.path.join(root, list[i]) # 获取文件路径
if os.path.isfile(element): # 判断是否是文件
files.append(element)
elif os.path.isdir(element): # 递归判断子目录
files.extend(self.list_all_files(element))
return files
def __init__(self, data_dir):
super().__init__()
if not os.path.exists(data_dir):
raise Exception("数据目录不存在")
files = self.list_all_files(data_dir)
self.X = []
self.y = []
self.dataset = numbers + alphbets + chinese
for file in files:
src_img = cv2.imread(file, cv2.IMREAD_GRAYSCALE) # 读取灰度图
resize_img = cv2.resize(src_img, (20, 20)) # 改变图片大小
self.X.append(resize_img)
dir = os.path.dirname(file) # 获取文件的目录 结果类似 ./images/cnn_char_train\A
dir_name = os.path.split(dir)[-1] # 获取目录名 结果类似 0 或者 1 或者 A 或者 苏
index_y = self.dataset.index(dir_name) # 获取标签索引
self.y.append([index_y])
self.X = np.array(self.X)
self.y = np.array(self.y)
def __len__(self):
return len(self.X)
def __getitem__(self, index):
"""
这段代码的作用是:
- 创建一个 `transforms.ToTensor()` 转换对象,用于将 PIL 图像或 numpy 数组转换为 PyTorch 张量(tensor)
- 该转换会自动将像素值从 [0, 255] 范围缩放到 [0, 1] 范围 归一化处理
- 同时会将图像的通道顺序从 HWC (Height-Width-Channel) 调整为 CHW (Channel-Height-Width),这是 PyTorch 所要求的格式
这个转换通常用于深度学习训练中,将图像数据预处理成适合神经网络输入的格式。
"""
tf = transforms.ToTensor()
return tf(self.X[index]), torch.LongTensor(self.y[index])
图片我们要处理下,先用opencv转成灰度图,0到255大小。20*20的二维数组。

定义main方法:
if __name__ == '__main__':
train_data_dir = './images/cnn_char_train'
traindataset = CharPicDataset(train_data_dir)
print(traindataset.X)
print(traindataset.y)
运行输出:
D:\python_pro\lpr2\lprs_model\venv\Scripts\python.exe D:\python_pro\lpr2\lprs_model\char_model.py
[[[1 0 1 ... 0 0 0]
[0 1 1 ... 0 0 0]
[0 2 0 ... 0 0 0]
...
[0 0 2 ... 0 0 0]
[1 0 0 ... 0 0 0]
[0 0 4 ... 0 0 0]]
[[0 1 0 ... 0 0 0]
[0 1 1 ... 0 0 0]
[1 0 1 ... 0 0 0]
...
[1 0 2 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 4 1 ... 0 0 0]]
[[0 3 0 ... 0 0 0]
[2 0 1 ... 0 0 0]
[1 0 0 ... 0 0 0]
...
[0 0 2 ... 0 0 0]
[1 0 0 ... 0 0 0]
[0 5 1 ... 0 0 0]]
...
[[0 2 0 ... 0 0 2]
[0 0 0 ... 1 1 0]
[0 2 2 ... 0 1 0]
...
[0 3 0 ... 0 0 0]
[1 0 0 ... 0 0 0]
[2 0 0 ... 0 0 0]]
[[0 1 3 ... 0 0 0]
[2 0 0 ... 0 0 0]
[0 5 1 ... 0 0 0]
...
[1 0 0 ... 0 0 0]
[0 1 1 ... 0 0 0]
[1 0 0 ... 0 0 0]]
[[0 0 2 ... 0 0 0]
[2 0 0 ... 0 0 0]
[0 2 2 ... 0 0 0]
...
[4 0 1 ... 0 0 0]
[0 0 1 ... 0 0 0]
[0 3 0 ... 0 0 0]]]
[[ 0]
[ 0]
[ 0]
...
[66]
[66]
[66]]
Process finished with exit code 0