我用PaddleDetection做了一个“交通违章逆行车辆”自动检测系统

【飞桨开发者说】梁瑛平,北京理工大学徐特立学院本科二年级,人工智能开发爱好者。


项目简介


对于目前绝大多数的交通监控而言,依旧是沿用传统的管理模式。随着国民经济的日益发展和交通产业需求的日益增长,智能交通视觉系统的发展将趋向用机器视觉下的图像处理技术进行实时监测。通过摄像头辅助监测,相对于其他检测方法, 摄像头价格低廉, 安装容易, 对现有的交通枢纽进行摄像头安装时不需要太大的改动, 后期维护方便;并且一个摄像头可以同时监控多个目标, 大大减少了前期硬件安装的工作量,因此基于视频图像检测任务有很好的应用前景。

  • 该项目使用百度飞桨目标检测套件PaddleDetection提供的YOLOv3预训练模型,在此基础上进行二次开发,实现车辆检测;

  • 并使用X2Paddle工具将Pytorch框架下训练的模型进行模型转换,实现车辆颜色、类型和朝向的识别;

  • 然后使用上述两个算法实现简单的交通违章逆行车辆的检测。

数据集及模型评估:

训练集使用COCO数据集中的车辆检测部分。该数据集起源于微软2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。COCO数据集是一个大型的、丰富的物体检测和分割数据集。这个数据集以场景理解为目标,主要从复杂的日常场景中截取。

数据集包括20万张有标注图片,整个数据目标数目超过150 万个。训练时选取了12786张包含车辆的图片,训练集、验证集和测试集比例为8:1:1。

该模型经过120000轮迭代训练后,最终在IOU=0.5下测得mAP为0.764,检测速度在1050Ti下为11.4帧/秒。

最终效果:

PaddleDetection简介

PaddleDetection是基于飞桨核心框架构建的目标检测开发套件,覆盖了主流的目标检测算法并提供丰富的预训练模型,可以帮助用户可以非常方便、快速的搭建出各种检测模型,高质量完成各类目标检测任务。

为了方便用户配置,PaddleDetection提供了configure工具,为用户提供以下功能:

• 预定义好各个模块,根据给出的模块列表生成配置文件,默认生成完整配置。如果指定参数,也可以生成最小配置,即省略所有默认配置项。

• 检查配置文件中的缺少或者多余的配置项以及依赖缺失。

• 显示指定模块的帮助信息,如描述、配置项、配置文件模板及命令行示例。

• 列出当前已注册的模块。

PaddleDetection  GitHub项目地址

https://github.com/PaddlePaddle/PaddleDetection

PaddleDetection 文档链接

https://paddledetection.readthedocs.io/

支持的主流模型包括:

更多的模型还包括:EfficientDet,FCOS,CornerNet-Squeeze,YOLOv4等。


项目过程回放


1. 安装 PaddlePaddle:

python -m pip install paddlepaddle-gpu

清华源安装也可以:

进入 Python 环境并测试:

>>> import paddle.fluid as fluid>>> fluid.install_check.run_check()

安装成功~

2. 安装 PaddleDetection

新建一个文件夹,在该目录激活环境:

克隆 PaddleDetection 模型库:

git clone https://github.com/PaddlePaddle/PaddleDetection.git

再安装依赖库:

pip install -r requirements.txt

指定当前 Python 路径然后测试:

set PYTHONPATH=%PYTHONPATH%;.python ppdet/modeling/tests/test_architectures.py

安装成功~


3. 调试 YOLOv3 预训练模型

安装 cocotools:

pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI


下载模型的权重文件,地址:

https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/featured_model/CONTRIB_cn.md

解压到文件目录。

运行如下命令检测演示用图片。

python -u tools/infer.py -c contrib/VehicleDetection/vehicle_yolov3_darknet.yml \-o weights=vehicle_yolov3_darknet \--infer_dir contrib/VehicleDetection/demo \--draw_threshold 0.2 \--output_dir contrib/VehicleDetection/demo/output

检测结果保存在 contrib\VehicleDetection\demo 目录下:

可以看到检测效果非常好~

YOLOv3算法简介:

论文地址:https://arxiv.org/abs/1804.02767

‘Sometimes you just kinda phone it in for a year, you know?’

YOLO作者说他一年大部分时间去刷 Twitter 了,然后玩了(play around)一阵子 GAN,正好剩下一点时间,就改进了一下 YOLO 算法,提出了 YOLO v3。

YOLOv3添加了ResNet中提出的残差结果和FPN中提出的通过上采样得到的特征金字塔结果。它最显着特征是它可以三种不同的比例进行检测,最终输出是通过在特征图上应用1 x 1内核生成的。在YOLO v3中,通过在网络中三个不同位置的三个不同大小的特征图上使用1 x 1大小的卷积来完成检测。

主要特点:

  • 首先在主干网络DarkNet-19的基础上加入了残差结构,使得它在 ImageNet上的表现跟ResNet-101相差无几,但是处理速度却快得多。

  • 此外YOLOv3中,每个单元格对应使用了三个不同比率和大小的预选框,并且还构建了跟FPN目标检测算法相似的特征金字塔,利用不同大小、不同深度的特整层进行不同大小目标的预测。


4. 检测自己的数据

这里我写了一个调用 PaddleDetection 车辆检测模型的程序,源码地址:

https://github.com/Sharpiless/yolov3-vehicle-detection-paddle

测试图片:

测试视频:


5.使用 X2Paddle 进行模型转换

