零基础边缘端智慧社区训练营 | Lesson 3

5个课时完成智慧社区AI实战项目!

欢迎大家来到AidLux零基础边缘端智慧社区训练营~

这节课我们会带大家一起完成一个车牌检测识别的项目,其中会用到车牌检测+车牌识别的项目。

因在不同的业务场景中,车牌识别的算法方案是不一样的。

比如在加油站的车牌识别场景中,车占整个图片的比例较小时,则建议在车牌检测前,增加一个车的检测模块。在检测到车后,再对车进行车牌的检测和识别。

零基础边缘端智慧社区训练营 | Lesson 3_第1张图片

而在智慧社区或者停车场场景中,相机一般按照在正对车牌的位置,车牌占据图片的比例较大,这样则建议直接对车牌做检测和识别。

这里车牌检测选择常用的yolov5,车牌识别使用的是LPRNet。

零基础边缘端智慧社区训练营 | Lesson 3_第2张图片

所以在本节课我们将训练两个模型,车牌检测的yolov5模型和车牌识别的LPRNet模型,在开始这次课程前,我们先了解下本节课程的内容框架:

1 车牌数据集的下载和说明

2 车牌数据集的整理

3 训练测试环境搭建

4 服务器的训练车牌的检测和识别模型

5 PC端的测试和pipeline推理

智慧社区第三课时演示视频

1. 车牌数据集的下载和说明

因为我们需要训练模型,首先要准备数据集,考虑到智慧社区中,在社区内很少出现工程车辆,所以只需要覆盖大部分的蓝牌和绿牌的场景即可。

最普遍的开源车牌数据集是中科大的CCPD数据集,官网链接是:

GitHub - detectRecog/CCPD: [ECCV 2018] CCPD: a diverse and well-annotated dataset for license plate detection and recognition

中科大车牌数据集有CCPD2019和CCPD2020,其中CCPD2019主要为蓝牌,CCPD2020为绿牌。其中蓝牌是燃油车,绿牌是电动车。

这里我们主要用CCPD2019的蓝牌来作为我们的任务。

大家可以通过官网链接的百度网盘进行下载:

零基础边缘端智慧社区训练营 | Lesson 3_第3张图片

从官网上下载CCPD2019数据集,得到的文件是这样的。

零基础边缘端智慧社区训练营 | Lesson 3_第4张图片

里面有6个文件夹,统计如下:

零基础边缘端智慧社区训练营 | Lesson 3_第5张图片

 

打开文件夹,每张图片的标签通过文件名展示。

图片命名:

“0019-1_1-340&500_404&526-404&524_340&526_340&502_404&500-0_0_11_26_25_28_17-66-3.jpg”

零基础边缘端智慧社区训练营 | Lesson 3_第6张图片

解释:

0019:车牌区域占整个画面的比例;

1_1:车牌水平和垂直角度, 水平1°, 竖直1°

340&500_404&526:标注框左上、右下坐标,左上(154, 383), 右下(386, 473)

404&524_340&526_340&502_404&500:标注框四个角点坐标,顺序为右下、左下、左上、右上

0_0_11_26_25_2_8:车牌号码映射关系如下: 第一个0为省份 对应省份字典provinces中的’皖’,;第二个0是该车所在地的地市一级代码,对应地市一级代码字典alphabets的’A’;后5位为字母和文字, 查看车牌号ads字典,如11为M,26为2,25为1,2为C,8为J 最终车牌号码为皖AM21CJ

省份:[“皖”, “沪”, “津”, “渝”, “冀”, “晋”, “蒙”, “辽”, “吉”, “黑”, “苏”, “浙”, “京”, “闽”, “赣”, “鲁”, “豫”, “鄂”, “湘”, “粤”, “桂”, “琼”, “川”, “贵”, “云”, “藏”, “陕”, “甘”, “青”, “宁”, “新”]

地市:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’,‘X’, ‘Y’, ‘Z’]

车牌字典:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’,‘Y’, ‘Z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]

后面我们需要先对图片的标签解析,解析完后才能对其进行训练。

车牌识别的方案主要有两种:

一种是粗粒度的:车牌检测+车牌识别;

另外一种细粒度的:车牌检测+车牌矫正+车牌识别。

后一种方法相对于前一种方法增加车牌矫正的部分,这部分主要考虑在场景中车牌在区域中出现的角度变化,如果是车牌与相机是相对平行的,则不需要矫正。

