实验:PaddleDetection目标检测
2024-01-03 07:56:53

img

实验:PaddleDetection目标检测

目标检测原理

目标检测是计算机视觉领域的一项核心技术,用于在图像或视频中找到并识别出感兴趣的物体。目标检测的任务可以分为单目标检测和多目标检测。

步骤:

  1. 问题定义:目标检测的目标是从图像或视频中准确地定位和标识出物体。任务可以分为单目标检测(寻找一个物体)和多目标检测(寻找多个物体)。

  2. 数据收集和标注:为了训练模型,需要一个包含物体位置和类别的标记数据集。标注通常以边界框表示物体的位置,并包括类别标签,这需要专家或众包人员进行。

  3. 模型架构选择:目标检测依赖于各种深度学习架构,如Faster R-CNN、YOLO和SSD。这些模型在准确性和处理速度之间进行权衡,选择适合任务需求的架构。

  4. 训练模型:模型训练分为两个主要部分:区域建议和目标分类与位置调整。在区域建议阶段,模型提出可能包含物体的候选区域。在分类和位置调整阶段,模型对这些区域进行分类并微调边界框以更准确地围绕物体。

  5. 模型推理:训练完成的模型可以应用于新图像以进行目标检测。模型生成候选框,并为每个框提供类别和置信度分数。

  6. 后处理:推理后,使用后处理技术来消除重叠的边界框并提高结果的稳定性。非极大值抑制(NMS)是常用的后处理方法。

  7. 评估和优化:使用评估指标(如精度、召回率、mAP等)来衡量模型性能。根据结果进行模型优化,可能涉及超参数调整、数据增强等。

    1693127927314

  8. 实际应用:训练完成的模型可以在实际场景中进行应用,例如自动驾驶、安防监控、医学图像分析等。

PaddleDetection简介

PaddleDetection是一个基于PaddlePaddle深度学习框架开发的目标检测工具集。它提供了一系列预训练的目标检测模型和相关工具,使开发者能够快速构建、训练和部署目标检测模型,用于识别图像或视频中的不同目标对象。

PaddleDetection的主要特点和功能包括:

  1. 多种模型架构:PaddleDetection支持多种流行的目标检测模型,如Faster R-CNN、YOLO、SSD等,以满足不同应用场景的需求。
  2. 丰富的预训练模型:工具集中提供了多个预训练的目标检测模型,这些模型在大规模数据上进行了训练,可以用作基准或快速的迁移学习。
  3. 灵活的训练流程:PaddleDetection允许用户自定义训练流程,包括数据预处理、模型选择、训练超参数等,以便根据具体任务进行优化。
  4. 高性能推理:训练完成的模型可以在不同硬件设备上进行高性能推理,用于实时的目标检测应用。
  5. 完整的工具集:PaddleDetection不仅提供了训练和推理功能,还包括了数据集的处理、模型评估、可视化等工具,使整个目标检测流程更加完整和便捷。
  6. 社区支持:PaddleDetection作为PaddlePaddle深度学习框架的一部分,得到了PaddlePaddle社区的支持,可以从社区中获取技术支持和资源。

主要模型效果示例:

1693127585047

PaddleDetection主要特性

  1. 模块化设计:PaddleDetection采用模块化设计,将检测模型解耦为不同的模块组件。通过自定义组件的组合,用户能够高效地构建检测模型,实现个性化的搭建过程。
  2. 丰富的模型库:PaddleDetection提供广泛的算法基准和预训练模型,覆盖2D/3D目标检测、实例分割、人脸检测、关键点检测、多目标跟踪、半监督学习等多个领域,为各类任务提供多种可选模型。
  3. 产业特色模型与工具:PaddleDetection专注于产业级应用,提供针对通用、高频垂类应用场景的特色模型,如PP-YOLOE+、PP-PicoDet、PP-TinyPose、PP-HumanV2、PP-Vehicle等。同时,还提供高度集成的分析工具,降低开发者的试错和选择成本。
  4. 产业级部署实践:PaddleDetection整理了工业、农业、林业、交通、医疗、金融、能源电力等多个领域的AI应用范例。通过从数据标注到模型训练再到模型调优和预测部署的完整流程,降低目标检测技术在产业应用中的门槛。

PaddleDetection安装

1、安装PaddlePaddle

1
2
3
4
5
# CUDA10.2
python -m pip install paddlepaddle-gpu==2.3.2 -i https://mirror.baidu.com/pypi/simple

# CPU
python -m pip install paddlepaddle==2.3.2 -i https://mirror.baidu.com/pypi/simple

请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。

