Python实现的车辆检测和车辆类型识别

资源下载地址:https://download.csdn.net/download/sheziqiong/88312654
资源下载地址:https://download.csdn.net/download/sheziqiong/88312654

一. PaddleDetection 简介:

官方文档:https://paddledetection.readthedocs.io/

PaddleDetection 创立的目的是为工业界和学术界提供丰富、易用的目标检测模型。不仅性能优越、易于部署,而且能够灵活的满足算法研究的需求。

简而言之就是,该工具使用百度开源的 Paddle 框架,集成了多种图像识别和目标检测框架,并且提供了相应的训练、推理和部署工具,使得用户可以自己 DIY 数据集和模型细节,实现深度学习落地应用的快速部署。

特点:

  • 易部署:PaddleDetection 的模型中使用的核心算子均通过 C++ 或 CUDA 实现,同时基于 PaddlePaddle 的高性能推理引擎可以方便地部署在多种硬件平台上。
  • 高灵活度:PaddleDetection 通过模块化设计来解耦各个组件,基于配置文件可以轻松地搭建各种检测模型。
  • 高性能:基于 PaddlePaddle 框架的高性能内核,在模型训练速度、显存占用上有一定的优势。例如,YOLOv3 的训练速度快于其他框架,在 Tesla V100 16GB 环境下,Mask-RCNN(ResNet50)可以单卡 Batch Size 可以达到 4 (甚至到 5)。

支持的主流模型包括:

并且支持多种拓展特性:

该工具使得开发者只需修改相应的 yml 格式参数文件,即可一键 DIY 并训练自己的模型:

二. 配置环境并安装 Paddle:

(本机配置:1050Ti,CUDA10.0)

安装 anaconda:

创建 python 环境:

conda create -n paddle_env python=3.6


激活环境:

conda activate paddle_env

使用清华源安装依赖库(如 opencv-python,matplotlib,Cython 等):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U 库名 --default-time=1000 --user

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
安装 paddlepaddle:

python -m pip install paddlepaddle-gpu

清华源安装也可以:

进入 python 环境并测试:

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

安装成功~

三. 安装 PaddleDetetion:

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

克隆 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

安装成功~

四. 调试 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 目录下:


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

五. YOLO 系列算法详解:

这一节我们讲一下上面车辆检测使用的算法原理。

这个我之前写过:

【论文阅读笔记】YOLO v1——You Only Look Once: Unified, Real-Time Object Detection:
https://blog.csdn.net/weixin_44936889/article/details/104384273

【论文阅读笔记】YOLO9000: Better, Faster, Stronger:
https://blog.csdn.net/weixin_44936889/article/details/104387529

【论文阅读笔记】YOLOv3: An Incremental Improvement:
https://blog.csdn.net/weixin_44936889/article/details/104390227

这里以车牌检测为例简单复述一下(图是自己画的 hahhh,所以不是很好看的样子):

YOLOv1:

论文地址:https://arxiv.org/pdf/1506.02640.pdf

YOLO 算法采用一个单独的卷积神经网络实现了端到端的的目标检测[3],其算法的基本流程为:首先将输入图片通过双线性插值的方法放缩到统一大小(文中使用 448×448 大小)并划分成互不重叠的网格,然后将放缩后的图像矩阵送入卷积神经网络提取高维语义特征,最后通过全连接层预测每个网格内存在目标的概率,并预测目标的坐标框位置。由于无需 RPN 网络提取感兴趣区域,所以 YOLO 的网络结构十分简洁,如图所示:


即 YOLO 的卷积神经网络(也称之为主干网络)将输入的图片分割成大小相同、互不重叠的单元格,然后每个单元格在卷积提取特征的过程中同时参与计算。提取特征后,每个单元格对应特整层上的特征向量通过全连接层负责去检测那些中心点落在该单元格内的目标,从而输出相应位置存在目标类别的概率和目标的预测坐标,如图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

YOLO 将原图化分车 7×7 的 49 个单元格,主干网络依然采用了分类网络,但最后两层使用了全卷积层,最终输出一个 7×7×30 的特征层,其中每个特征点包含的特征向量代表了每个单元格的特征。这样对于每个区域的特征向量,YOLO 分别使用全连接层输出预测,相应的预测值包括:

  1. 该区域可能包含的相应目标的个坐标框的 4 个预测坐标值(文中 B=2),分别为{x,y,w,h},同时输出这 B 个预测框的置信度,选取置信度最高的那个预测框作为最终的结果;
  2. 该区域可能包含的目标的分类置信度,该置信度记为 C,是一个长度为分类书的概率向量,使用 softmax 函数作为激活函数;

其置信度定义为:


IOU 即相应物体预测框与真值框的交并比。因此每个区域生成 30 个预测值,最后全连接层的输出大小为 S×S×30。这里使用 B 个预选框并生成置信度,是为了使得网络能够在同一个单元格内预测重叠目标,从而提高预测结果的容错率。增大 B 可以提高模型的鲁棒性,但相应的全连接层的计算复杂度也会大大提高。