如果角度过大,则需矫正,这里面一般车牌的水平度和垂直度超过15°,建议增加矫正环节。

这里考虑到智慧社区的车与相机位置可以相对平行固定,故采用前一种方法,而其他如加油站场景中,摄像头因为要兼顾多种场景,不一定能做到平行,需要对车牌矫正后识别,效果更好。

零基础边缘端智慧社区训练营 | Lesson 3_第7张图片

(1)粗粒度车牌识别:前者我们需要两个标签,车牌两角围成的矩形框做车牌检测训练,车牌号码标签做车牌识别训练。

(2)细粒度车牌识别:后者则需要加上一个标签,即车牌的四个角以及倾斜角,用于车牌矫正训练。

这里我们用的是公开数据集,如CCPD数据集。虽然数据量满足要求,但是其数据集不均衡问题严重。

因为中科大在安徽采集数据较多,其中“皖”字占整个数据集汉字的90%,所以如果是对智慧社区定制化开发,需考虑社区所在的地理位置,针对性采集数据,或者模拟数据,优化模型。

2. 车牌数据集的整理

因为要做两个任务,车牌检测、车牌识别。

所以将车牌数据集整理分成两个部分:一是整理成检测任务需要的数据集,二是整理成车牌识别任务需要的数据集。

首先,我们将所有子文件夹中的图片均放在同一个文件夹中。

如果直接用cp命令,因复制文件较多会报错,所以采用

find file/ -name "*.jpg" | xargs -i cp {} destination_path 命令去复制:

(1)首先通过mkdir CCPD_base 创建CCPD_base文件夹,

(2)然后将从官网中下载的CCPD文件夹内的子文件夹的图片均复制到CCPD_base文件夹里(注意:这里复制的子文件夹里面的图片,而不是子文件夹):

将ccpd_blur、ccpd_challenge、ccpd_db、ccpd_fn、ccpd_weather五个文件夹,都拷贝到CCPD_base文件夹中:

注意:这里没有将ccpd_np文件夹复制进去,因为np是未上牌的新车,没有标签(如果因为手误复制进去也没关系,后期我们会对其过滤)。

复制完后,我们在ccpd_base文件夹下面查看文件个数:

ls -l |grep "^-"|wc -l

可以看到,里面一共有84280个图片文件,这里我们发现只有图片文件,没有标注文件,这个数据集是将车牌的标注信息都以文件名的方式标注,所以,后面我们需要对文件名解析,完成车牌数据的标签制作。

2.1 车牌检测数据集

对于检测任务,考虑数据集庞大和防止出错,我们会将其分成两个步骤。

(1)简单验证:先将几张图片标签转成yolo文件,并通过yolo转成voc xml格式,用labelimg打开校验。

(2)批量转换:确认转换的方式没有问题后,将所有标签直接转换成yolo格式保存。

其中转成yolo格式的代码如下,即大家下载第三节课资源中的tools/ParaseData.py

零基础边缘端智慧社区训练营 | Lesson 3_第8张图片

Yolo转voc xml格式的代码如下:

零基础边缘端智慧社区训练营 | Lesson 3_第9张图片

零基础边缘端智慧社区训练营 | Lesson 3_第10张图片

零基础边缘端智慧社区训练营 | Lesson 3_第11张图片

上面的整个代码不需要调整,主要修改下面代码中的图片和txt的路径:

零基础边缘端智慧社区训练营 | Lesson 3_第12张图片

(1)  简单验证

我们先新建一个images文件夹,然后从图片集中随机找出几张图片,放到images文件夹中。

在上方的代码中,将imaged_dir,修改成images的路径,将validation 改成True,将txt_dir, xml_dir改成你所保存的路径。

运行python后,可以得到两个文件夹,一个是labels文件夹,一个是xml_labels文件夹。

在第一次在images文件夹下面放入几张车牌图片,将Validation设置成True,运行 python label.py后,会生成以下文件夹:

其中labels文件夹里存储的为对应图片的车牌检测标注框的yolo格式的txt标签文件,主要用于训练用。

xml_labels文件夹里面存储的为对应图片的车牌检测标注框的voc格式的标签文件,主要用于可视化车牌标注框的标注,看是否解析正确。(注:因为后期制作,将文件夹名字改了,实际上这里的images对应着上述的ccpd_base文件夹)

