实验:PaddleDetection目标检测
目标检测原理
目标检测是计算机视觉领域的一项核心技术,用于在图像或视频中找到并识别出感兴趣的物体。目标检测的任务可以分为单目标检测和多目标检测。
步骤:
问题定义:目标检测的目标是从图像或视频中准确地定位和标识出物体。任务可以分为单目标检测(寻找一个物体)和多目标检测(寻找多个物体)。
数据收集和标注:为了训练模型,需要一个包含物体位置和类别的标记数据集。标注通常以边界框表示物体的位置,并包括类别标签,这需要专家或众包人员进行。
模型架构选择:目标检测依赖于各种深度学习架构,如Faster R-CNN、YOLO和SSD。这些模型在准确性和处理速度之间进行权衡,选择适合任务需求的架构。
训练模型:模型训练分为两个主要部分:区域建议和目标分类与位置调整。在区域建议阶段,模型提出可能包含物体的候选区域。在分类和位置调整阶段,模型对这些区域进行分类并微调边界框以更准确地围绕物体。
模型推理:训练完成的模型可以应用于新图像以进行目标检测。模型生成候选框,并为每个框提供类别和置信度分数。
后处理:推理后,使用后处理技术来消除重叠的边界框并提高结果的稳定性。非极大值抑制(NMS)是常用的后处理方法。
评估和优化:使用评估指标(如精度、召回率、mAP等)来衡量模型性能。根据结果进行模型优化,可能涉及超参数调整、数据增强等。
实际应用:训练完成的模型可以在实际场景中进行应用,例如自动驾驶、安防监控、医学图像分析等。
PaddleDetection简介
PaddleDetection是一个基于PaddlePaddle深度学习框架开发的目标检测工具集。它提供了一系列预训练的目标检测模型和相关工具,使开发者能够快速构建、训练和部署目标检测模型,用于识别图像或视频中的不同目标对象。
PaddleDetection的主要特点和功能包括:
- 多种模型架构:PaddleDetection支持多种流行的目标检测模型,如Faster R-CNN、YOLO、SSD等,以满足不同应用场景的需求。
- 丰富的预训练模型:工具集中提供了多个预训练的目标检测模型,这些模型在大规模数据上进行了训练,可以用作基准或快速的迁移学习。
- 灵活的训练流程:PaddleDetection允许用户自定义训练流程,包括数据预处理、模型选择、训练超参数等,以便根据具体任务进行优化。
- 高性能推理:训练完成的模型可以在不同硬件设备上进行高性能推理,用于实时的目标检测应用。
- 完整的工具集:PaddleDetection不仅提供了训练和推理功能,还包括了数据集的处理、模型评估、可视化等工具,使整个目标检测流程更加完整和便捷。
- 社区支持:PaddleDetection作为PaddlePaddle深度学习框架的一部分,得到了PaddlePaddle社区的支持,可以从社区中获取技术支持和资源。
主要模型效果示例:
PaddleDetection主要特性
- 模块化设计:PaddleDetection采用模块化设计,将检测模型解耦为不同的模块组件。通过自定义组件的组合,用户能够高效地构建检测模型,实现个性化的搭建过程。
- 丰富的模型库:PaddleDetection提供广泛的算法基准和预训练模型,覆盖2D/3D目标检测、实例分割、人脸检测、关键点检测、多目标跟踪、半监督学习等多个领域,为各类任务提供多种可选模型。
- 产业特色模型与工具:PaddleDetection专注于产业级应用,提供针对通用、高频垂类应用场景的特色模型,如PP-YOLOE+、PP-PicoDet、PP-TinyPose、PP-HumanV2、PP-Vehicle等。同时,还提供高度集成的分析工具,降低开发者的试错和选择成本。
- 产业级部署实践:PaddleDetection整理了工业、农业、林业、交通、医疗、金融、能源电力等多个领域的AI应用范例。通过从数据标注到模型训练再到模型调优和预测部署的完整流程,降低目标检测技术在产业应用中的门槛。
PaddleDetection安装
1、安装PaddlePaddle
1 | # CUDA10.2 |
- 更多CUDA版本或环境快速安装,请参考PaddlePaddle快速安装文档
- 更多安装方式例如conda或源码编译安装方法,请参考PaddlePaddle安装文档
请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。
1 | # 在您的Python解释器中确认PaddlePaddle安装成功 |
注意: 如果您希望在多卡环境下使用PaddleDetection,请首先安装NCCL
2、安装PaddleDetection
注意: pip安装方式只支持Python3
1 | # 克隆PaddleDetection仓库 |
3、测试是否安装成功
1 | python ppdet/modeling/tests/test_architectures.py |
测试通过后会提示如下信息:
1 | ....... |
4、快速体验
您已经成功安装了PaddleDetection,接下来快速体验目标检测效果。
1 | # 在GPU上预测一张图片 |
这条命令是用于在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
文件夹下生成一个画有预测结果的同名图像。
结果如下图:
快速开始
1、准备数据
数据集参考Kaggle数据集 ,包含877张图像,数据类别4类:crosswalk,speedlimit,stop,trafficlight。 将数据划分为训练集701张图和测试集176张图,下载链接.
1 | # 注意:可跳过这步下载,后面训练会自动下载 |
2、训练、评估、预测
1、训练
1 | # 边训练边测试 CPU需要约1小时(use_gpu=false),1080Ti GPU需要约10分钟 |
如果想通过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 | python -u tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \ |
2、评估
1 | # 评估 默认使用训练过程中保存的model_final.pdparams |
最终模型精度在mAP=0.85左右,由于数据集较小因此每次训练结束后精度会有一定波动
3、预测
1 | # -c 参数表示指定使用哪个配置文件 |
python部署
在PaddlePaddle框架中,为了在预测和训练阶段获得最佳性能,我们针对底层引擎采用了不同的优化策略。在预测阶段,我们采用了专门针对推理任务优化的AnalysisPredictor,这是一个基于C++预测库的Python接口。通过该引擎,我们能够对模型进行多项图优化,从而显著减少不必要的内存拷贝,以满足对性能的高要求。
若您在部署经过训练的模型时对性能有较高的追求,我们提供了独立于PaddleDetection的预测脚本,使您能够方便地集成部署。
Python端预测部署主要分为以下两个步骤:
- 导出预测模型。
- 使用Python进行预测。
1. 导出预测模型
PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:导出模型,例如
1 | # 导出YOLOv3检测模型 |
导出后目录下,包括infer_cfg.yml
, model.pdiparams
, model.pdiparams.info
, model.pdmodel
四个文件。
关于导出的文件格式,我要说说:
百度飞桨(PaddlePaddle)是一个支持动态图和静态图两种计算图模式的深度学习框架。这两种模式针对不同的需求和场景,提供了不同的优势和特点。
- 动态图模式:
- 特点:在动态图模式下,类似于Python编程一样,您可以按照自然顺序逐步构建计算图,同时查看中间变量的值。这种模式更适合快速的原型设计、实验和调试,因为它更灵活,方便调试问题和进行交互式开发。
- 优势:适用于动态结构、数据迭代、复杂控制流等场景。更适合从零开始构建模型或在模型结构上进行频繁的更改。
- 适用情况:研究人员、初学者、需要频繁尝试不同模型架构的场景。
- 静态图模式:
- 特点:在静态图模式下,您首先定义整个计算图的结构,然后将数据传递给图进行计算。这种模式在图构建后会进行优化,可以获得更好的性能。
- 优势:适用于高性能训练、模型优化和部署。由于图的结构在构建后不会变化,因此可以进行更多的优化,如图剪枝和融合操作。
- 适用情况:需要最大化性能和效率的场景,例如大规模训练和生产环境。
在飞桨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的形式保存 |