赞
踩
目 录
车牌自动生成器软件设计与实现
随着我国智能交通系统的日益成熟,车牌识别技术已融入日常生活且以超乎寻常的速度推动着社会经济的发展。车牌识别系统的广泛应用促使传统的车辆管理方式被智能设备取代,实现了车辆在无人看守的状态下自由通行,不仅提高了效率还对车辆实现了精准监控。伴随着新能源汽车和深度学习算法的来临,车牌识别研究需要更加全面多样的大规模车牌数据集来提高模型的准确性。但我国公开的车牌数据集极少,往往是通过人工拍摄或调取监控摄像头,而该方法耗时耗力且收集的图片数量少。因此,人工合成车牌图片对车牌数据集的扩充起着至关重要的作用。
本设计基于Python语言设计并实现了一个自动生成不同场景和不同规格的车牌图片的软件。车牌数据集主要包括两大部分:车牌图片以及对应的信息标注文件。首先,通过图像处理技术生成车牌图片,车牌的字符和外观规格均符合我国车牌标准且分布均衡。其次,采用OpenCV库对车牌图片进行几何变换、模糊和加入噪声等处理。再次,特殊场景的车牌数据是使用图像的加法操作以及IMGAUG库,将运动模糊和云雾雨雪等特征添加到车牌图片中。最后,设计了两种信息标注方式以支持不同的车牌识别算法。
最终的实验结果表明,本设计生成的车牌数据具有多样性、真实性等优点,能在一定程度上促进车牌识别研究的发展。
关键词:车牌自动生成器;车牌数据集;图像处理;目标场景
Automatic License Plate Generator Software Design and Implementation
With the further maturity of China's intelligent transportation systems, license plate recognition technology has crept into our daily life, boosting socio-economic development rapidly. Because of the widespread application of license plate recognition systems, traditional vehicle management methods have been replaced by smart devices. Thanks to this change, people are capable of driving the car freely without any watchman, which not only improves efficiency but also achieves accurate monitoring of vehicles. With the advent of new energy vehicles and deep learning algorithms, license plate recognition research requires a more comprehensive and diverse large-scale license plate data set to improve the accuracy of the model. However, there are only a few public license plate datasets in China. To collect pictures, manual photography or access to surveillance cameras is the most popular way, which is time-consuming and labor-intensive with a small number of images. Therefore, synthetic license plate images play a crucial role in expanding the license plate data set.
This design is based on the Python language to design and implement software that automatically generates license plate images for different scenarios and specifications. The license plate data set consists of two main sections: the license plate images and the equivalent number of information annotation files. Firstly, the license plate images, whose characters and appearance are compliant with Chinese license plate standards and are well distributed, are generated by image processing techniques. Secondly, the OpenCV library is used to geometrically transform, blur, and add noise to the plate images. Next, special scenes of license plate data are derived from the plate images using addition operations and the IMGAUG library such as motion blur, clouds, rain, and snow. Finally, there are two kinds of information annotation methods that are designed to support different license plate recognition algorithms.
Experimental results demonstrate that the license plate data, which is generated by this design, has the merits of versatility and authenticity. To some extent, it will be able to contribute to the development of license plate recognition research.
Keywords: Automatic license plate generator; license plate data set; image processing; target scenes
伴随着信息科技的蓬勃发展,数字化智慧城市的兴起让民众的生活更加快捷和智能。交通的便捷缩短了地理的距离,但也使车辆的数量急剧增加。如今不论是城市街道还是乡间小道,我们都能发现汽车的身影。早期由欧洲国家推出的智能交通系统(Intelligent Transportation Systems, ITS),进一步规范了车辆的正常行驶和合理停放,在道路交通管控、自然环境保护等领域的实际应用中达到了良好效果[1]。随着智能交通系统浸润到各个生活角落,研究者们开始在车牌识别领域探索能实现更高准确率的车牌识别算法。目前最流行的车牌识别算法应用了深度学习领域的知识,通常需要事先筹备大规模的车牌数据集作为后续模型训练的基础[2]。
现有的车牌数据集一般都是针对特定的单一场景,比如街道边的停车位、停车场和高速道路等。考虑到保护公民隐私,我国公开的车牌数据集极少,在进行车牌识别实验前都要自行扩充车牌数据集。收集车牌图片的最直接方法是手动抓拍车辆或在高速监控系统、停车场系统和交通系统里提取车辆图片。通过这种方法收集的图片虽然具有真实性,但会存在成本高、车牌字符分布不均衡、图片模糊等问题[3]。再者,车牌照片的收集工作和后期的信息标注工作极其耗时耗力。因此,为了减少对精力和时间的损耗,最佳方法是设计并实现一个车牌自动生成软件。在遵循我国车牌标准的前提下,运用图像处理技术来生成较为贴近现实的车牌图片,同时自动生成同等数量的包含车牌相关信息的标注文件。
在进行车牌数据集的调研时,主要发现了以下三个问题:第一,关于车牌合成的研究还很少。相比于车牌生成领域,研究者们更倾向于挖掘车牌识别领域。第二,国外车牌数据集不适用于国内研究,且国内的公开车牌数据集极少。为了制作车牌数据集,人工采集图片的方式居多。相比合成车牌图片,人工拍摄的方式对劳动力和时间的要求更高。尤其在特殊场景下,如雨天或雪天,手动拍摄车牌是一个很大的挑战。第三,我国车牌规格是根据地域和车型进行划分,车牌种类多样又复杂。在人工收集的数据集中,各省份的车牌在数量上达不到均衡。因此,在大规模数据集的准备过程中,车牌生成技术(License Plate Generation Technology, LPGT)扮演着重要的角色。车牌生成技术旨在生成各种场景下的不同规格的车牌图片,产生车牌图片的过程伴随着相应的信息标注文件的生成。若能实现强大的车牌生成软件,那么车牌识别系统在智能科技的道路上将会走得越来越远。
本文旨在研究车牌生成技术,设计一个车牌自动生成器,采用Python语言实现车牌图片批量生成的功能,以减少在图片拍摄和信息标注上消耗的体力和时间,并且有效地避免了隐私问题。该技术在足不出户的基础上就能够生成各种场景下的车牌图片供研究所需,发挥了其在车牌识别领域的应用价值。
自车牌识别技术兴起后,各地的车辆管理变得井然有序。车牌识别离不开大量的车牌数据,特别是基于深度学习的车牌识别模型。以强大的车牌数据集作为支撑,可以使训练后的模型更加准确。另外,新能源车辆的大量出现,使得传统的车牌数据集已经远远不能满足车牌识别研究的需求。
为了弥补车牌数据的不足,各种车牌数据集接连涌现,并顺利应用到各项研究中。例如:在国内,2018年,中科大团队在网络上公开分享了中国停车场车牌数据集(Chinese City Parking Dataset,CCPD)[4]。目前车牌图片已扩增到30万张左右,其中也涉及多种复杂的自然场景,包括阴雨天、雪天和雾天等。另一方面,名为Open Data V3.1的车牌数据库,发布于OpenITS公共服务平台[5]。结合车牌图片的颜色特征和几何特性,该数据库被划分为不同的测试子库,并且在原先的基础上增添了少许的新能源车牌。姜策等人利用该数据集训练的车牌检测模型达到了85%以上的准确率[6]。在国外,Gilles Velleneuve Trindade Silvano等人使用C++语言和OpenCV库开发了一个应用于南方共同市场的车牌数据集[7]。该数据集包含3829张车牌图片,生成的车牌图片分别有不同程度的遮挡效果。L. Y. Chan等人设计了欧盟最大的公开车牌数据集之一TDLP[8]。其中既有车辆图像也有附有标签的车牌图像。车牌图片均是在不同的光照和天气条件下通过不同角度的拍摄设备采集的。用该数据集训练后的车牌检测模型在检测不同场景的车牌时能达到87%以上的准确率。相比于TDLP数据集,UFPR数据集[9]和SSIG数据集[10]是以拍摄简单场景下的未倾斜车牌为主。两个数据集的车牌图片均是在晴朗时拍摄的,所以相比于极端情况的车牌,车牌检测器在检测晴天条件下的未倾斜车牌时,能够达到更高的准确率。
综合现有的真实车牌数据集的研究现状,发现存在以下问题:
一是省份分布不均衡。受地理位置的限制,CCPD的图片主要来源于安徽省合肥市内街道和停车场里的车辆,所以“皖A”开头的车牌占比较高,导致图片数量在省份上分布不均。
二是缺少复杂场景车牌和新能源车牌。比如,Open Data V3.1的新能源车牌仅有101张,并且没有收集特殊场景下的车牌。
三是费时费力。车牌拍摄工作和后期的信息标注工作对于人力物力都有极高的要求。
针对上述问题,本文所设计实现的车牌自动生成器不仅可以实现车牌数量在省份上分布均衡,还能批量生成新能源车牌图片和特殊场景下的车牌图片,并且在车牌生成过程中自动完成信息标注工作,省时省力,具有一定的应用价值。
本文旨在按照我国对机动车号牌规定的分类、规格、颜色、字符类型和命名规则,应用OpenCV计算机视觉库的图像处理技术来设计一个车牌自动生成器。该生成器不仅能够批量生成车牌图片,还省去了车牌信息的人工标注环节。本设计通过不断地调试和修改,提高了数据的真实性和多样性。本文主要工作如下:
本论文着重介绍了车牌自动生成器的总体设计、实现流程和最终的实验运行结果。全文共分六章。文章结构的详细安排如下:
第一章:绪论。首先,本章阐述了研究背景和意义,结合我国数字智慧城市在交通领域的发展背景,点出了车牌数据集在车牌识别中的关键作用,以及存在的问题和解决措施。其次,综述了车牌生成算法和车牌数据集的研究现状。然后提出了该课题的重点研究内容。最后,对论文的总体组织架构做出了概述。
第二章:车牌生成的相关技术。此章先略述了车牌的生成流程,再介绍了与车牌生成技术相关的基础理论,主要包括车牌相关知识和图像处理技术。在车牌相关知识部分,描述了中国车牌的特点,并点明了不同车牌之间的区别;图像处理技术部分则是介绍了基础的RGB模型、HSV颜色空间模型和图像的位操作。
第三章:系统总体设计。本章主要阐述了车牌自动生成器的软件设计方案。首先,总结了整个车牌生成系统的设计思路。其次,将总体设计思路分为普通车牌生成、数据增强、特殊场景的车牌生成和信息标注文件四个部分,依次进行了详细设计。
第四章:系统总体实现。本章主要是以总体设计思路为基础,对车牌生成过程中的每一个功能进行更为具体的实现。此外,在研究过程中遇到的部分问题,此章节进行了解决措施的特别说明。
第五章:系统测试。该章节内容主要介绍了测试的环境、方法、过程和结果,着重展示了数据增强效果下(基本的几何变换、透射变换、高斯噪声、环境噪声)和添加了环境特征(云、雨、雪、雾、污渍和运动模糊)的车牌图片。
最后:结论。本章回顾了车牌自动生成器的设计与实现过程,指出了该生成器尚存在的不足,并展望了车牌生成技术的发展。
本设计的车牌自动生成器是基于Python的车牌自动生成算法实现的,借助OpenCV库对车牌图片执行透射变换、模糊处理以及高斯噪声的叠加等操作,从而自动生成逼真车牌图片。并在生成普通车牌的基础上,应用IMGAUG库对图片添加极端环境的特征,模拟特殊场景的车牌图片。生成车牌图片的流程如图2.1所示。
图2.1 车牌生成流程图
众所周知,车牌号码是车辆的唯一标识符,即车牌是车辆的“身份证”。车牌识别系统通过一张车牌就能够调查出与该车辆相关联的诸多信息。因为不同国家的车牌有着不同的车牌样式和标准,所以国外的车牌数据集不适用于国内的车牌识别系统。研究者们需要另外创造一个符合国内车牌标准的数据集[12]。我国车牌的划分依据主要有种类、尺寸和颜色。车牌号码是由数字字母和汉字随机组成。字符的命名规则是由地域、机关代号等共同决定的。
根据中华人民共和国公安部2018年发布的机动车号牌标准,我国车牌在外廓尺寸方面划分为三类[13]。第一类是最为常见的单行车牌,长、宽分别为440mm、140mm,用在小汽车、使领馆车、港澳车、警车、教练车,以及大型汽车;第二类是双行车牌,长、宽分别为440mm、220mm,主要见于大型汽车后车牌和挂车车牌;第三类是专属于新能源汽车的单行车牌,长、宽分别为480mm、140mm。
不同车牌的具体规格如下图2.2所示:
在字符的命名规则方面,不同用途的车牌有着不同的字符组合方式。比如,港澳车牌、使领馆车牌、警车车牌和教练车车牌会带着标志性的“港、澳、使、领、警、学”字符;特制的新能源车牌在位数上比常规车牌多一位。常规车牌由7位字符组成,第一位是31个地域的汉字简称,第二位是代表发牌机关代号的大写英文字母,后五位序号由大写字母和数字的随机混合组成。由于字母“O”和“I”和数字“0”和“1”在外观上极其相似,所以车牌号码中不存在英文字母“O”和“I”。小汽车的车牌模板如下图2.3所示:
图2.3 小型汽车车牌标准,图片来源于GA36-2018[13]
新能源车牌的字符位数是8位,前两位的命名规则和常规车牌一致,后6位序号中的英文字母则是根据汽车是否为纯电动进行分类,纯电动汽车车牌采纳的英文字符是“DABCE”,非纯电动汽车车牌采纳的英文字符是“FGHJK”。后6位序号中也不能存在英文字母“O”和“I”。新能源汽车的车牌模板如下图2.4所示:
图2.4 小型新能源汽车车牌标准,图片来源于GA36-2018[13]
车牌生成过程中经常需要借助OpenCV库对图片进行处理,本节主要介绍设计中应用到的图像处理的基础理论知识。
RGB模型又称为加色法混色模型,它是用红绿蓝三种基本颜色的不同混合比来表示不同颜色[14]。RGB模型相当于立体直角坐标系中的正方体,对角线是由亮度等量的三种基本颜色互相叠加而形成的灰色,亦称为灰色线。原点代表黑色,对角线的另一个顶点代表白色。立体模型见下图2.5。
因为亮度等于色彩亮度的综合,所以随着三种基本颜色的混合值越大,亮度也升高。依据画图软件中各颜色的RGB值,可将图片的某一种颜色转变为任意其他颜色,如图2.6所示。
HSV颜色模型是根据颜色的三种特性而组成的一个形似六棱锥的颜色空间,这三种特性分别是色调、饱和度和明度。其立体模型如图2.7所示:
色调H的差异体现在角度的大小,角度值的范围为0°~360°,从代表红色的0°沿逆时针方向旋转可以得到不同的颜色。最为常见的颜色所对应的角度分别为:黄色60°,绿色120°,青色180°,蓝色240°,品红色300°[16]。在车牌生成的过程中,主要通过改变H通道的值的大小来调节车牌图片的整体色调。
饱和度S是用于衡量颜色与光谱色的接近程度。把颜色当成光谱色与白色的混合体,通过调节光谱色在该种颜色中的权重值就能获得不同饱和度的颜色效果。当光谱色的权重值增加时,饱和度提高,颜色愈发靠近光谱色,从而看到的颜色又浓又艳。当光谱色的权重值达到最大值1时,饱和度最高。
明度V用来表示颜色的明亮程度,可用0到1之间的任意小数表示,即从暗到明[17]。在设计中,通过改变V通道的值,使图片的亮度发生变化。
RGB模型和HSV模型的区别在于前者的颜色调节在硬件处理中更容易被理解和实现;后者偏重于人眼看到的颜色效果,混合过程更加复杂。所以在图片处理过程中,使用OpenCV库的cv2.cvtColor转换函数实现RGB模型与HSV模型的互换。在进行转换时,需要注意各通道的取值范围。对于RGB模型,三色的取值范围均为0~255。对于HSV模型,因为角度H的范围超过了uint8数据类型的范围,所以OpenCV将其缩放至原来大小的二分之一进行存储。饱和度S和明度V则是将原始的0~1范围倍增到0~255。具体转换公式如下:
(2.2)
(2.3)
OpenCV的位操作是指将输入图片的每点的像素值转换为二进制数进行位操作。本设计主要运用图像位操作将环境背景图覆盖到车牌图片的黑色背景区域。主要有四类位操作函数:
整个设计流程包含四部分:生成普通车牌图片、数据增强、生成特殊场景的车牌图片、生成信息标注文件。
在正式合成车牌图片前,进行了车牌字符图片的收集。中国车牌字符是公安部为现行车牌而设计的一种特殊字体,目前还无法从计算机自带的字体中选出相吻合的字体。本设计中的部分字符图片取自2007年公安部发布的《机动车号牌标准》的附录样式。还有一部分新能源车牌的字符图片截取自真实车牌图片,在保持字符颜色不变的基础上,将背景色转换为白色。字符提取示意图如图3.1所示。
由于不同车牌的字体不同,每个字符图片都是以车牌的尺寸和类型命名的,以供后续的实验使用。各类字符图片在文件夹中的保存格式见图3.2。
在成功采集到所有的字符图片后,进行了车牌合成实验。首先,普通车牌图片是按照我国的标准车牌模板,通过图像处理技术,在车牌背景图上的固定位置插入符合我国车牌号码命名规则的字符图片,如图3.3所示。
其次,在普通车牌图片的基础上,通过数据增强技术,对图片进行透射变换、模糊处理以及加入高斯噪声和环境噪声,模拟真实拍摄的车牌效果,如图3.4所示。
再次,模拟特殊场景下的车牌图片,将不同场景的特征添加到车牌图片中,如阴天、雨雪天、多雾和运动模糊等。本设计采用了两种方法实现上述功能,一种是借助IMGAUG库直接对车牌图片进行处理,简单又高效。另一种是通过cv2.addWeighted函数将车牌图片和环境效果图按不同权重比进行叠加:
cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])→dst
使用加法操作合成车牌的示意图见图3.5。
图3.5 使用加法操作合成雨天车牌示意图
最后,自动生成与车牌图片数量相等的信息标注文件,主要包括车牌的尺寸、保存路径、种类和目标框的中心位置等基本信息[18]。该部分功能的实现能减少后期人工标注需要耗费的体力和时间。
接下来,本文将详细介绍上述四个部分的功能。
为了生成与我国车牌模板一致的车牌图片,本方案使用图像处理技术对车牌图片的形状和颜色进行了分析处理,具体操作步骤如下:
普通车牌生成的流程见图3.6。
在现实场景中,受拍摄设备的相对位置和天气等因素的影响,车牌图片会在形状、颜色和清晰度等方面发生变化。数据增强旨在对普通车牌图片进行基本的几何变换、模糊处理和噪声的添加,达到模拟真实车牌并扩充数据集的作用[19]。各模块的具体实现步骤如下:
为了让车牌识别系统也能准确识别极端环境下的车牌,车牌数据集中就必须包含有特殊场景下的车牌图片。本设计的特殊场景下的车牌图片是通过cv2.addWeighted函数和IMGAUG库合成的。以雨天车牌图片为例,通过加法操作生成雨天车牌图片的流程见图3.10。
应用IMGAUG库生成雨天车牌图片的流程见图3.11。
本设计实现了两种信息标注文件的自动生成功能,用来存储车牌来源、尺寸、号码和目标框的位置等相关信息。一种是生成XML格式的标注文件,另一种是生成TXT格式的标注文件,在TXT文档中,一行代表一张图片的标注信息。
其中,XML格式的标注文件的具体实现内容如下:
TXT格式的标注文件的具体实现内容如下:
此外,XML文件里的坐标值与TXT文件里的归一化值可以进行相互的转换。由公式(3.1)和公式(3.2)可知,目标框的x和y坐标的最值可求出中心坐标x和y。
(3.1)
(3.2)
由公式(3.3)和公式(3.4)可知,目标框的x和y坐标的最值可求出相对宽度w和相对高度h。
(3.3)
(3.4)
本章节主要是介绍车牌生成系统的实现。本系统是基于Python语言实现的,Python具有强大的库功能,是进行图像处理的较为流行方式。本设计的普通车牌生成部分和数据增强部分是通过计算机视觉库OpenCV来实现相应的功能;特殊场景下的车牌生成部分则是应用了OpenCV的图像加法操作和IMGAUG库。
由于我国的车牌规格多样又复杂,所以本设计选择了十三种最为常见的车牌作为实验对象。首先,根据我国车牌的模板和命名规则确定字符的尺寸、位置和颜色。然后,在背景图片上,将字符位置处的颜色进行变换。该部分的具体实现流程如下图4.1所示。
该部分的实现步骤如下。
字符图片处理 | |
1 | 读取字符图片; |
2 | for i←0 to width-1 do // 遍历所有宽度的点 |
3 | for j←0 to heigth-1 do // 遍历所有高度的点 |
4 | 获取各个像素点的RGB值; |
5 | if (R,G,B) > 背景色的(R,G,B值) then |
6 | 修改该点的R、G、B值为白色(255,255,255); |
7 | 保存修改后的字符图片; |
font_img = cv2.imdecode(np.fromfile(font_file, dtype = np.uint8), cv2.IMREAD_GRAYSCALE) |
规范各类字符的尺寸 | |
1 | font_imgs = {} |
2 | if '140' in font_file: // 单行车牌 |
3 | font_img = cv2.resize(font_img, (45, 90)) |
4 | elif '220' in font_file: // 双行车牌 |
5 | font_img = cv2.resize(font_img, (65, 110)) |
6 | elif font_file.split('_')[-1].split('.')[0] in letters + digits: // 中文字符 |
7 | font_img = cv2.resize(font_img, (43, 90)) |
8 | font_imgs[os.path.basename(font_file).split('.')[0]] = font_img |
固定字符位置函数 | ||
Input:车牌号码长度length,间隔符位置split_loc,车牌高度height | ||
Output:各个字符在背景图上的位置 | ||
1 | 创建一个length行4列的全零矩阵location_xy,类型为32位整型,用来保存字符图片在底图上的左上角和右下角的(x,y)坐标; | |
2 | if height = 140 then | |
3 | location_xy[:, 1] ← 25; // 当前字符左上角y坐标 | |
4 | location_xy[:, 3] ← 115; // 当前字符右下角y坐标 | |
5 | if length = 7 then | |
6 | split_step ← 34; | |
7 | font_step ← 12; | |
8 | else | |
9 | split_step ← 49; // 间隔符宽度,49是新能源 | |
10 | font_step ← 9; // 字符间距,9是新能源 | |
11 | chinese_font_width ← 45; // 中文字符宽度 | |
12 | for i←0 to length-1 do | |
13 | if i = 0 then | |
14 | location_xy[i, 0] ← 15; | |
15 | else if i = split_loc then | |
16 | location_xy[i, 0] ← location_xy[i-1, 2] + split_step; // 当前字符左上角x坐标 | |
17 | else | |
18 | location_xy[i, 0] ← location_xy[i-1, 2] + font_step; // 当前字符右下角x坐标 | |
else | ||
20 | location_xy[0, :] ← [110, 15, 190, 75]; // 第一个字符左上、右下坐标 | |
21 | location_xy[1, :] ← [250, 15, 330, 75]; // 第二个字符左上、右下坐标 | |
22 | font_width ← 65; | |
23 | font_step ← 15; | |
24 | for i←2 to length-1 do // 第二层 | |
25 | location_xy[i, 1] ← 90; | |
26 | location_xy[i, 3] ← 200; | |
27 | if i = 2 then | |
28 | location_xy[i, 0] ← 27.5; | |
29 | else | |
30 | location_xy[i, 0] ← location_xy[i-1, 2] + font_step; | |
31 | location_xy[i, 2] ← location_xy[i, 0] + font_width; |
确定间隔符位置函数 | |
Input:车牌号码plate_numer,车牌高度height | |
Output:存储字符串的列表,字符串由长度length,间隔符位置split_loc,高度height组成 | |
1 | // 获取车牌号码长度 length ← len(plate_number); |
2 | if 车牌号码中有"警"字 then |
3 | split_loc ← 1; |
4 | else if 车牌号码中有"使"字 then |
5 | split_loc ← 3; |
6 | else if 车牌号码中有"领"字 then |
7 | split_loc ← 4; |
8 | else |
9 | split_loc ← 2; |
生成单层车牌号码函数 | |
Input:车牌号码长度length | |
Output:车牌号码 | |
1 | plate ← provinces; // 省份简称 |
2 | letter ← agency_code; // 机关代号 |
3 | plate ← plate + letter; |
4 | plate_number_sequence ← [one_letter, two_letters, full_digits]; // 后续序号的排列方式列表,即一个字母、两个字母、全数字 |
5 | plate ← random_select(plate_number_sequence)(plate, length); // 生成完整车牌号码,random_select函数:随机返回一个不超过列表长度的整数 |
确定不同车牌号码对应的背景图 | |
1 | bg_color = random_select(['yellow'] + ['blue']) |
2 | if len(plate_number) == 8: |
3 | if plate_number[7] in letters: |
4 | // 大型新能源 bg_color = random_select(['gree_trk'] + ['gree_trk_below']) |
5 | else: |
6 | bg_color = 'green_car' // 小型新能源 |
7 | if len(set(plate_number) & set(['港', '澳'])) > 0: |
8 | bg_color = 'black' |
9 | if '使' in plate_number: |
10 | bg_color = 'black_shi' |
11 | if '领' in plate_number: |
12 | bg_color = 'black_ling' |
13 | if '警' in plate_number: |
14 | bg_color = random_select(['white'] + ['white_below']) |
15 | if len(set(plate_number) & set(['学', '挂'])) > 0: |
16 | bg_color = 'yellow' |
1 | img = cv2.imread(os.path.join(back, ‘{}_{}.PNG’.format(bg_color, height))) |
2 | img = cv2.resize(back, (440 if len(plate_number) == 7 else 480, height)) |
底图上字符位置处的颜色变换函数 | |
Input:纯背景图img,字符图片font_img,字符坐标列表location_xy[],背景色标志,红色标志 | |
Output:车牌合成图 | |
1 | x1 ← location_xy[i, 0]; // 第i个字符的左上角x坐标 |
2 | y1 ← location_xy[i, 1]; // 第i个字符的左上角y坐标 |
3 | x2 ← location_xy[i, 2]; // 第i个字符的右下角x坐标 |
4 | y2 ← location_xy[i, 3]; // 第i个字符的右下角y坐标 |
5 | 调整字符图片尺寸为宽(x2-x1),高(y2-y1); |
6 | img_crop ← img[y1:y2, x1:x2, :]; // 区域复制:高,宽,通道数 |
7 | if 字符是红色 then |
8 | img_crop[font_img < 200, :] ← [0, 0, 255]; // 图片对应区域变成红色 |
9 | else if 背景色是蓝色或者黑色 then |
10 | img_crop[font_img < 200, :] ← [255, 255, 255]; // 图片对应区域变成白色 |
11 | else |
12 | img_crop[font_img < 200, :] ← [0, 0, 0]; // 图片对应区域变成黑色 |
在将合成的车牌图片写入文件夹时,cv2.imwrite会使图片文件名乱码,无法显示正确的中文字符,如图4.11所示。
因此,改成用cv2.imencode将带有中文标签的车牌图片写入文件夹。实现代码如图4.12所示。
filename = os.path.join(save_adr, '{}_{}.jpg'.format(plate_number, bg_color)) |
数据增强部分旨在对生成的普通车牌图片进行畸变、模糊和噪声处理。具体的实现流程图如图4.13所示。
该部分各模块实现的步骤如下:
第一种透射变换的效果是将原始的矩形图片转变为一个平行四边形图片,即宽度发生改变,高度不变。实现伪代码如图4.14所示。
透射变换1函数:矩形转变成平行四边形 | |
Input:车牌图片img,旋转角度angle,图片尺寸shape:高shape[0]和宽shape[1],最大旋转角度max_angle | |
Output:畸变的车牌图片 | |
1 | size ← ((shape[1]+shape[0]*最大旋转角度的余弦值), shape[0]); // 宽度,高度 |
2 | space ← abs(int(最大旋转角度的正弦值*shape[0])); // 距离Y轴距离 |
3 | pts1 ← np.float32([[0, 0], [0, shape[0]], [shape[1], 0], [shape[1], shape[0]]]); |
4 | if angle > 0 then |
5 | pts2 ← np.float32([[space, 0], [0, shape[0]], [size[0], 0], [size[0]-space, shape[0]]]); // 4×2矩阵 |
6 | else |
7 | pts2 ← np.float32([[0, 0], [space, shape[0]], [size[0]-space, 0], [size[0], shape[0]]]); |
8 | M ← cv2.getPerspectiveTransform(pts1, pts2); // 获得透射变换矩阵 |
9 | dst ← cv2.warpPerspective(img, M, size); // 完成透射变换 |
透射变换前后的图像对比如图4.15。
图4.15 图(a)为原始车牌,图(b)和图(c)为透射变换后的图像
第二种透射变换的效果是将原始的矩形图片转变为任意一个四边形图片,即宽度和高度均发生改变。实现伪代码如图4.16所示。
透射变换2函数:矩形转变成任意四边形 | |
Input:车牌图片img,图片尺寸shape:高shape[0]和宽shape[1],随机数n | |
Output:畸变的车牌图片 | |
1 | rows ← img.shape[0]; |
2 | cols ← img.shape[1]; |
3 | pts1 ← np.float32([[0, 0], [0, shape[0]], [shape[1], 0], [shape[1], shape[0]]]); |
4 | pts2 ← np.float32([[n, n], [n, shape[0]-n], [shape[1]-n, n],[shape[1]-n, shape[0]- n]]); |
5 | M ← cv2.getPerspectiveTransform(pts1, pts2); // 获得透射变换矩阵 |
6 | dst ← cv2.warpPerspective(img, M, (cols, rows)); // 完成透射变换 |
透射变换前后的图像对比如图4.17。
img = cv2.blur(img, (5, 5)) // 可接收的模糊程度ksize:(5,5),5*5的滑动窗口 |
img[:, :, 0] = AddGuassNoise(img[:, :, 0]) img[:, :, 1] = AddGuassNoise(img[:, :, 1]) img[:, :, 2] = AddGuassNoise(img[:, :, 2]) |
添加环境噪声的函数 | |
Input:车牌图片img,自然环境照片路径的列表env_set | |
Output:添加环境噪声的车牌图片img | |
1 | 获取不超过列表长度的任意整数值n; |
2 | env ← cv2.imread(env_set[n]); // 随机读取文件夹下的一张环境噪声图片 |
3 | env ← cv2.resize(env, (img.shape[1], img.shape[0])); // 改变环境噪声图片的大小,与车牌图片大小一致 |
4 | bak ← (img = 0); // 车牌图片的黑色部分 |
5 | 将车牌图片的黑色部分变成白色; |
6 | bg ← cv2.bitwise_and(bak, env); // 图片的非黑色部分和噪声进行"与"操作 |
7 | img ← cv2.bitwise_or(bg, img); // 与原始车牌图片的黑色部分进行"或"操作 |
图4.20 加入环境噪声
本设计采取了两种方法来模拟特殊场景下的车牌图片,第一种方法是先将车牌图片和环境图片的尺寸调整到一致大小,然后进行加法操作。以模拟雨天特征的车牌为例,实现伪代码如图4.21所示。
加法操作合成雨天车牌图片函数 | |
Input:车牌图片img,环境图片env | |
Output:雨天车牌图片 | |
1 | rows ← 取小于(环境图片的高度-小于高度的任意数值i)的任意值; |
2 | cols ← 取小于(环境图片的宽度-小于宽度的任意数值j)的任意值; |
3 | adder ← env[rows:rows+i, cols:cols+j]; // 截取环境图片中的部分区域 |
4 | 将截取后的环境图片尺寸调整为440×140; |
5 | 将车牌图片尺寸调整为440×140; |
6 | img ← cv2.addWeighted(img, 0.4, adder, 0.6, 0); // 加法操作 |
第二种方法是调用IMGAUG库,既可以模拟极端情况下的车牌图片,还可以调节图片的对比度、亮度和饱和度。实现代码见图4.22。
采用IMGAUG库合成特殊场景的车牌图片 |
iaa.imgcorruptlike.MotionBlur(severity=(1, 2)) // 运动模糊 iaa.Clouds() // 云雾 iaa.Fog() // 霜 iaa.imgcorruptlike.Frost(severity=3) // 结霜 iaa.Rain(drop_size=(0.10, 0.20), speed=(0.1, 0.3)) // 雨 iaa.imgcorruptlike.Fog(severity=1) // 多雾 iaa.imgcorruptlike.Snow(severity=2) // 大雪 iaa.Snowflakes(flake_size=(0.2, 0.7), speed=(0.01, 0.05)) // 雪点 iaa.imgcorruptlike.Spatter(severity=5) // 溅 123水滴、45泥 iaa.contrast.LinearContrast((0.5, 2.0), per_channel=0.5) iaa.imgcorruptlike.Brightness(severity=(1, 2)) // 亮度增加1~5 iaa.imgcorruptlike.Saturate(severity=(1, 3)) // 色彩饱和度1~5 |
本设计实现了两种信息标注文件的自动生成功能,一种是生成XML格式的标注文件,另一种是生成TXT格式的标注文件。
其中,XML格式的数据集标注文件的实现流程如下:
tree.write(os.path.join(xml_file, img_name + '_' + color + '.xml'), encoding='utf-8') |
生成TXT格式的数据集标注文件的步骤如下:
classes = ['blue', 'black_shi', 'black_ling', 'yellow', 'white', 'white_below', 'green_car', 'green_truck', 'green_truck_below'] |
cls = color cls_id = classes.index(cls) |
归一化处理函数 | |
Input:车牌图片尺寸size | |
Output:归一化坐标x、y,相对宽度,相对高度 | |
1 | width ← img.shape[1]; |
2 | height ← img.shape[0]; |
3 | x_center ← (xmax+xmin)/2; |
4 | y_center ← (ymax+ymin)/2; |
5 | x ← x_center / width; // 归一化中心坐标x |
6 | y ← y_center / height; // 归一化中心坐标y |
7 | w ← (xmax-xmin) / width; // 相对宽度 |
8 | h ← (ymax-ymin) / height; // 相对高度 |
图4.30 归一化处理
根据第四章实现的车牌生成算法,进行实验的测试运行和结果分析。实验环境分为硬件环境和软件环境,具体配置如下:
在实现车牌图片生成的过程中,采取了三种测试方法完成实验:
为了提高车牌自动生成器在车牌识别研究中的应用价值,整个程序在测试的过程中采用上述三种测试方法进行了不断的修改和完善:
以车牌号码是京AF0236的蓝色车牌为例。
步骤1、系统随机生成车牌号码后,从指定文件夹中读取车牌底图和字符图片。根据生成的车牌号码字符串,从字典里依次提取出对应的字符图片,并按照车牌标准模板,调整图片的尺寸大小,如图5.1所示。
步骤2、将车牌背景图的尺寸大小调整为标准模板的尺寸,并在车牌背景图的固定位置处截取与字符图片大小一致的区域。如图5.2所示。
步骤3、对应字符图片的黑色区域,在底图上进行颜色变换。如图5.3所示。
车牌的整体呈现效果图见图5.4。
步骤4、剩下的每个字符都重复上述操作,直至全部完成。车牌生成过程图见图5.5。
步骤5、生成车牌后,对图片进行命名并保存在指定的文件夹中。最终在文件夹中显示的车牌数据见图5.6。
步骤6、批量生成车牌图片。各类车牌生成效果图如图5.7所示。
在普通车牌图片的基础上,对该图片进行透射变换、模糊处理、以及高斯噪声和环境噪声的添加。以车牌号码是京AF0236的蓝色车牌为例。
透射变换后,车牌的形状转变成不同角度的平行四边形。如图5.8所示。
图5.8 图(a)和图(b)为不同角度的平行四边形的透射变换
真实场景下拍摄的倾斜车牌图片如图5.9所示。与合成的倾斜车牌图片相比,两者在外观上较为相似。
透射变换后,车牌的四个顶点位置发生随机变化。如图5.10所示。
真实场景下拍摄的透射变换车牌图片如图5.11所示。与合成的透射变换车牌图片相比,两者在外观上较为相似。
添加环境噪声的车牌图片如图5.12所示。
模糊处理后的车牌图片如图5.13所示。
添加高斯噪声的车牌图片如图5.14所示。
真实场景的车牌如图5.15所示,与图5.12、图5.13和图5.14相比,合成的车牌在颜色上与真实车牌不同。
批量生成车牌图片。数据增强后的各类车牌生成效果图如图5.16所示。
特殊场景下的车牌图片是在普通车牌图片的基础上,对该图片加入运动模糊、雨、雪、多云、雾、霜、污渍等特征。以车牌号码是京AF0236的蓝色车牌为例。
具有运动模糊特征的合成车牌如图5.17所示。
真实场景下拍摄的运动模糊车牌如图5.18所示。与图5.17相比,两者的运动模糊效果相似,但是真实车牌的颜色更浅。
具有多云特征的合成车牌如图5.19所示。
具有云雾特征的合成车牌如图5.20所示。
具有不同程度的下雨特征的合成车牌如图5.21所示。
图5.21 图(a)、图(b)、图(c)为不同程度的下雨效果图
在真实的雨天场景下,拍摄的车牌图片如图5.22所示。与图5.21相比,两者的下雨效果相似,但是真实车牌的颜色更浅。
具有不同程度的多雾特征的合成车牌如图5.23所示。
图5.23 图(a)、图(b)、图(c)、图(d)、图(e)为不同程度的多雾效果图
在真实的多雾场景下,拍摄的车牌图片如图5.24所示。与图5.23相比,两者的多雾效果较为相似,真实车牌的颜色更浅。
具有不同程度的下雪特征的合成车牌如图5.25所示。
图5.25 图(a)、图(b)、图(c)、图(d)、图(e)为不同程度的下雪效果图
在真实的雪天场景下,拍摄的车牌图片如图5.26所示。与图5.25相比,两者的下雪效果较为相似,真实车牌的颜色更浅。
具有不同程度的结霜特征的合成车牌如图5.27所示。
图5.27 图(a)、图(b)、图(c)、图(d)、图(e)为不同程度的结霜效果图
在真实的结霜场景下,拍摄的车牌图片如图5.28所示。与图5.27相比,两者的结霜效果较为相似,车牌的颜色存在细微差别。
具有不同程度的雪点特征的合成车牌如图5.29所示。
图5.29 图(a)、图(b)、图(c)为不同程度的雪点效果图
在真实的雪天场景下,拍摄的车牌图片如图5.30所示。与图5.29相比,两者的雪点效果较为相似,车牌的颜色存在细微差别。
沾有污渍的合成车牌如图5.31所示。
图5.31 图(a)、图(b)和图(c)是沾有雨滴的效果图,图(d)和图(e)是沾有泥土的效果图
在真实场景下,拍摄的沾有雨滴的车牌图片如图5.32所示。与图5.31相比,两者的雨滴效果较为相似,真实车牌的颜色更浅。
在真实场景下,拍摄的沾有泥土的车牌图片如图5.33所示。依据图5.31的沾有泥土的车牌图片,发现合成的车牌没有达到真实车牌的逼真效果。
通过加法操作生成雨天车牌图片,并对饱和度、亮度和对比度进行不同程度的修改。如图5.34所示。
图5.34 图(a)、图(b)、图(c)是对雨天的车牌图进行不同程度的饱和度、亮度和对比度修改后的图片
从图5.21和图5.34的对比可以看出,加法操作生成的雨天车牌图片比IMGAUG库生成的雨天车牌图片更加贴近现实效果。
批量生成车牌图片。特殊场景下的各类车牌生成效果见图5.35。
在批量生成车牌图片的同时自动产生XML文件。XML文件名由车牌号码和车牌类型组成,见图5.36。
每份文件保存了文件夹类别、文件名、图片原始路径、数据来源、图片大小、是否用于分割、拍摄角度、是否用于裁剪、是否是困难样本和目标框的位置。XML标注文件的具体内容见图5.37。
TXT文件名也是由车牌号码和车牌类型组成,见图5.38。
每份文件保存了车牌类别、归一化的中心坐标、相对宽度和相对高度。TXT标注文件的具体内容见图5.39。
随着数字智慧城市建设的推进,智能交通系统在交通堵塞管控中的地位日渐升高。车辆行驶途中必会出现车牌检测和识别的身影。为了提高它们的准确性和可靠性,提供大规模的车牌数据至关重要。本设计主要是开发一个能够自动生成车牌图片和信息标注文件的软件。不仅起到扩充数据集的作用,而且能按需生成车牌图片供研究所需,减轻了由成本、体力、时间和隐私带来的负担。
整个车牌生成过程包括四个部分:生成普通车牌、数据增强、生成特殊场景下的车牌以及生成对应的信息标注文件。首先,在车牌生成过程中,起初未考虑到中国车牌字符的特殊性,任意选用了一种计算机自带字体生成车牌图片。后期为了确保字符与国家标准一致,从官方文件和真实车牌中截取并保存了每个字符图片。采用OpenCV库对车牌底图的颜色和尺寸进行了调整,最终生成了标准的车牌图片。其次,为了扩充车牌数据,运用数据增强技术对车牌图片执行畸变、模糊和噪声操作。再次,因为难以通过简单的算法操作给图片添加各种天气特征,所以应用IMGAUG库将极端场景的特征添加到车牌图片中。最后,设计了两种标注方式用来保存车牌的路径、类别、大小和位置等信息。
通过前文对车牌数据集的梳理与总结可知,现有的车牌数据集还不够完善。本设计的车牌自动生成器成功生成了不同场合不同类型的中国车牌图片和信息标注文件,图片效果良好,能在一定程度促进车牌识别研究,但是仍有需要改进的地方。现依次列举出本次设计的不足之处和改善方向:
目前,基于深度学习的车牌识别模型都是以数以万计的样本数据作为支撑。但是,顾及到保护个人信息,现有的公开数据集极少,大多数车牌图片都是来自交通监控系统或者拍摄设备。然而这种方式的采集成本高,特殊场景车牌图像相对较少,并且各省份的车牌数量不均衡,最终导致训练的模型难以达到最优效果。因此可以通过车牌生成算法来自动合成车牌图片。相比人工拍摄车牌,这种生成器能够有效解决体力和时间的损耗问题,而且不受地理位置、环境天气和隐私的影响,能在短时间内生成研究所需用到的车牌图片。但是本设计的车牌生成器功能较少,且部分添加环境噪声的车牌不够逼真,后续可以设法添加更完善的数据增强方法。
搜集的车牌图片往往需要人工进行信息标注,这是一个工作量非常大的任务,而车牌自动生成器除了能通过车牌生成算法自动产生大量图片外,还要能对车牌的信息进行自动标注。本设计的车牌生成器能够实现畸变前和畸变后车牌图片的信息标注,但对于畸变后的单个字符,还不能标注其位置信息,后续可以优化一下,实现对单个字符位置的标注功能。
数据集往往缺乏极端情况下的车牌图片。一方面由于复杂环境下拍摄的困难程度大,另一方面生成复杂环境下的车牌图片需要更好的车牌生成算法。本设计生成的特殊场景下的车牌图片效果较为良好,但依旧无法达到真实车牌的逼真效果,比如:难以模拟折叠或沾有泥土的车牌。因为相对于普通车牌的生成,复杂环境下的车牌生成要求更高,机器难以完美地达到人眼看到的图片效果。如何提高车牌图片的真实效果,是车牌生成研究的关键之一。
时光的脚步匆匆,顺走了我的四年大学时光,那些成长中为我点灯引路的人们,却永远驻留在我心间。如今的少年已不像往年那般稚嫩,多了一份成熟和稳重。虽然告别总是要到来,但我仍留恋时光老人给我的每一份温暖,遂在此书写下我的真挚感谢。
春秋寒暑,岁月几度。我的毕业设计指导老师付老师是我想第一个感谢的人,您的严谨治学和关怀照顾铸成了学生的奋发拼搏和细致认真的品质。您就像琦君笔下的瞿师,既宽厚亦严厉。所谓“夫子温而厉”,这恐怕是对您最为形象的描述。记得在第一次组会时,您就通过分享自己的求学故事来勉励我们必须趁年轻记忆力强时多读书,多做笔记。我明白这份嘱咐中包含着老师希望学生成才的期望,我将带着这份期望,不断向阳成长,向上成长,实现自己的价值。
“慈母手中线,游子身上衣”,每当吟诵这首诗,我总会忍不住在记忆的仓库里重温那一份叫“亲情”的暖和爱。父母是我心灵的归宿,也是我最想感谢的人。他们如同春阳一般照拂我人生的路途,即便距离相隔遥远,也愿意倾听我的每声欢笑,理解和疼惜我的每滴泪水。我会带着这份爱,砥砺前行,也希望他们能够永远健康幸福。
草草杯盘共笑语,昏昏灯火话平生。再者我想感谢那些陪伴我成长的知心好友,与你们共度的时光总洋溢着关怀与暖意,让我留恋每一场陪伴。愿今后我们脚下有路,心中有光,不断前行!也感谢学院的所有老师,特别是我的辅导员。感谢您们给我带来了知识和哲理,带来了一次次的锻炼和成长,让我成为一个更优秀的人。未来的道路,我定不负期望,永往直前。
旧日时光虽已走远,但我想当我再次看到这一份熟悉的论文时,仍会将我的思绪牵向往昔的大学学生时代。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。