零基础边缘端智慧交通训练营 | Lesson 3

5个课时实现车辆检测+安全算法,玩转智慧交通AI应用!

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

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

前面两节课,主要介绍了AI项目安全风险和AI安全技术的一些背景,及使用AidLux实现AI功能的方式。

在第三节课,我们主要完成车辆检测模型的训练和部署测试,以及应用“以数据为中心”策略完成一个小作业,内容框架如下:

1 车辆检测数据集的梳理

2 云服务器训练Yolov5车辆检测模型

3 PC端车辆检测模型推理测试

4 AidLux端模型推理测试

5 课堂小作业

lesson3

1. 车辆检测数据集的梳理

因为后续的章节将从车辆检测入手,所以本节课先带着大家手把手训练一个检测模型,并转化成AidLux可以部署的方式,进行推理测试。

这里主要选用了Kaggle开源的车辆数据集,

Car Object Detection | Kaggle

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

数据集中总共包含了三个方面的内容:1001张的训练数据集,175张的测试数据集,以及一个标签csv文件。

这个数据集是一个典型的小量级数据,这在实际项目中非常常见,后续我们将用“以数据为中心”的思想对数据集进行优化。

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

这里已经把数据集以及下面的训练代码、数据清洗脚本都整理好了,大家可以交流,以便后期自己训练时挑选使用。

可以看到Lesson3_code资料文件夹里,除了包含car_train_data.zip(车辆数据集)以外,还包含data_prepare_code(数据预处理文件夹)和yolov5_code(模型训练测试文件夹)。

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

接下来,我们对数据集进行标注转换以及训练验证集划分,因为本次主要使用YOLOv5算法,我们需要将数据标签转换成YOLOv5可以训练的格式,而数据集划分按照9:1的方式进行,即90%是训练集,10%是验证集。

在lesson3_code/data_prepare_code文件中,编写了相关代码data_code_car.py。

使用VScode编程软件打开data_code_car.py,首先修改其中的image_dir,train_val_dir,csv_reader,schuil.copy中的三个路径。

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

运行代码,完成后可以看到,在car_train_data文件夹中多了image_txt和train_val_txt两个文件夹,image_txt包含了数据和标签,train_val_txt包含了训练集和验证集的调用列表。

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

不过这个代码在本地不需要运行,等我们将代码与数据上传到云服务器后,再进行训练数据的生成,这样就不用再改标签里的路径了。

2. 云服务器训练Yolov5车辆检测模型

2.1 云服务器介绍

有了车辆数据集,我们就可以训练检测模型了。在本次训练营中,我们选用工业界最常用的YOLOv5算法。

考虑到有些同学有GPU服务器,有些同学没有,针对没有GPU服务器的同学,为了能够测试一整套的流程,大家可以采用云服务器来进行替代。本次课程采用的算力平台是AutoDL AI算力云,官网地址:AutoDL-品质GPU租用平台-租GPU就上AutoDL

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

首先点击右上角的“注册”选项进行注册。

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

在进入后台的主页面,点击左上角的“算力市场”。

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

可以看到不同的区域,有一些空闲的GPU服务器,每台服务器的显卡型号以及算力都不尽相同,大家可以根据自己的需求进行选择。当我们刚注册会员时,会赠送10元的代金劵,这个我们训练模型已经足够,训练完基础模型还有9块多的余额。

2.2 查看符合条件的云网盘

我们需要将数据集和代码都先上传到云服务器的网盘里面,后面就可以直接在上面操作。

在实例中大家可以看到,不同地方的设备,云服务器的网盘也要选择对应位置。比如说使用北京A区的GPU,那就要将代码和数据也存在北京A区的网盘中。

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

我们在这里使用的都是北京A区的GPU与网盘。后面实例购买的时候,还是购买北京的实例,就可以在系统盘中直接找到相应的文件。

如果后面再购买其他地区的实例,则在系统盘中,就找不到相应的数据文件。

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

2.3 训练&验证集图片上传