用labelimg打开images文件夹,并查看xml_labels结果,对labelimg的安装和使用不了解的,可以看江大白的前次课程:

零基础边缘端智慧社区训练营 | Lesson 3_第13张图片

(2)批量转换

这样在确认标签的解析没有问题后,将validation设置成False,修改图片路径和保存txt路径:

将image_dir 和txt_dir设置成训练验证的数据集路径,运行后结果如下:

零基础边缘端智慧社区训练营 | Lesson 3_第14张图片

为了让后面的yolov5框架更好的解析代码,这里将图片文件夹命名为images,txt的标签文件夹命名为labels:

(3)随机挑选

考虑后期训练时长等因素,这里将八万多张的数据,大刀从里面随机抽取1w张来做为训练集,方便大家将整个流程先走完。

后期如果觉得效果不好,可以按照同样的步骤把8w张数据重新训练。

随机抽取代码如下,即代码文件中的tools/cp10000.py:

零基础边缘端智慧社区训练营 | Lesson 3_第15张图片

2.2 车牌识别数据集

上面我们了解了对抗防御的场景应用,接下来我们再了解一下目前主流对抗防御的总体分支与逻辑:

对于任务二,需对车牌号码做解析,在tools/ccpd2lpr.py文件下,将路径换成自己的路径:

零基础边缘端智慧社区训练营 | Lesson 3_第16张图片

运行python ccpd2lpr.py 后:

零基础边缘端智慧社区训练营 | Lesson 3_第17张图片

则表示已经完成数据集的整理。

在image_rec文件夹下生成以车牌号为文件名的图片集:

零基础边缘端智慧社区训练营 | Lesson 3_第18张图片

3. 训练测试环境搭建

在对数据集完成预处理后,我们带大家一起训练模型。

对于检测模型,我们选用工业界比较常用的yolov5框架,对车牌识别,选用比较成熟的LPRNet架构。

3.1 云服务器的注册

考虑到有的同学没有GPU训练,为了完整的走完整个流程,我们可以在AutoDL平台上使用云服务器。官网地址为:AutoDL-品质GPU租用平台-租GPU就上AutoDL

首先点击右上角的”注册有礼”按钮进行注册。

零基础边缘端智慧社区训练营 | Lesson 3_第19张图片

在注册完成后,点击左上角的”算力市场”,会看到有很多地区和空闲的GPU型号,每个GPU型号的算力不同,大家可以根据自己的需要选择。在注册会员时,会赠送10元的代金券,在训练模型时,应该是足够的。

零基础边缘端智慧社区训练营 | Lesson 3_第20张图片

3.2 云服务器的网盘数据上传

先不着急创建服务实例,因为创建后,会按创建的时间计费,而我们的准备工作还没做完。

在创建服务器前,我们需要将代码和数据上传到云网盘上,这样做的目的是上传到云网盘上的数据在实例服务结束后,不会被销毁。

而如将代码和数据放到创建的实例服务上的话,在实例服务结束后,该服务被销毁,在里面的数据也会一起被销掉。

这里使用的是北京A区的GPU与网盘。

零基础边缘端智慧社区训练营 | Lesson 3_第21张图片

在右上角可以看出网盘支持的字样,则说明该gpu服务器的网盘是可用的。

点击右上角的控制台按钮,进入我的管理。

零基础边缘端智慧社区训练营 | Lesson 3_第22张图片

点击左侧的我的网盘,选择北京A区→初始化网盘:

零基础边缘端智慧社区训练营 | Lesson 3_第23张图片

在初始化网盘后,点击上传按钮,将我们数据集和训练测试代码上传上去。

(1)  车牌检测的数据集

为了方便上传,将车牌检测的数据集压缩成ccpd10000.zip,大家下载的Lession3_code文件夹中,大刀已经将其压缩,plate_detection_data.zip中主要包含了车牌检测训练所需的数据。

(2)  车牌识别的数据集

将车牌识别的数据集压缩成data_plate_recognization.zip,也放在了Lession3_code文件夹下了。data_plate_recognization.zip中包含了车牌识别训练所需要的数据。

(3)  车牌检测+识别的训练代码

将code_plate_detection_recognization的训练代码,压缩成code_plate_detection_recognization.zip代码。

里面是车牌检测和车牌识别的训练、验证和测试代码。