1
2
3
4
5
6
# 在您的Python解释器中确认PaddlePaddle安装成功
>>> import paddle
>>> paddle.utils.run_check()

# 确认PaddlePaddle版本
python -c "import paddle; print(paddle.__version__)"

注意: 如果您希望在多卡环境下使用PaddleDetection,请首先安装NCCL

2、安装PaddleDetection

注意: pip安装方式只支持Python3

1
2
3
4
5
6
7
8
9
# 克隆PaddleDetection仓库
git clone https://gitee.com/PaddlePaddle/PaddleDetection.git

# 安装其他依赖
cd PaddleDetection
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple

# 编译安装paddledet
python setup.py install

3、测试是否安装成功

1
python ppdet/modeling/tests/test_architectures.py

测试通过后会提示如下信息:

1
2
3
4
.......
----------------------------------------------------------------------
Ran 7 tests in 12.816s
OK

4、快速体验

您已经成功安装了PaddleDetection,接下来快速体验目标检测效果。

1
2
3
4
5
# 在GPU上预测一张图片
set CUDA_VISIBLE_DEVICES=0

# 执行推理命令
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=true weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg

这条命令是用于在PaddleDetection中进行推理(即使用训练好的模型进行预测)的。它会使用指定的配置文件和权重文件来对一张图像进行目标检测。下面我将对这个命令进行解释:

  • python tools/infer.py:这是启动PaddleDetection的推理脚本的命令。
  • -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml:使用指定的配置文件,其中 -c 表示配置文件的路径。在这里,它选择了一个预先定义好的模型配置文件 ppyolo_r50vd_dcn_1x_coco.yml,该配置文件描述了使用的模型结构、超参数等信息。
  • -o use_gpu=true:这是传递给脚本的一个选项,用于指定是否使用GPU进行推理。在这里,它指定了使用GPU进行推理。
  • weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams:这是权重文件的链接。模型在推理之前需要加载权重文件,这里通过URL指定了下载地址。权重文件包含了模型在训练过程中学习到的参数。
  • --infer_img=demo/000000014439.jpg:这是指定要进行推理的图像。--infer_img 表示指定要推理的图像,后面跟着图像的路径。

会在output文件夹下生成一个画有预测结果的同名图像。

结果如下图:

000000014439[1]

快速开始

1、准备数据

数据集参考Kaggle数据集 ,包含877张图像,数据类别4类:crosswalk,speedlimit,stop,trafficlight。 将数据划分为训练集701张图和测试集176张图,下载链接.

1
2
# 注意:可跳过这步下载,后面训练会自动下载
python dataset/roadsign_voc/download_roadsign_voc.py

2、训练、评估、预测

1、训练

1
2
3
4
5
6
# 边训练边测试 CPU需要约1小时(use_gpu=false),1080Ti GPU需要约10分钟
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置),这里设置使用gpu
# --eval 参数表示边训练边评估,最后会自动保存一个名为model_final.pdparams的模型

python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --eval -o use_gpu=true

如果想通过VisualDL实时观察loss变化曲线,在训练命令中添加–use_vdl=true,以及通过–vdl_log_dir设置日志保存路径。

但注意VisualDL需Python>=3.5

首先安装VisualDL

1
python -m pip install visualdl -i https://mirror.baidu.com/pypi/simple
1
2
3
4
python -u tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
--use_vdl=true \
--vdl_log_dir=vdl_dir/scalar \
--eval

2、评估

1
2
3
4
5
6
# 评估 默认使用训练过程中保存的model_final.pdparams
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置)
# 目前只支持单卡评估

python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true

最终模型精度在mAP=0.85左右,由于数据集较小因此每次训练结束后精度会有一定波动

3、预测

1
2
3
4
5
6
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置)
# --infer_img 参数指定预测图像路径
# 预测结束后会在output文件夹中生成一张画有预测结果的同名图像

python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true --infer_img=demo/road554.png

python部署

在PaddlePaddle框架中,为了在预测和训练阶段获得最佳性能,我们针对底层引擎采用了不同的优化策略。在预测阶段,我们采用了专门针对推理任务优化的AnalysisPredictor,这是一个基于C++预测库的Python接口。通过该引擎,我们能够对模型进行多项图优化,从而显著减少不必要的内存拷贝,以满足对性能的高要求。

若您在部署经过训练的模型时对性能有较高的追求,我们提供了独立于PaddleDetection的预测脚本,使您能够方便地集成部署。

Python端预测部署主要分为以下两个步骤:

  1. 导出预测模型。
  2. 使用Python进行预测。

1. 导出预测模型

PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:导出模型,例如

1
2
3
# 导出YOLOv3检测模型
python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml --output_dir=./inference_model \
-o weights=https://paddledet.bj.bcebos.com/models/yolov3_darknet53_270e_coco.pdparams

导出后目录下,包括infer_cfg.yml, model.pdiparams, model.pdiparams.info, model.pdmodel四个文件。

关于导出的文件格式,我要说说:

百度飞桨(PaddlePaddle)是一个支持动态图和静态图两种计算图模式的深度学习框架。这两种模式针对不同的需求和场景,提供了不同的优势和特点。

  1. 动态图模式
    • 特点:在动态图模式下,类似于Python编程一样,您可以按照自然顺序逐步构建计算图,同时查看中间变量的值。这种模式更适合快速的原型设计、实验和调试,因为它更灵活,方便调试问题和进行交互式开发。
    • 优势:适用于动态结构、数据迭代、复杂控制流等场景。更适合从零开始构建模型或在模型结构上进行频繁的更改。
    • 适用情况:研究人员、初学者、需要频繁尝试不同模型架构的场景。
  2. 静态图模式
    • 特点:在静态图模式下,您首先定义整个计算图的结构,然后将数据传递给图进行计算。这种模式在图构建后会进行优化,可以获得更好的性能。
    • 优势:适用于高性能训练、模型优化和部署。由于图的结构在构建后不会变化,因此可以进行更多的优化,如图剪枝和融合操作。
    • 适用情况:需要最大化性能和效率的场景,例如大规模训练和生产环境。

在飞桨2.0版本之后,飞桨的动态图和静态图模式已经更加统一,称为“动静统一模式”。在这种模式下,用户可以在动态图和静态图之间无缝切换,以适应不同的需求。这使得用户可以在开发阶段使用动态图进行快速的原型设计和调试,然后在训练和部署时切换到静态图以获得更好的性能。

动态图和静态图之间的切换确实涉及将部分Python代码转换为类似C语言的静态计算图表示,但它不仅仅是Python到C语言的简单转换。

在动静统一模式下,动态图可以类比为Python执行模式,而静态图可以类比为C语言编译模式。在动态图执行中,您可以像使用Python一样逐行构建和执行计算,这使得原型设计和调试更加容易。但动态图可能会在一些性能优化方面受到限制。

当切换到静态图时,框架会将动态图中的操作和逻辑转换为一个静态的计算图,类似于将Python代码编译成一个更优化的表示形式。这个静态图的构建是在运行前进行的,通过图的优化,可以获得更高的性能和效率。而这种静态图表示更接近底层硬件执行,类似于C语言代码。

然而,需要明确的是,这个转换不是简单的Python到C语言的翻译。飞桨内部实现了计算图构建、优化和执行的各个环节,确保了高效的硬件利用和优化。因此,虽然在静态图模式下会进行类似于编译的优化,但这仍然是在飞桨框架的内部实现层面进行的,用户不需要手动编写C语言代码。

2. 基于Python的预测

1
python deploy/python/infer.py --model_dir=./output_inference/yolov3_darknet53_270e_coco --image_file=./demo/000000014439.jpg --device=GPU

参数说明如下:

参数 是否必须 含义
–model_dir Yes 上述导出的模型路径
–image_file Option 需要预测的图片
–image_dir Option 要预测的图片文件夹路径
–video_file Option 需要预测的视频
–camera_id Option 用来预测的摄像头ID,默认为-1(表示不使用摄像头预测,可设置为:0 - (摄像头数目-1) ),预测过程中在可视化界面按q退出输出预测结果到:output/output.mp4
–device Option 运行时的设备,可选择CPU/GPU/XPU,默认为CPU
–run_mode Option 使用GPU时,默认为paddle, 可选(paddle/trt_fp32/trt_fp16/trt_int8)
–batch_size Option 预测时的batch size,在指定image_dir时有效,默认为1
–threshold Option 预测得分的阈值,默认为0.5
–output_dir Option 可视化结果保存的根目录,默认为output/
–run_benchmark Option 是否运行benchmark,同时需指定--image_file--image_dir,默认为False
–enable_mkldnn Option CPU预测中是否开启MKLDNN加速,默认为False
–cpu_threads Option 设置cpu线程数,默认为1
–trt_calib_mode Option TensorRT是否使用校准功能,默认为False。使用TensorRT的int8功能时,需设置为True,使用PaddleSlim量化后的模型时需要设置为False
–save_images Option 是否保存可视化结果
–save_results Option 是否在文件夹下将图片的预测结果以JSON的形式保存