我们再将前面的一些文件,传输到“我的网盘”里面。主要上传三个文件:

(1)数据集

为了方便上传,将数据集压缩成car_train_data.zip,大家下载的Lesson3_code文件夹中,已经将其压缩了。car_train_data.zip中主要包含了训练所需的数据。

(2)数据预处理代码

将data_prepare_code文件夹,进行压缩,变成data_prepare_code.zip文件夹。data_prepare_code文件夹中包含了数据预处理代码,能够将数据集制作成YOLOv5能够过读取训练的格式。

(3)YOLOv5训练代码

将Yolov5_code训练代码,进行压缩,变成yolov5_code.zip。Yolov5_code文件夹将是我们训练和测试车辆检测模型的核心部分。

(4)后台上传文件——点击AutoDL后台的我的网盘,将刚刚的三个zip文件进行上传,当然可能网络原因,有的文件可以上传的会稍微慢一些。

2.4 新建实例设备

到了这里,我们的代码、数据集都准备好了,就准备新建一个实例设备操作了。这里还是选择和网盘所对应的,北京A区的实例。

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

可以自己选择一个GPU服务器,可以看到显示多少钱,这里展示的都是单卡的价格,有的设备必须要N卡一租的,可以看到对应的价格。

点击进入后,可以修改两个地方,一个是GPU数量,一个是新建实例的基础镜像。

我们这里GPU数量选择1,表示单卡。新建实例镜像,选择了Pytorch的yolov5镜像,其中YOLOv5训练所需的依赖库都配置好了,十分方便。

我们也可以看到最下方,有一个可用代金券,即表示我们可以先免费使用10元钱。

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

点击“立即创建”后,就可以看到创建的实例了。

点击右面的“JupyterLab”,可以进入控制台页面。

可以点击下面的“终端”,打开一个终端页面,就可以进行操作了。

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

当然如果一个终端页面不够操作的话,可以点击左上方的“+”号,新增加几个终端页面。比如我们这里新建了4个终端页面。

并且在上面,我们看到autodl-nas即我们刚刚使用的网盘。

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

进入autodl-nas文件夹后,我们也可以看到,里面有刚刚新上传的三个zip文件,我们使用unzip命令进行解压。

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

最后可以看到,三个文件夹都被解压成功:

解压完成后,我们开始制作训练数据集。

先查看一下训练数据集car_train_data的路径,因为会涉及到转换后的txt路径,在云服务器上运行加训练。

先cd car_train_data文件夹,再输入pwd,可以看到这时的数据集路径是:/root/autodl-nas/car_train_data

然后再去修改代码中的路径,首先cd data_prepare_code文件夹里,再vim data_code_car.py,将第一小节中讲到的三个路径进行修改。

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

按键盘上的“i”,进入代码的编辑状态,移动到路径处,修改成云服务器上对应的路径,我们这里是/root/autodl-nas/car_train_data,大家可以对应修改。

修改完成后,按键盘上的Esc键,跳出编辑状态。

再输入“:”,会跳出输入框,再输入"wq!",表示对于该修改内容,保存编辑强制退出,回到原始页面。

在运行data_code_car.py,数据集就生成好了。

2.5 训练车辆检测模型

训练车辆检测模型,主要用到/autodl-nas/yolov5_code文件夹了,我们主要对里面的文件进行参数配置。

(1)新建car.yaml

因为训练的是车辆检测模型,所以在yolov5_code/data文件夹下新建一个car.yaml文件。

不过需要注意的是,训练集和验证集的路径都要修改一下,此外还有类别数,以及类别标签。

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

(2)修改train.py参数

而yolov5_code/train.py文件中,主要修改models初始化模型的路径,这里使用的yolov5n的模型权重。

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

cfg即模型对应的网络结构路径,data是新增的car.yaml路径。

此外还有epochs训练迭代的次数,batch-size大小,当然imgsz也可以修改,这里默认640。

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

(3)修改models/yolov5n.yaml

修改其中的类别数量,因为车辆就一个类别,所以修改成1。

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

