
资源下载地址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(本机配置1050TiCUDA10.0安装 anaconda创建 python 环境conda create-npaddle_envpython3.6激活环境conda activate paddle_env使用清华源安装依赖库如 opencv-pythonmatplotlib,Cython 等pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple-U库名 --default-time1000--user安装 paddlepaddlepython-mpipinstallpaddlepaddle-gpu清华源安装也可以进入 python 环境并测试pythonimportpaddle.fluid as fluidfluid.install_check.run_check()安装成功~三. 安装 PaddleDetetion新建一个文件夹在该目录激活环境克隆 PaddleDetection 模型库gitclone https://github.com/PaddlePaddle/PaddleDetection.git再次安装依赖库pipinstall-rrequirements.txt指定当前 Python 路径然后测试setPYTHONPATH%PYTHONPATH%;.python ppdet/modeling/tests/test_architectures.py安装成功~四. 调试 YOLOv3 代码安装 cocotoolspipinstallgithttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI下载模型的权重文件地址https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/featured_model/CONTRIB_cn.md解压到文件目录检测这里的几张图片python-utools/infer.py-ccontrib/VehicleDetection/vehicle_yolov3_darknet.yml\-oweightsvehicle_yolov3_darknet\--infer_dircontrib/VehicleDetection/demo\--draw_threshold0.2\--output_dircontrib/VehicleDetection/demo/output检测结果保存在 contrib\VehicleDetection\demo 目录下可以看到检测效果非常好~五. YOLO 系列算法详解这一节我们讲一下上面车辆检测使用的算法原理。这个我之前写过【论文阅读笔记】YOLO v1——You Only Look Once: Unified, Real-Time Object Detectionhttps://blog.csdn.net/weixin_44936889/article/details/104384273【论文阅读笔记】YOLO9000: Better, Faster, Strongerhttps://blog.csdn.net/weixin_44936889/article/details/104387529【论文阅读笔记】YOLOv3: An Incremental Improvementhttps://blog.csdn.net/weixin_44936889/article/details/104390227这里以车牌检测为例简单复述一下图是自己画的 hahhh所以不是很好看的样子YOLOv1论文地址https://arxiv.org/pdf/1506.02640.pdfYOLO 算法采用一个单独的卷积神经网络实现了端到端的的目标检测[3]其算法的基本流程为首先将输入图片通过双线性插值的方法放缩到统一大小文中使用 448×448 大小并划分成互不重叠的网格然后将放缩后的图像矩阵送入卷积神经网络提取高维语义特征最后通过全连接层预测每个网格内存在目标的概率并预测目标的坐标框位置。由于无需 RPN 网络提取感兴趣区域所以 YOLO 的网络结构十分简洁如图所示即 YOLO 的卷积神经网络也称之为主干网络将输入的图片分割成大小相同、互不重叠的单元格然后每个单元格在卷积提取特征的过程中同时参与计算。提取特征后每个单元格对应特整层上的特征向量通过全连接层负责去检测那些中心点落在该单元格内的目标从而输出相应位置存在目标类别的概率和目标的预测坐标如图所示YOLO 将原图化分车 7×7 的 49 个单元格主干网络依然采用了分类网络但最后两层使用了全卷积层最终输出一个 7×7×30 的特征层其中每个特征点包含的特征向量代表了每个单元格的特征。这样对于每个区域的特征向量YOLO 分别使用全连接层输出预测相应的预测值包括该区域可能包含的相应目标的个坐标框的 4 个预测坐标值文中 B2分别为{x,y,w,h}同时输出这 B 个预测框的置信度选取置信度最高的那个预测框作为最终的结果该区域可能包含的目标的分类置信度该置信度记为 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计算数据的均值 u2计算数据的方差 σ^23通过公式 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 重新随机选取一个输入大小YOLOv3YOLOv3 在网络结构上并没有太大改动主要是将 YOLOv2 提出后目标检测领域提出的一些模型结构和训练技巧融合到了 YOLO 框架中。作者首先在主干网络 DarkNet-19 的基础上加入了残差结构使得它在 ImageNet 上的表现跟 ResNet-101 相差无几但是处理速度却快得多。此外 YOLOv3 中每个单元格对应使用了三个不同比率和大小的预选框并且还构建了跟 FPN 目标检测算法相似的特征金字塔利用不同大小、不同深度的特整层进行不同大小目标的预测。在特征金字塔中YOLOv3 共选出了 3 个通过反卷积得到的特征层去检测不同大小的物体这三个特征层大小分别为132652。特征金字塔使用卷积网络生成的金字塔型的特征层左生成一个融合了高度语义信息和低维特征信息的特征金字塔右再在这些特征金字塔的不同层上使用不共享权重的不同卷积层预测目标的类别和检测框坐标六. 检测自己的数据这里我写了一个调用 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--frameworkonnx--modelclassifier.onnx--save_dirpd_model可以看到生成了相应的 Paddle 模型资源下载地址https://download.csdn.net/download/sheziqiong/88312654资源下载地址https://download.csdn.net/download/sheziqiong/88312654