此外,为了避免使用 Relu 函数激活而造成的特征丢失问题,作者在 YOLO 中将所有的 Relu 改为 Leacky Relu 激活:


最终的网络结构如图所示:

YOLOv2:

论文地址:

YOLO 算法采用网格划分来检测不同区域的目标,但是由于网络结构较为简单,保证检测速度下精度还有很大的提升空间。因此作者在 YOLO 的基础上,使用了批量标准化来规范特征数据分布并加速收敛;使用高分辨率的图像作为分类器的输入,从而提高检测的精度;加入预选框的概念,提高小目标的检测精度。由此提出了一个更为高效的目标检测算法,称之为 YOLO v2。并在此基础上,使用联合训练(Joint Training)算法,能够在有大量分类的图像识别数据集训练目标检测任务(只有分类的 loss 参与梯度下降),由此训练出的 YOLO 9000 能够识别和检测超过 9000 个物体类别。

Batch Normalization 在 Inception V2 中提出的方法,用来替代 ResNet 使用的残差结构,防止梯度消失的问题。该算法将一个批次的特征值矩阵,通过简单的线性变换,转换为均值为 0、方差为 1 的正太分布上,从而使网络中每一层的特征值大体分布一致。因此每层的梯度不会随着网络结构的加深发生太大变化,从而避免发生梯度爆炸或者梯度消失等问题。因此作者在 YOLO 中大量使用了 Batch Normalization,使得相比原来的 YOLO 算法 mAP 上升了 2%。计算过程为:
(1)计算数据的均值 u;
(2)计算数据的方差 σ^2;
(3)通过公式 x’=(x-u)/√(σ^2+ε)标准化数据;
(4)通过公式 y=γx’+β 进行缩放平移;

为了解决预测框对于小目标和重叠目标检测精度缺失的问题,作者不再使用 YOLO 采用网格分割 + 全连接预测坐标的方法,而是采用了跟 SSD、 Faster-RCNN 等相似的预选框的方法。

因此 YOLOv2 中移除了全连接层和最后一个下采样层,来最终得到一个较大的特整层。并且为了使图像最后的预测具有单中心网格,作者使用了 416×416 大小作为输入,下采样参数为 32,最后得到了一个 13×13 大小的特征层;在使用 Anchor Boxes 之后,虽然 mAP 下降了 0.3%,但是召回率从 81% 上升到了 88%。

并且为了融合目标分类需要的高层语义特征和目标检测需要的低层轮廓特征,YOLOv2 还设计了 Pass Through 层,即取出了最后一个池化层的特整层,(大小为 26×26×512),将每个 2×2 局部空间区域转换成通道特征,最后得到了一个 13×13×4048 的用于预测的特征层。

作者在训练时采用了 32 倍数的输入大小为,分别为:320,352,…,608,每 10 个 epoch 重新随机选取一个输入大小;

YOLOv3:

YOLOv3 在网络结构上并没有太大改动,主要是将 YOLOv2 提出后目标检测领域提出的一些模型结构和训练技巧融合到了 YOLO 框架中。

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


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

在特征金字塔中,YOLOv3 共选出了 3 个通过反卷积得到的特征层去检测不同大小的物体,这三个特征层大小分别为:13,26,52。特征金字塔使用卷积网络生成的金字塔型的特征层(左),生成一个融合了高度语义信息和低维特征信息的特征金字塔(右),再在这些特征金字塔的不同层上,使用不共享权重的不同卷积层预测目标的类别和检测框坐标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

六. 检测自己的数据:

这里我写了一个调用 PaddleDetection 车辆检测模型的程序,源码地址:https://github.com/Sharpiless/yolov3-vehicle-detection-paddle

点一个然后下载解压:


这里我使用 VSCode,选择好配置的环境:

测试图片:

将图片路径修改为自己的路径即可:

运行 demo_img.py:

测试视频:

将图片视频修改为自己的路径即可:

七. 使用 X2Paddle 进行模型转换:

(下面只是演示一下如何使用 X2Paddle 进行模型转换,感兴趣的同学可以试一下)

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

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

X2Paddle 源码地址:https://github.com/PaddlePaddle/X2Paddle

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

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

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

下载 torch 源码:

源码地址:https://github.com/Sharpiless/Paddle-Car-type-recognition

点然后下载解压:

下载权重文件,放到 src 文件夹下面:

链接:https://pan.baidu.com/s/1fBwOr9PM9S7LmCgRddX0Gg

提取码:pv6e

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

然后运行:

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


可以看到生成了相应的 Paddle 模型;

资源下载地址:https://download.csdn.net/download/sheziqiong/88312654
资源下载地址:https://download.csdn.net/download/sheziqiong/88312654

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值