【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)

一、任务描述:

  • 本次实践是一个多分类任务,需要将照片中的每个字符分别进行识别,完成车牌的识别

  • 实践平台:百度AI实训平台-AI Studio、PaddlePaddle1.8.0

二、数据集介绍

  • 数据集文件名为characterData.zip,其中有65个文件夹

  • 包含0-9,A-Z,以及各省简称

  • 图片为12020的灰度图像

  • 本次实验中,取其中的10%作为测试集,90%作为训练集

【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第1张图片

三、模型定义

3.1 DNN模型

深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础,其结构为input、hidden(可有多层)、output,每层均为全连接。
【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第2张图片
核心代码为:

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

训练结果:
【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第3张图片
在测试集上得到模型准确度为0.93259805。

3.2 CNN模型

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

代码结果:
【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第4张图片
在测试集上得知,模型准确度提高到了0.9810049。

3.3 VGG模型

选择了经典的卷积神经网络-VGG网络结构,如图所示。其结构与上述CNN网络相比更深,能进一步提高结果。

【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第5张图片

核心代码:

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:
【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)_第6张图片
在测试集上得知,模型准确度进一步提高到了0.9921875



完整代码获取点击链接:https://aistudio.baidu.com/aistudio/projectdetail/692290

你可能感兴趣的:(机器学习,&,深度学习)