零基础边缘端智慧社区训练营 | Lesson 3_第24张图片

3.3 云服务器的创建实例

以上,我们的准备工作算完成了,现在开始创建云服务器实例,返回左上角的“算力市场”,如这里,我们选择了与网盘区域相同的北京A区1张RTX3090的卡,下端会显示该区域有哪些可用:

零基础边缘端智慧社区训练营 | Lesson 3_第25张图片

选择某个服务器,点击蓝色的“1卡可租”按钮,进入页面:

零基础边缘端智慧社区训练营 | Lesson 3_第26张图片

这里的镜像可以配置基础镜像,如pytorch1.7.0/python3.8/cuda11.0。当然这里面有配置热门镜像如yolov5,选择yolov5镜像。

点击立即创建,这时右上角可能会有弹窗:

零基础边缘端智慧社区训练营 | Lesson 3_第27张图片

如果出现这种问题,则返回上个页面重新选择北京A区的算力后,按照上述步骤,继续创建直至创建完成,会跳转到下一个页面:

零基础边缘端智慧社区训练营 | Lesson 3_第28张图片

等到状态栏从“创建中”→“开机中”→“运行中”,则可以开始运行了。

零基础边缘端智慧社区训练营 | Lesson 3_第29张图片

点击快捷工具栏中的JupyterLab,进入控制页面。

点击“其他”下面的“终端”按钮,就会打开一个终端页面。

零基础边缘端智慧社区训练营 | Lesson 3_第30张图片

如果需要多个终端,则需要点击左上角的“+”号键,和上个步骤相同,增加几个终端页面,这里新增了3个终端页面。

零基础边缘端智慧社区训练营 | Lesson 3_第31张图片

进入终端页面后,显示有系统盘、数据盘和网盘三个盘,我们的数据放在网盘中。

运行cd /root/autodl-nas进入网盘,我们刚刚存放在网盘里面的数据就保存在里面。

使用unzip 命令解压三个文件夹:

零基础边缘端智慧社区训练营 | Lesson 3_第32张图片

解压后的目录如下:

4. 服务器训练车牌的检测和识别模型

4.1 数据集的划分:

解压完成后,我们就有了车牌检测的代码和数据,现在传入的数据已经是yolov5格式txt标签数据,除此之外,我们需要对传入的数据完成train:val的划分。

首先检测数据集目录下,pwd命令获取当前目标的路径,选择路径,crtl+c复制。

第二步,进入代码目录下的tools文件夹下,vim split_train_val.py:

按“a”键,左下角出现INSERT,

进入编辑模式,按键盘上的上下键,跳转到需要修改的地方,将上述ctrl+C的目录,ctrl+v粘贴到指定位置:

零基础边缘端智慧社区训练营 | Lesson 3_第33张图片

再通过先按ESC退出键,再通过”:wq!”四个按键保存文件强制退出,跳出编辑页面。

通过python split_train_val.py命名运行:

零基础边缘端智慧社区训练营 | Lesson 3_第34张图片

进入到目标检测的数据集里,看2007_train.txt和2007_val.txt两文件是否生成:

Txt里保存了训练集和验证集的图片路径, 通过cat 2007_val.txt查看:

零基础边缘端智慧社区训练营 | Lesson 3_第35张图片

4.2 车牌检测训练配置设置

(1)修改训练数据集参数

进入code环境下,配置参数,首先是数据参数,在data文件夹下面打开ccpd.yaml文件,vim进入plate.yaml文件中,修改训练集和验证集路径,和类别数以及类别标签。

零基础边缘端智慧社区训练营 | Lesson 3_第36张图片

零基础边缘端智慧社区训练营 | Lesson 3_第37张图片

(2)修改网络参数配置

(3)修改训练参数配置

零基础边缘端智慧社区训练营 | Lesson 3_第38张图片

4.3 训练车牌检测模型

输入 python tools/train_yolov5.py

报错如下:

零基础边缘端智慧社区训练营 | Lesson 3_第39张图片

将tools 文件夹下面的train_yolov5.py的代码移动到主目录下面,运行python train_yolov5.py:

零基础边缘端智慧社区训练营 | Lesson 3_第40张图片

又报错:

零基础边缘端智慧社区训练营 | Lesson 3_第41张图片

修改yolo.py 文件下的代码:

增加红框一行:

零基础边缘端智慧社区训练营 | Lesson 3_第42张图片