(4)训练车辆检测模型

上面的配置文件都修改好以后,由于我们选用了YOLOv5镜像,可以直接输入python train.py,就可以开始训练了。

训练过程中,一般会得到两个模型,一个best.pt,即epoch迭代的过程中,map精度对比比较好保存的模型。

一个是last.pt,即迭代过程中,最后一次epoch保存的模型。

比如我们训练过程中,保存的这两个,在后面测试的时候,主要使用best.pt文件。

2.6 下载检测模型

在AutoDL的我的网盘,找到runs下面最新训练车辆检测模型,路径可以参考:

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

将best.pt模型下载下来,修改成yolov5n_car_best.pt。并放到yolov5_code/models文件夹中。

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

3. PC端车辆检测模型推理测试

在上一节中,我们在云服务平台训练了车辆检测模型,并将其下载到了本地。接下来我们在自己本地PC电脑上进行模型测试和模型转换。

当我们训练出一个车辆检测模型,比如我们本节课选用的最最轻量型的yolov5n.pt文件。我们首先要在pc端使用测试集进行效果测试。

3.1 Python相关功能库的安装

为了让每个人,不管是小白还是有经验的朋友都能运行。我们特意找了一台空白的电脑,没有安装任何功能库的电脑进行整体的测试,发现还有一些库还需要安装。

这时我们就需要配置相应的测试环境,以下是一些需要配置的依赖库,大家可以对照着进行下载安装:

(1)Pytorch核心库安装

首先就是Pytorch库安装:这里选择1.8.1版本的Pytorch进行安装,如果没有安装Pytorch,运行代码时就会报错:

我们使用如下的安装命令对Pytorch进行快速安装:

pip install torch==1.8.1 -i Simple Index

其中-i Simple Index字段是使用了清华源进行下载时的加速。

在安装完成Pytorch之后,还有一个非常重要的依赖库需要配套安装,那就是torchvision依赖库。

torchvision下载时的版本选择要与Pytorch版本相适配,这里我们选择0.9.1版本的torchvision进行安装。

torchvision的安装命令如下:

pip install torchvision==0.9.1 -i Simple Index

(2)其他依赖库安装

除了Pytorch,代码中还有一系列的依赖库,这里也列出相关的下载链接,可以一个个下载安装。

Pandas下载:pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

yaml下载:pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

tqdm下载:pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple

matplotlib下载:pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

seaborn下载:pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple

scipy下载:pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple

ipython下载:pip install ipython -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 模型推理测试

我们使用yolov5的模型,对于images里面的图片进行推理,测试一下效果。

打开detect_image.py文件,这里主要修改代码中的模型、图片路径、yaml文件。

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

其中data/images/tests文件夹中已经包含了测试集的所有数据。

使用Run->"Run Without Debuging",运行后可以得到一张张推理的图片效果(使用空格键快速切换不同图片的检测结果)。

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

4. AidLux端模型推理测试

在PC端完成测试之后,在实际项目中,我们主要是在边缘端AidLux上进行使用。在第二节课中,我们也讲过,AidLux主要针对推理部分,在底层进行了加速优化,非常适合AI模型的部署使用。

不过想要将pt模型移植到AidLux上并使用,还要进行转换模型和修改推理代码的操作。

4.1 pt模型转换成tflite模型

模型转换的文件是yolov5_code/export.py文件,因为我们准备在AidLux中运行tflite格式的模型,因此主要修改其中的三个地方。

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

因为需要tensorflow,所以运行时会报错:

所以再输入:pip install tensorflow==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple,下载安装tensorflow库。

安装好再运行export.py文件,在models文件夹下面,可以看到生成的yolov5_car_best-fp16.tflite文件。

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

4.2 AidLux端推理代码理解

针对AidLux中推理测试的代码,这里放到yolov5_code/aidlux文件夹的yolov5.py中了,大家也可以将训练好的tflite放到AidLux文件夹中。

其中包含了很多AidLux专属的函数接口,大家可以点击这里查看下相关的函数说明。

