本次实践是一个多分类任务,需要将照片中的每个字符分别进行识别,完成车牌的识别
实践平台:百度AI实训平台-AI Studio、PaddlePaddle1.8.0
数据集文件名为characterData.zip,其中有65个文件夹
包含0-9,A-Z,以及各省简称
图片为12020的灰度图像
本次实验中,取其中的10%作为测试集,90%作为训练集
深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础,其结构为input、hidden(可有多层)、output,每层均为全连接。
核心代码为:
class MyDNN(fluid.dygraph.Layer):
# '''
# DNN网络
# '''
def __init__(self):
super(MyDNN,self).__init__()
self.hidden1 = Linear(20*20,200,act='relu')
self.hidden2 = Linear(200,100,act='relu')
self.hidden3 = Linear(100,100,act='relu')
self.out = Linear(100,65,act='softmax')
def forward(self,input): # forward 定义执行实际运行时网络的执行逻辑
'''前向计算'''
x = fluid.layers.reshape(input, shape=[-1,20*20]) #-1 表示这个维度的值是从x的元素总数和剩余维度推断出来的,有且只能有一个维度设置为-1
# print(x.shape)
x = self.hidden1(x)
# print('1', x.shape)
x = self.hidden2(x)
# print('2',x.shape)
x = self.hidden3(x)
# print('3',x.shape)
y = self.out(x)
# print('4',y.shape)
return y
训练结果:
在测试集上得到模型准确度为0.93259805。
CNN为一个经典的2层卷积2层池化结构。
核心代码为:
class MyDNN(fluid.dygraph.Layer):
# '''
# CNN网络
# '''
def __init__(self):
super(MyDNN,self).__init__()
self.conv_1 = fluid.dygraph.Conv2D(num_channels=1, num_filters=28, filter_size=5, stride=1) #通道数、卷积核个数、卷积核大小
self.pool_1 = fluid.dygraph.Pool2D(pool_size=2, pool_type='max', pool_stride=1)
self.conv_2 = fluid.dygraph.Conv2D(num_channels=28, num_filters=32, filter_size=3, stride=1)
self.pool_2 = fluid.dygraph.Pool2D(pool_size=2, pool_type='max', pool_stride=1)
self.conv_3 = fluid.dygraph.Conv2D(num_channels=32, num_filters=32, filter_size=3, stride=1)
self.out = fluid.dygraph.Linear(input_dim=32*10*10, output_dim=65, act='softmax')
def forward(self,input):
x = self.conv_1(input)
x = self.pool_1(x)
x = self.conv_2(x)
x = self.pool_2(x)
x = self.conv_3(x)
x = fluid.layers.reshape(x, shape=[-1, 32*10*10])
y = self.out(x)
return y
代码结果:
在测试集上得知,模型准确度提高到了0.9810049。
选择了经典的卷积神经网络-VGG网络结构,如图所示。其结构与上述CNN网络相比更深,能进一步提高结果。
核心代码:
class MyDNN(fluid.dygraph.Layer):
'''
VGG 网络
'''
def __init__(self):
super(MyDNN,self).__init__()
self.conv1 = fluid.dygraph.Conv2D(num_channels=1, num_filters=64, filter_size=3, padding=2, act='relu')
self.pool1 = fluid.dygraph.Pool2D(pool_size=2, pool_stride=2, pool_type='max')
self.conv2 = fluid.dygraph.Conv2D(num_channels=64, num_filters=128, filter_size=3, padding=2, act='relu')
self.pool2 = fluid.dygraph.Pool2D(pool_size=2, pool_stride=2, pool_type='max')
self.conv3 = fluid.dygraph.Conv2D(num_channels=128, num_filters=256, filter_size=3, padding=2, act='relu')
self.pool3 = fluid.dygraph.Pool2D(pool_size=2, pool_stride=2, pool_type='max')
self.conv4 = fluid.dygraph.Conv2D(num_channels=256, num_filters=512, filter_size=3, padding=2, act='relu')
self.fc1 = fluid.dygraph.Linear(input_dim=512*6*6, output_dim=4096, act='relu');
self.fc2 = fluid.dygraph.Linear(input_dim=4096, output_dim=4096, act='relu');
self.fc3 = fluid.dygraph.Linear(input_dim=4096, output_dim=train_parameters['class_dim'], act='softmax')
def forward(self,input):
x = self.conv1(input)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool2(x)
x = self.conv3(x)
x = self.pool3(x)
x = self.conv4(x)
x = fluid.layers.reshape(x, [x.shape[0], -1])
x = self.fc1(x)
x = fluid.layers.dropout(x, 0.5)
x = self.fc2(x)
x = fluid.layers.dropout(x, 0.5)
x = self.fc3(x)
return x
训练loss:
在测试集上得知,模型准确度进一步提高到了0.9921875。
完整代码获取点击链接:https://aistudio.baidu.com/aistudio/projectdetail/692290