文章目录
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="nymK2Epi-1733144367120" src="https://player.bilibili.com/player.html?aid=1255052574"></iframe>嵌入式树莓派车牌识别
树莓派介绍
树莓派(Raspberry Pi) 是一款由英国树莓派基金会(Raspberry Pi Foundation)开发的单板计算机,旨在促进计算机科学教育和实践,特别是面向学生、业余爱好者以及创客(Maker)社区。自2012年发布以来,树莓派迅速成为全球最受欢迎的开源硬件平台之一。
1. 树莓派的硬件规格
树莓派的硬件规格会随着版本的更新而变化,但所有版本都具有一定的共性,即体积小巧、低功耗、价格亲民,同时拥有丰富的接口和强大的扩展能力。以下是一些典型版本的硬件特点:
树莓派 4B(目前最常用的版本)
- 处理器:Broadcom BCM2711, 四核 ARM Cortex-A72,1.5 GHz
- 内存:2GB、4GB 或 8GB LPDDR4-3200 SDRAM
- 存储:MicroSD 卡槽用于操作系统和数据存储,也可以通过 USB 接口使用外部存储设备
- 显示:2个 Micro HDMI 接口,支持最多 4K 分辨率(3840×2160)
- 网络:
- 以太网:Gigabit Ethernet(最大 300Mbps)
- 无线:支持 2.4GHz 和 5GHz Wi-Fi,蓝牙 5.0
- USB:2个 USB 3.0、2个 USB 2.0
- 音频:3.5mm 音频接口,HDMI 音频输出
- GPIO(通用输入输出):40 引脚 GPIO(可用于连接外部硬件,如传感器、LED、继电器等)
- 电源:5V 3A USB-C 电源
树莓派 4B 的强大硬件使其能够运行 Linux 操作系统(如 Raspberry Pi OS)、各种轻量级应用,甚至可以作为桌面电脑、媒体中心、开发平台等使用。
2. 树莓派的操作系统
树莓派的操作系统大多数基于 Linux,Raspberry Pi OS(前身为 Raspbian)是官方推荐的操作系统。它基于 Debian Linux,优化了树莓派硬件,提供了图形化界面和丰富的软件包,适合教育和开发使用。其他流行的操作系统包括:
- Ubuntu Mate:适合桌面使用,图形界面友好。
- LibreELEC:一个基于 Linux 的媒体中心操作系统,用于家庭影院。
- Windows IoT Core:微软为物联网设备设计的操作系统,适合开发嵌入式应用。
- RetroPie:专为复古游戏设计的操作系统,可以将树莓派变成一个游戏机。
3. 树莓派的应用场景
树莓派的灵活性和扩展性使其在多种应用场景中得到了广泛使用,以下是一些常见应用:
教育与学习
树莓派最初的设计目标是用作教育工具,帮助学生学习编程、计算机科学和硬件原理。它支持多种编程语言,如 Python、Scratch、Java、C++,并且有大量教程和资源可供学习使用。
创客项目与原型开发
树莓派是创客和开发者的理想平台,尤其在物联网(IoT)和嵌入式开发中得到了广泛应用。通过 GPIO 引脚,树莓派能够与传感器、摄像头、LED、马达等外部设备连接,进行各种创新项目。例如,智能家居、自动化控制、机器人、无人机等。
服务器和网络设备
树莓派也可以用作轻量级服务器,比如 网络附加存储(NAS)、Web 服务器、数据库服务器,甚至是 VPN 服务器。由于其低功耗和小体积,树莓派成为了理想的家庭和小型办公室服务器。
智能家居
树莓派广泛应用于智能家居控制和自动化系统,例如,连接温湿度传感器、智能灯泡、运动检测器等设备,实现远程控制、自动化场景和数据监控。
机器人与自动化
树莓派具有丰富的 GPIO 接口,支持多种电机控制、传感器输入、图像处理等,使其成为机器人和自动化项目的理想平台。配合摄像头和 OpenCV(开源计算机视觉库),可以构建功能强大的视觉系统。
4. 树莓派的扩展能力
树莓派提供了丰富的扩展接口,方便与其他设备连接和扩展功能:
- GPIO 引脚:可以连接各种外部硬件模块,如传感器、马达、LED、按钮等。
- Camera Module:树莓派官方推出的相机模块,可以用作图像识别、视频监控等应用。
- 显示与触摸屏:树莓派支持连接 HDMI 显示器、液晶屏、触摸屏等,用于开发交互式应用。
- HAT 模块:树莓派的 HAT(Hardware Attached on Top) 是一种附加板,可以提供更多功能,例如加速度计、GPS 模块、蓝牙扩展等。
5. 树莓派的优势
- 低成本:树莓派的价格非常亲民,通常在几十美元左右,适合教育和创客使用。
- 小巧便携:树莓派体积小,重量轻,便于携带和嵌入各种设备中。
- 低功耗:相比传统的台式计算机,树莓派的功耗极低,适合长期运行,甚至可以使用电池供电。
- 强大的社区支持:树莓派有着活跃的开发者和用户社区,丰富的文档、教程和开源项目,帮助新手和开发者快速入门。
6. 总结
树莓派是一款功能强大、价格低廉的单板计算机,它凭借其广泛的应用领域、丰富的扩展接口和灵活的开发环境,成为了教育、创客、嵌入式开发、媒体播放等领域的理想工具。无论是用于学习编程,还是构建创意项目,树莓派都提供了一个高效、低成本的平台,赋予了用户极大的创作自由。
研究背景
深度学习在车牌识别领域的研究背景源于计算机视觉和模式识别领域的发展。车牌识别是一种重要的图像处理任务,它在交通
管理、安防监控、停车管理等领域具有广泛的应用价值。传统的车牌识别方法往往依赖于手工设计的特征和规则,但这些方法在复杂场景下容易受到光照、遮挡、角度变化等因素的影响,导致识别率下降。
深度学习的兴起为车牌识别带来了新的突破。以下是一些推动深度学习在车牌识别中应用的关键因素:
-
大规模数据集: 深度学习需要大量的标注数据来训练模型。近年来,大规模的车牌图像数据集被创建和共享,促进了基于深度学习的车牌识别方法的研究和发展。
-
卷积神经网络(CNN): 卷积神经网络是深度学习中的重要架构,在图像处理任务中取得了显著的成功。CNN能够自动从数据中学习特征,适应不同的图像变化和噪声。
-
GPU计算能力: 深度学习训练需要大量的计算资源,特别是图形处理单元(GPU)的广泛应用加速了深度学习模型的训练过程,使得研究人员能够更快地实验和迭代模型。
-
深度模型的可扩展性: 深度学习模型在图像识别领域取得了突破,这种成功激发了研究人员将这些技术应用于车牌识别。模型的深度结构可以逐层提取更高级别的特征,从而提高识别性能。
-
迁移学习和预训练模型: 预训练的深度学习模型,如在大规模图像数据上预训练的ImageNet模型,可以作为车牌识别任务的初始模型,通过微调进行适应。这种迁移学习减少了在小型数据集上训练深度模型所需的时间和计算资源。
-
端到端学习: 深度学习可以实现端到端的训练,从原始图像数据直接学习识别任务,而无需手动设计特征提取步骤。这简化了识别流程并提高了系统的整体效率。
一、效果演示
本文构建的AI智能车牌识别系统支持图像、视频以及摄像头三种图像输入。
1.0 项目获取
1.1 图像识别
1.2 视频识别
二、技术原理
2.1 整体流程
深度学习车牌定位技术的目标是从输入图像中准确地定位车牌的位置,通常是通过预测车牌的边界框或四个关键点的位置来实现。以下是一种常见的深度学习车牌定位技术原理,用于获取车牌的四个点位置:
-
数据准备: 首先,需要准备一个包含车牌位置信息的训练数据集。这些数据集应该包括车牌图像和对应的标注,可以是车牌的边界框或者四个关键点的位置。标注数据可以通过手动标注或者自动化方法获得,本文采用中科大的CCPD开源数据集。
-
网络架构: 选择一个适合车牌定位任务的深度学习网络架构。一种常见的选择是基于卷积神经网络(CNN)的架构,例如Faster R-CNN、YOLO(You Only Look Once)或SSD(Single Shot MultiBox Detector)。这些网络可以同时预测边界框的位置和类别,适用于目标检测任务。
-
训练: 使用准备好的训练数据集对所选网络架构进行训练。训练过程涉及将输入图像传递给网络,然后通过反向传播优化网络的权重,使其能够准确地预测车牌位置。训练数据中的每个样本都包括输入图像和相应的车牌位置标注。
-
预测: 在训练完成后,将训练得到的网络应用于新的图像。通过将图像输入网络,网络将输出车牌位置的预测结果,这通常是一个边界框或四个关键点的坐标。
-
后处理: 根据网络输出的预测结果,可以使用一些后处理技术来提高定位的准确性。例如,可以使用非极大值抑制(NMS)来抑制重叠的边界框,只保留最有可能的车牌位置。
-
评估和调优: 对预测结果进行评估,可以使用评价指标如IoU(Intersection over Union)来衡量预测框与真实标注框的重叠程度。根据评估结果,可以对网络架构、训练参数等进行调优,以提高定位的准确性和稳定性。
2.2 CCPD数据集介绍
CCPD是一个大型的、多样化的、经过仔细标注的中国城市车牌开源数据集。CCPD数据集主要分为CCPD2019数据集和CCPD2020(CCPD-Green)数据集。CCPD2019数据集车牌类型仅有普通车牌(蓝色车牌),CCPD2020数据集车牌类型仅有新能源车牌(绿色车牌)。
在CCPD数据集中,每张图片仅包含一张车牌,车牌的车牌省份主要为皖。CCPD中的每幅图像都包含大量的标注信息,但是CCPD数据集没有专门的标注文件,每张图像的文件名就是该图像对应的数据标注。
标注最困难的部分是注释四个顶点的位置。为了完成这项任务,数据发布者首先在10k图像上手动标记四个顶点的位置。然后设计了一个基于深度学习的检测模型,在对该网络进行良好训练后,对每幅图像的四个顶点位置进行自动标注。最后,数据发布者雇用了7名兼职工人在两周内纠正这些标注。CCPD提供了超过250k个独特的车牌图像和详细的注释。每张图像的分辨率为720(宽度)× 1160(高)× 3(通道)。实际上,这种分辨率足以保证每张图像中的车牌清晰可辨,但是该数据有些图片标注可能不准。不过总的来说CCPD数据集非常推荐研究车牌识别算法的人员学习使用。
CCPD2019数据集主要采集于合肥市停车场,采集时间为上午7:30到晚上10:00,停车场采集人员手持Android POS机对停车场的车辆拍照进行数据采集。所拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、雨天、雪天等。CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注。主要介绍如下:
类别 | 描述 | 图像数量 |
---|---|---|
CCPD-Base | 通用车牌图片 | 200k |
CCPD-FN | 车牌离摄像头拍摄位置相对较近或较远 | 20k |
CCPD-DB | 车牌区域亮度较亮、较暗或者不均匀 | 20k |
CCPD-Rotate | 车牌水平倾斜20到50度,竖直倾斜-10到10度 | 10k |
CCPD-Tilt | 车牌水平倾斜15到45度,竖直倾斜15到45度 | 10k |
CCPD-Weather | 车牌在雨雪雾天气拍摄得到 | 10k |
CCPD-Challenge | 在车牌检测识别任务中较有挑战性的图片 | 10k |
CCPD-Blur | 由于摄像机镜头抖动导致的模糊车牌图片 | 5k |
CCPD-NP | c没有安装车牌的新车图片 | 5k |
CCPD图像样例如下
2.3 车牌定位
def predict(self, img):
img0 = copy.deepcopy(img)
# 检测前处理
img, r, left, top = self.detect_pre_precessing(img)
y_onnx = self.session_det.run([self.session_det.get_outputs()[0].name],
{self.session_det.get_inputs()[0].name: img})[0]
# 检测后处理
outputs = self.post_precessing(y_onnx, r, left, top)
result_list = self.rec_plate(outputs, img0)
return result_list
2.4 车牌矫正
车牌矫正技术是指对于倾斜、变形或者在图像中有不同角度的车牌进行校正,使其在图像中呈现出水平且形状规整的状态。这
种矫正有助于提高车牌识别系统的准确性,使后续的识别算法能够更好地处理车牌图像。以下是一种常见的车牌矫正技术原理:
-
角度估计: 首先,需要对图像中的车牌进行角度估计,确定车牌相对于水平方向的倾斜角度。这可以通过计算车牌边界框的角度、车牌区域内文字的倾斜情况,或者其他特定的角度检测方法来实现。
-
透视变换: 一旦估计出角度,就可以应用透视变换(也称为仿射变换)来矫正车牌。透视变换是一种图像处理技术,可以将图像中的物体从一个视角投影到另一个视角,从而使其呈现出不同的形状和角度。
在车牌矫正中,透视变换可以通过以下步骤实现:
- 找到车牌的四个角点:可以使用边缘检测、轮廓检测或者角点检测算法来找到车牌的四个角点。
- 定义目标形状:确定一个目标矩形,表示矫正后的车牌应该具有的形状和大小。
- 计算透视变换矩阵:使用车牌的四个角点和目标矩形的四个对应点来计算透视变换矩阵。
- 应用透视变换:将透视变换矩阵应用到原始图像上,使车牌区域变形为目标矩形的形状。
# 透视变换得到矫正后的图像,方便识别
def four_point_transform(self, image, pts):
rect = self.order_points(pts)
(tl, tr, br, bl) = rect
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max(int(widthA), int(widthB))
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max(int(heightA), int(heightB))
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype="float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
# return the warped image
return warped
觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…
2.5 车牌识别
2.5.1 CRNN概述
CRNN是一种深度学习算法,用于文字识别任务,其能够同时处理图像的空间特征和序列信息,使得文字识别变得更加高效和准确,CRNN整体流程如下图所示,CRNN算法的原理如下:
首先,特征提取,输入的文字图像经过卷积层的特征提取。
序列建模(Recurrent Sequence Modeling):提取的特征被输入到循环神经网络(RNN)中进行序列建模。
序列分类(Sequence Classification):在CRNN的最后一步,通过全连接层将RNN输出的特征映射到文本的概率分布。
CRNN算法的优点在于它能够同时捕捉到图像的局部特征和序列的上下文信息。卷积层能够提取图像的低级特征,如边缘、纹
理等,而循环神经网络则能够对特征序列进行建模,捕捉到文字的语义和上下文信息。
2.5.2 CRNN网络架构实现
CRNN整体处理逻辑流程如下图所示
# 定义CRNN模型
class CRNN(nn.Layer):
def __init__(self, num_classes):
super(CRNN, self).__init__()
self.cnn = nn.Sequential(
nn.Conv2D(1, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(kernel_size=2, stride=2),
nn.Conv2D(64, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(kernel_size=2, stride=2),
nn.Conv2D(128, 256, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2D(256),
nn.ReLU(),
nn.Conv2D(256, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
nn.Conv2D(256, 512, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2D(512),
nn.ReLU(),
nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
nn.Conv2D(512, 512, kernel_size=2, stride=1),
nn.ReLU()
)
2.5.3 CNN结构
在CRNN框架中,CNN(Convolutional Neural Network)用于文字图像的特征提取。CNN通过卷积操作对输入的文字图像进行
滤波和特征提取,以捕捉图像中的局部信息和纹理特征,CRNN框架中CNN整体流程如下图所示。
通过CNN的特征提取,CRNN能够从原始的文字图像中学习到具有语义和区分能力的特征表示,为后续的序列建模和文字识别
提供有用的输入。在CRNN框架中,CNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示输入图像中的文字特征。
2.5.4 RNN结构
在CRNN框架中,RNN(Recurrent Neural Network)用于对CNN提取的特征进行序列建模。RNN能够捕捉到序列数据中的上
下文信息,并通过时间步长的迭代来处理不定长度的输入序列,CRNN框架中RNN整体流程如下图所示。
以下是CRNN框架中RNN实现的基本原理:
特征序列:在CRNN中,CNN提取的特征图被转换成一个特征序列,以便RNN能够逐步处理序列数据。
RNN单元:RNN单元是RNN的基本组成部分,它通过一个循环结构来处理序列数据。
隐藏状态传递:RNN的隐藏状态在每个时间步之间传递。隐藏状态包含了序列数据的上下文信息,能够记忆之前时间步的信息,并影响后续时间步的计算。
循环迭代:CRNN中的RNN单元会根据序列的长度进行多次循环迭代。
序列特征建模:通过RNN的循环迭代,将序列数据中的上下文信息进行建模。
在CRNN框架中,RNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示序列数据中的文字特征。
环境配置安装教程与资源说明
参考文献
[1] 基于挤压激励的轻量化注意力机制模块. 吕振虎;许新征;张芳艳.计算机应用,2022
[2] 基于深度学习的模糊车牌字符识别算法. 张彩珍;李颖;康斌龙;常元.激光与光电子学进展,2021
[3] 基于改进Faster R-CNN的核桃识别和定位. 樊湘鹏;许燕;周建平;刘新德;汤嘉盛.燕山大学学报,2021
[4] 自然场景下变形车牌检测模型DLPD-Net. 余烨;付源梓;陈维笑;刘海涛.中国图象图形学报,2021
[5] 基于深度学习技术的停车场收费管理系统设计与实现. 张立立;张振坤;刘明钊;沙毅.电子器件,2021
[6] 基于灰狼优化算法的车牌字符识别研究. 陈科全;吴耀光;陈一铭;穆协乐;张铁异.物联网技术,2021
[7] 车牌识别系统算法综述. 张松兰.电子技术与软件工程,2021
[8] 基于BP神经网络的智能车牌识别系统. 顾秀秀;朱明亮;吴琼;史洪玮.电脑知识与技术,2021
[9] 基于CNN的车牌识别精定位算法研究. 陈冬英;曾淦雄.福建江夏学院学报,2020
[10] 复杂场景下基于改进YOLOv3的车牌定位检测算法. 马巧梅;王明俊;梁昊然.计算机工程与应用,2021
[11] 复杂场景下的车牌识别算法研究. 王明俊.中北大学,2021
[12] 基于CNN卷积神经网络的车牌识别研究. 彭鹏.山东大学,2020
[13] 移动终端下基于联合学习的车牌识别系统. 郝欣宇.大连理工大学,2020
[14] 基于深度学习的车牌检测识别研究. 王潇凡.南京邮电大学,2019
[15] 基于深度学习的车牌识别的研究与应用. 刘珊珊.广东工业大学,2019
[16] 基于深度学习的车牌识别技术的研究与应用. 赵英彬.东华大学,2019
[17] 车载视频流车牌识别技术研究. 山显响.长春理工大学,2018