当然其中的代码和原本PC端的代码有一些不同,这里梳理讲解一下,主要分为三个部分:

(1)加载相关的函数库

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

(2)模型初始化以及加载

其中主要用到两个函数接口,一个是aidlite_gpu.aidlite()和aidlite.ANNMode()

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

AidLite初始化的说明:

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

AidLite加载模型的说明:

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

此外还有两行in_shape,out_shape,这里可以通过netron查看一下相关的模型参数。

我们可以使用https://netron.app/,打开刚刚的yolov5_car_best-fp16.tflite文件。点击最下方的输出单元,可以看到输出的信息。

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

(3)模型推理测试代码

接下来就是在Aidlxu进行模型推理,使用测试集测试模型效果了。相关的代码如下所示:

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

4.3 代码复制到AidLux中

和第二节课中讲的AidLux的使用说明和详细操作实例一样,我们将yolov5的代码,全部上传到AidLux的home下面。

还是通过Cloud_ip在电脑端访问AidLux,打开文件浏览器,进入home下方,点击上传按钮,将Lesson3_code/yolov5_code文件夹进行上传。

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

4.4 远程连接AidLux

在第二节课中,我们讲解了使用SSH,连接到AidLux的方式。大家也可以远程连接到Lesson3_code,当看到VScode左下角部分的SSH:AIDLUX呈现绿色,即说明远程连接成功。

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

4.5 推理测试Aidlux端代码

打开yolov5_code/aidlux文件夹中的yolov5.py进行模型推理测试,在平板/手机版本的AidLux和PC端网页的AidLux中,都可以看到推理的显示结果。

PS:需要注意的是,在运行的时候,需要把手机版本里面的AidLux页面叉掉,免得会有冲突,运行的线程会直接被killed掉。

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

5. 课堂小作业

以上就是第三节课的内容,我们主要学习了如何使用云服务器,训练yolov5的车辆检测模型。

并将训练好的检测模型,转换成AidLux可以使用的tflite模型,且对测试数据进行推理测试,看到实际的效果。

本节课最后留一个小作业,在第二节课中,我们讲到了“以数据为中心”的鲁棒机器学习策略,大家可以在车辆检测训练中进行尝试。

完成整个车辆检测模型的训练过程后,大家可以发现,我们使用的数据只有1000+的量级,在实际项目中,这是远远不够的,我们需要制作更多的数据来提升模型的检测效果与鲁棒性。

5.1 数据增强技术扩展性讲解

这里给出一些数据增强库,大家可以尝试对车辆数据集进行一定的增强,并尝试进行优化训练。

(1)imgaug:https://github.com/aleju/imgaug

(2)albumentations:https://github.com/albumentations-team/albumentations

(3)autoaugment:https://github.com/4uiiurz1/pytorch-auto-augment

(4)imagecorruptions:https://github.com/bethgelab/imagecorruptions

这里以imgaug为例,其包含了color、blur、blend、weather、contrast等数据增强的方式。

首先需要安装imgaug库:pip install imgaug -i Simple Index

接着设置数据增强模式:

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

需要注意的是,一些裁剪、旋转等会产生label变化的增强,需要同时修改label文件。在这里,大家可以先尝试不会改变label的数据增强方式,后续我们的特殊测试集也是不包含改变label变化的。

接下来我们就可以输入数据进行增强了:

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

5.2 小作业内容 

数据增强,在模型训练过程中,可以快速增加训练数据集的数量,在一定程度上,对于模型的泛化性还是有一些帮助的。

所以在上面的数据增强演示的基础上,大家可以尝试一下各种数据增强的方式。

在最后的大作业中,我们也将使用一些特殊的测试集来检验模型优化的成果,大家可以将生成的数据用于训练优化模型,作为大作业的部分成果。

以上就是第三节课的内容。

完成作业的同学可以将增强的各式图片选取几张交流分享,本节课所需的数据集、资料包也都在这里。

你可能感兴趣的:(人工智能,深度学习)