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

该博客介绍了通过DNN、CNN和VGG模型实现车牌字符识别的过程。在AI Studio平台上,使用PaddlePaddle1.8.0进行实践。数据集包括65个文件夹,涵盖数字、字母和省份简称。经过训练,VGG模型在测试集上的准确率达到了0.9921875,相比于DNN和CNN的准确率有显著提升。
摘要由CSDN通过智能技术生成

一、任务描述:

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

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

在这里插入图片描述

二、数据集介绍

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

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

  • 图片为12020的灰度图像

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

在这里插入图片描述

三、模型定义

3.1 DNN模型

深度神经网络(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)
        # pr
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中的cv2.dnn.NMSBoxesRotated函数是用于对旋转框进行非极大值抑制(NMS)的函数。它的源码实现如下: ```python def NMSBoxesRotated(boxes, scores, score_threshold, nms_threshold, eta=1.0): """ boxes: 旋转框的坐标,形状为(n, 5),其中n为旋转框的数量,每个旋转框包含5个元素, 分别表示旋转框的中心点坐标(x,y)、宽度(w)、高度(h)和旋转角度(theta) scores: 旋转框的得分,形状为(n,) score_threshold: 得分阈值,低于该阈值的旋转框将被过滤掉 nms_threshold: NMS阈值,用于控制旋转框的重叠度 eta: 用于调整旋转框在NMS过程中的得分权重 返回值: indices: 一个二维数组,形状为(k, 1),其中k是保留下来的旋转框的数量,每个元素表示 保留下来的旋转框的索引号。 """ # 保留得分大于等于score_threshold的旋转框 indices = np.where(scores >= score_threshold)[0] if len(indices) == 0: return np.empty((0, 1), dtype=np.int32) # 提取旋转框的坐标和得分 boxes = boxes[indices] scores = scores[indices] # 计算旋转框的面积 areas = boxes[:, 2] * boxes[:, 3] # 对旋转框按得分从大到小排序 order = np.argsort(-scores) # 保留下来的旋转框的索引号 keep = [] while order.size > 0: idx = order[0] # 得分最高的旋转框的索引号 keep.append(idx) # 保留该旋转框 # 计算该旋转框与其他旋转框的IoU xx1 = np.maximum(boxes[idx, 0] - boxes[idx, 2] / 2, boxes[:, 0] - boxes[:, 2] / 2) yy1 = np.maximum(boxes[idx, 1] - boxes[idx, 3] / 2, boxes[:, 1] - boxes[:, 3] / 2) xx2 = np.minimum(boxes[idx, 0] + boxes[idx, 2] / 2, boxes[:, 0] + boxes[:, 2] / 2) yy2 = np.minimum(boxes[idx, 1] + boxes[idx, 3] / 2, boxes[:, 1] + boxes[:, 3] / 2) theta = boxes[idx, 4] - boxes[:, 4] idxs = np.where((xx2 > xx1) & (yy2 > yy1) & (theta <= nms_threshold))[0] # 计算权重 weight = np.ones(idxs.shape[0]) if eta > 0: dx = boxes[idxs, 0] - boxes[idx, 0] dy = boxes[idxs, 1] - boxes[idx, 1] delta_theta = boxes[idxs, 4] - boxes[idx, 4] rho = np.sqrt(dx ** 2 + dy ** 2) weight = np.exp(-(rho ** 2) / (2 * eta * eta)) weight *= np.exp(-(delta_theta ** 2) / (2 * (np.pi / 180) ** 2)) # 应用权重 scores[idxs] *= weight # 移除IoU大于等于NMS阈值的旋转框 idxs = np.delete(idxs, np.where(scores[idxs] < score_threshold)[0]) order = np.delete(order, np.where(order == idxs)[0]) return np.array(keep, dtype=np.int32).reshape(-1, 1) ``` 这个函数的实现过程与传统的NMS算法基本一致,主要是在计算IoU时需要考虑旋转框的旋转角度,并且在应用权重时还需要考虑旋转角度的差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值