再次运行:

点击左侧栏中runs 目录下面的任务文件夹,即可看到训练完后的模型

零基础边缘端智慧社区训练营 | Lesson 3_第43张图片

在训练完成后,打开我的网盘,下载训练的pt模型至本地。

零基础边缘端智慧社区训练营 | Lesson 3_第44张图片

4.4 训练车牌识别模型:

1. 训练集和测试集划分

首先image_rec识别数据集目录下,通过。

第二步,进入代码目录下的tools文件夹下,vim split_train_val.py:

按“a”键,左下角出现INSERT,

进入编辑模式,按键盘上的上下键,跳转到需要修改的地方,将上述ctrl+C的目录,ctrl+v粘贴到指定位置,将detection改成False

零基础边缘端智慧社区训练营 | Lesson 3_第45张图片

再通过先按ESC退出键,再通过”:wq!”四个按键保存文件强制退出,跳出编辑页面。

通过python split_train_val.py命名运行:

零基础边缘端智慧社区训练营 | Lesson 3_第46张图片

进入到数据集里,看train和val两文件夹是否生成:

进入train 文件夹下面,查看发现生成7923张训练集

2. 配置训练参数,vim train_lprnet.py ,主要修改训练和验证的文件夹目录,其他的参数按需修改。

零基础边缘端智慧社区训练营 | Lesson 3_第47张图片

训练模型:

运行python train_lprnet.py :

零基础边缘端智慧社区训练营 | Lesson 3_第48张图片

出现以上的情况则表示开始训练后,在训练后在weights 文件夹下面会有lprnet_best.pth的权重文件。

5. PC端的测试和pipeline推理

为了完成车牌检测的测试,这里在PC端,大刀在windows系统下,在一个无环境的电脑上安装推理环境,因为电脑的硬件限制,这里使用的是cpu做推理。

Vscode打开代码detect_yolov5.py文件,修改配置参数:

主要修改228行的权重文件路径,229行的测试数据集路径:

零基础边缘端智慧社区训练营 | Lesson 3_第49张图片

点击上面的“终端”,点击“运行任务”:

零基础边缘端智慧社区训练营 | Lesson 3_第50张图片

发现右下角出现弹窗,为python没有安装:

零基础边缘端智慧社区训练营 | Lesson 3_第51张图片

点击左侧栏上的拓展按钮,在拓展商店里安装python:

零基础边缘端智慧社区训练营 | Lesson 3_第52张图片

安装成功的python显示如下:

零基础边缘端智慧社区训练营 | Lesson 3_第53张图片

在终端窗口,继续运行:

零基础边缘端智慧社区训练营 | Lesson 3_第54张图片

安装库:

Pip install –r requirement –i Simple Index(因为硬件上无gpu,如果有的话需要安装cuda版本后,安装torch-gpu)

安装完后,修改detect_yolov5.py中的路径后:

零基础边缘端智慧社区训练营 | Lesson 3_第55张图片

在终端输入python detect_yolov5.py文件后:

零基础边缘端智慧社区训练营 | Lesson 3_第56张图片

输出结果在demo/detect_results 里面的结果,可以看到车牌检测的结果:

零基础边缘端智慧社区训练营 | Lesson 3_第57张图片

这里需要说明一下test_lprnet.py,车牌识别作为车牌检测的下游任务,其输入图片需要将检测到的裁剪车牌。

同理,通过python detect_torch_pipeline测试车牌识别的整体效果。

零基础边缘端智慧社区训练营 | Lesson 3_第58张图片

6.课堂小结

以上为车牌检测和识别的前期数据集整理、训练和推理测试部分,在工作中,大家如果训练车牌检测和识别,主要的要修改的点会花在数据集的匹配和预处理,在模型训练过程中主要是对一些超参的调优,同时后面在对bad case分析后的算法迭代,希望对大家有帮助。

下一节课,我们将对上述pc端推理的车牌识别,在移动Android端完成部署,我们下节课见。

大家可以在AidLux公众号后台回复”训练营“,获取本次(智慧社区)训练营所需物料资源包,以及智慧安防、智慧交通训练营全部课程内容及对应资源包。

也可以一起交流,有AidLux工程师和江大白、Rocky等众多AI行业专家,可以给予技术指导以及进行交流互动。

你可能感兴趣的:(AidLux智慧社区训练营,人工智能,计算机视觉)