看到这里有同学要问了,这个类型识别是如何实现的?

这里我使用的是 torch 的开源车辆类型识别模型,并使用 X2Paddle 工具将其转换为 PaddlePaddle 模型。

深度学习的应用主要包括两个部分,一是通过深度学习框架训练出模型,二是利用训练出来的模型进行预测。

开发者基于不同的深度学习框架能够得到不同的训练模型,如果想要基于一种框架进行预测,就必须要解决不同框架的模型之间的匹配问题。基于这种考虑,也为了帮助用户快速从其他框架迁移,PaddlePaddle开源了模型转换工具X2Paddle。

它可以将TensorFlow、Caffe 的模型转换为PaddlePaddle的核心框架可加载的格式。同时X2Paddle还支持ONNX格式的模型转换,这样也相当于支持了众多可以转换为ONNX格式的框架,比如PyTorch、MXNet、CNTK等。

下载 torch 源码:

源码地址:

https://github.com/Sharpiless/Paddle-Car-type-recognition

首先运行 torch2onnx.py,将 pth 模型转换为 onnx 中间模型:

然后运行:

x2paddle --framework=onnx --model=classifier.onnx --save_dir=pd_model


可以看到生成了相应的 PaddlePaddle 模型,然后创建调用 PaddlePaddle 模型的 test_img.py(见项目源码)。运行测试:

6.车辆逆行检测

该部分使用上述两个模型实现,具体代码见项目:

https://aistudio.baidu.com/aistudio/projectdetail/453620

项目最终效果:


小结


1. 本项目使用PaddleDetection提供的高层接口,快速、高效地完成了智能交通监控任务中车辆检测和车辆类型识别的模型的部署。

PaddleDetection基于百度的飞桨开源框架,集成了多种图像识别和目标检测模型,并且提供了相应的训练、推理和部署工具,使得用户可以自己 DIY 数据集和模型细节,实现深度学习落地应用的快速部署。有如下特点:

  • 易部署:PaddleDetection的模型中使用的核心算子均通过C++或CUDA实现,并集成了飞桨高性能推理引擎,可以方便地部署在多种硬件平台上。

  • 高灵活度:PaddleDetection通过模块化设计来解耦各个组件,基于配置文件可以轻松地搭建各种检测模型。

  • 高性能:基于PaddlePaddle框架的高性能内核,在模型训练速度、显存占用上有一定的优势。例如,YOLOv3的训练速度快于其他框架。

  • 模型丰富: 提供了丰富的模型,包含目标检测、实例分割、人脸检测等100+个预训练模型,涵盖多种数据集竞赛冠军方案、适合云端/边缘端设备部署的检测方案。

最大的感受就是百度飞桨为开发者提供了很好的开发环境和多样化的工具。通过Python API完成全流程使用或集成,提供全面、灵活、开放的深度学习功能,有更高的定制化空间、更低门槛的方式快速完成产业模型部署,并提供了应用层的软件和可视化服务。

在项目进行中也遇到了一些困难。由于不熟悉飞桨框架,训练好模型后进行模型部署时,一开始写接口的时候有些困难。但是感谢飞桨详细的中文文档,帮助我快速入门,并使得模型部署能够顺利开展。

2. 该项目还可以继续改进的地方包括:目前PaddleDetection也新鲜出炉了YOLOv4,可以尝试使用YOLOv4完成检测任务;目前飞桨图像分割套件PaddleSeg更新版本中也发布了车道线分割算法LaneNet,可以使用该模型进行车道线的分割。

3. 另外选择智慧交通这个课题来实现,也是顺应了国家的发展趋势。纵观我国智能交通市场发展历程,可以将其分为五个阶段。

在起步和培育阶段,我国智能交通行业停留在学习和制定研究方案,形成大力发展智能交通系统的共识;在基础阶段,随着北京奥运、上海世博会等重大国际活动的召开,我国开始将智能交通技术进行实际应用,为活动举行提供交通保障,行业初具规模;在近几年,信息技术推动了整个智能交通的理念,技术应用发生创新性变革。

但是,随着人口密度越来越大,交通工具复杂,急需智慧交通利用大数据技术解决城市交通的拥堵和违章等问题。目前的智能交通系统因存在着精度缺失、智能化不足等问题,无法满足复杂交通场景下的实时监管,并且仍需要人力去解读视频信息,无法实现完全自主的智能交通监管。

并且由于技术成本和购买成本的过高,不利于规模化的普及,未来还需加强核心技术研发和产业链升级,降低各方面成本以开拓更为广阔的市场。百度飞桨正提供了有力的工具,可以为智慧交通领域的产业落地发挥重要作用。

作者直播

我们这次有幸请到了本文作者,飞桨开源社区的优秀开发者--“吃豆豆大神”。今晚20:30在B站手把手带大家玩转PaddleX,实现《手势识别控制吃豆豆》、《无人驾驶》、《智慧交通》多个项目。

大家也可以点击文末“阅读原文”或登录以下链接进入直播间:

https://live.bilibili.com/21689802?visit_id=capzodmgb9c

更多资源

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

官网地址:

https://www.paddlepaddle.org.cn

更多PaddleDetection的应用方法,欢迎访问项目地址:

GitHub: 

https://github.com/PaddlePaddle/PaddleDetection

Gitee: 

https://gitee.com/paddlepaddle/PaddleDetection

飞桨开源框架项目地址:

GitHub:

https://github.com/PaddlePaddle/Paddle

Gitee: 

https://gitee.com/paddlepaddle/Paddle

END