【项目014】基于深度学习的路标识别(学生版) 显示答案 | 返回首页

作者:欧新宇(Xinyu OU)
当前版本:Release v2.0
开发平台:PaddlePaddle 3.0.0beta2, PaddleDetection-release-2.8
运行环境:Intel Core i7-13700KF CPU 3.4GHz, nVidia GeForce RTX 4080
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2025年1月28日


为了便于可视化,本项目建议使用 终端 模式进行运行,然后再把结果复制回 .ipynb 文档。鉴于部分图片无法正常显示,可参考课程网站中的完整版 【项目014】基于深度学习的路标识别(学生版)。

路标识别是自动驾驶汽车能安全运行在道路上的前提,本项目基于PaddleDetection工具包及若干个深度学习目标检测模型进行实现,数据集可以从百度AIStudio进行下载,链接地址如下:
URL: https://aistudio.baidu.com/aistudio/datasetdetail/127202

【实验目的】

  1. 熟练掌握基于深度学习的目标检测的基本流程
  2. 学会使用飞桨PaddleDetection工具包完成目标检测任务
  3. 基本掌握目标检测两种常用数据集格式(voc和coco)的区别和使用方法,能够编写python代码构造自己的数据集
  4. 能够灵活利用飞桨PaddleDetection工具包中的内置模型库,构造自定义任务脚本 !important
  5. 进一步熟练掌握目标检测四个数据子集的构造和使用,包括训练集(train)、验证集(val)、测试集(test)和训练验证集(trainval)
  6. 能够利用训练好的模型输出验证集和测试集的平均精度(Average Precision)和平均召回率(Average Recall),以及各类别的平均精度(Average Precision)。
  7. 初步理解PR曲线的概念,并能够编写代码绘制PR曲线
  8. 进一步熟练使用 Markdwon 语法和 Jupyter Notebook 进行实验报告撰写

【实验要求】

  1. 根据本任务书完成 任务一任务六 的操作,并将运行结果和生成的文件,提交到百度飞桨平台,要求包含 config/roadsign 目录和 output/roadsign 目录下的所有文件
  2. 至少完成 任务五 - 第 5.3 节 中3-4个模型的训练和结果输出,并根据该 实验结果表 的数据给出实验结果分析
  3. 完成本实验报告的撰写,并将包含运行程序结果的 .ipynb 文件提交到百度飞桨平台

【任务一】Windows工程环境的设置

任务描述: 在本地计算机及百度AIStudio中配置和部署用于目标检测的相关文件夹和文件。
任务要求:
1.能够充分理解项目部署规范性的重要性;
2.能够根据需要完成必要文件夹的创建,并将相关文件保存到指定文件夹。

为了便于项目管理,本课程所有环境都按照统一规范进行设置,详细内容请参考 【项目002】 Python机器学习环境安装和配置。

Project014RoadSignDetection

如上图所示,我们在 PaddleDetecion-release-2.8 的目录中可以看到多个不同功能的文件夹,其中 configs 保存了预制的多个经典模型,包括faster_rcnn, yolov3, ppyolo等;tools 文件夹中保存了PaddleDetection工具用于训练验证推理等功能的可执行文件,output 文件夹用于保存生成的模型和预测结果等文件。此外,我们需要在根目录下创建 dataset 文件夹用于保存下载的数据集。此外,建议先在 PaddleDetection/configs 目录下创建项目文件夹 roadsign。之后还需要将相关的模型配置文件从内置模型库文件夹中拷贝至路径下(【任务四】)。

PS: 【任务一】只需要阅读了解即可,不需要做额外的操作。


【任务二】PaddleDetection环境的安装与调试

任务描述: 与基于 PaddlePaddle 的分类识别不同,目标检测还需要另外一个封装好的工具包 PaddleDetection 的辅助才能完成。该任务的主要工作是安装PaddleDetection工具包,并解决安装过程中遇到的各种问题。
任务要求:

  1. 学会在安装好PaddlePaddle的Windows系统中安装PaddleDetection工具包;
  2. 学会在百度AIStudio中安装PaddleDetection工具包;
  3. 能够解决PaddleDetecion安装过程中遇到的各种问题;
  4. 能够通过测试判断PaddleDetection是否被正确安装。

2.1 PaddleDetection的下载

  1. 从官网下载PaddleDetection(当前最新版v2.8)https://github.com/PaddlePaddle/PaddleDetection
  2. 在Windows中,可以解压 PaddleDetection-release-2.8.zip 工具包到项目文件夹 MyProjects,实现方法有两种:
    1). 使用Windows文件管理方法进行解压,并将文件夹名改为 DetectionRoadSign(便于项目管理)或直接使用带版本的命名 PaddleDetection-release-2.8(便于版本管理),本教案使用后者进行实现。
    2). 使用下列Python代码实现解压
import os
import zipfile

# 设置工作路径
workspace = 'D:\\Workspace\\MyProjects'
if not os.path.exists(workspace):
    os.makedirs(workspace)
os.chdir(workspace)

# 将PaddleDetection解压到工作路径的更目录
f = zipfile.ZipFile('D:\Workspace\安装包\Paddle\PaddleDetection-release-2.4.zip', 'r')
for file in f.namelist():
    f.extract(file, './')
f.close()
  1. 在百度AIStudio中,首先将 PaddleDetection-release-2.8.zip 工具包上传到服务器,然后再拷该 .zip 文件到指定的工作路径 \home\aistudio\work 后,直接点击右键进行解压。此外,也可以执行以下 base 代码实现解压。
>> unzip -o /home/aistudio/PaddleDetection-release-2.8.zip -d /home/aistudio/work/

PS: 本教学环境已完成 PaddleDetection 环境的下载和解压,同时已经完成任务文件夹 configs/roadsign 的创建。

2.2 PaddleDetection的安装

本例给出PaddleDetection的具体安装配置方法,完整的安装请参考 【项目002】Python机器学习环境的安装和配置。 通常,PaddleDetection环境的安装只需要执行一次,确认服务器或本地环境已经具备相关依赖文件后,可跳过该步。 但AIStudio 每次启动服务器都需要重新安装,除非你已经完成了持久化安装。

  1. 无论是 Windows 还是 AIStudio,均使用如下命令进行安装:
>> pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
>> python setup.py install
  1. 安装成功将得到如下提示:

Finished processing dependencies for paddledet==2.8.0

  1. 特别提示:

此处,建议先执行下列第三方库的手动安装再运行setup.py
pip install motmetrics -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pycocotools -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install lap -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install imgaug -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install motmetrics -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install terminaltables -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install terminaltables -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install op>encv-python -i https://mirrors.aliyun.com/pypi/simple
pip install opencv-contrib-python -i https://mirrors.aliyun.com/pypi/simple

2.3 PaddleDetection的测试

为了验证安装的正确性,安装完成后最好进行一定能的测试,以确认 PaddleDetection 是否安装成功。测试代码如下。

>> python ppdet/modeling/tests/test_architectures.py

若能输出以下提示,则说明测试验证通过。

Ran 7 tests in 12.816s
OK

【任务三】数据准备

任务描述: 下载路标识别数据集,并按规范解压到指定目录,用于后续的训练、评估和预测。
任务要求:

  1. 任意从coco或voc两种标签模式中选择一种用于训练;
  2. 观察并熟悉两种数据标注结构的基本方法,能够理解并看懂基于voc标注的xml文件和基于coco标注的json文件;
  3. 能够对数据标注进行简单的可视化分析。

3.1 数据集下载

本项目使用 road-sign-detection 的比赛数据。该数据集包含877张图片,被划分为 speedlimit, crosswalk, trafficligh, stop 四个类别。为了便于公平评估,我们已经将数据集按照[8:2]的比例进行划分,其中训练集701张图、测试集176张图。本课程提供voc格式和coco格式的数据标签,已发布至百度AIStudio平台,URL: https://aistudio.baidu.com/aistudio/datasetdetail/127202

备注: voc格式和coco格式是目标检测数据集常用的两种数据标注格式,前者使用xml定义样本的标注,每个样本都包含一个xml文件;后者使用json文件定义标注,所有样本都保存在一个json文件中。关于这两种格式,可以参考 【项目021】Pascal VOC和MSCOCO数据集简介

3.2 数据集解压

要求按照【任务一】中的说明,将下载好 RoadSign 数据集解压到 ExpDatasets\dataset(Windows) 或 work/dataset(AIStudio) 目录中。


【任务四】配置文件的准备

任务描述: 飞桨PaddlePaddle提供了强大的自定义开发环境,但对于目标检测任务,我们通常使用PaddleDetection工具包来完成模型的训练和推理会更方便一些。为了更好地使用该工具包,我们需要对PaddleDetection的基本工作流程有较为清楚的了解。本任务的目标是,通过实际操作,掌握PaddleDetection的基本工作流程,并能够根据实际需求,基于PaddleDetection完成自定义模型的训练和推理。

任务要求:

  1. 能够按照规范完成多个不同模型(包括FasterRCNN, yolov3, ppyolo)所有配置文件的组合,并保存在指定的项目文件夹;
  2. 能够根据数据集和项目的实际情况,正确修改相关配置文件;
  3. 能够完成FasterRCNN, yolov3和ppyolo模型的训练,并解决训练过程中可能出现的常见问题。

4.1 配置文件简介

PaddleDetection的模型都是基于yaml文件完成配置,在不对模型进行修改的时候,只需要设置yaml中的超参数即可完成快速的训练和部署。此处,为避免不可恢复错误,要求按照【任务一】的说明,,复制原版配置文件到项目文件夹 configs/roadsign 后,再对副本配置文件进行修改。在本项目的 [教学版] 中,我们给出十种相对简单的模型,用于实验对比。本教案中,我们针对其中的模型 D. faster_rcnn_r50_fpn_1x_coco 进行介绍。这十种模型具体包括:

在以上各版本的模型中,各参数含义描述如下:

下面以 faster_rcnn_r50_fpn_1x_coco.yml为例子,说明PaddleDetection关键超参数配置文件的组成和相互之间的逻辑关系,如下图所示:

4.2 配置文件准备

本项目在配置模型超参数时,需要先需要复制/创建如下文件:

  1. PaddleDetecion-release-2.8/configs 目录下创建项目文件夹 RoadSign
  2. configs/faster_rcnn 文件夹中拷贝项目配置文件 faster_rcnn_r50_fpn_1x_coco.yml 文件至 configs/RoadSign 文件夹。
  3. configs/faster_rcnn/_base_ 文件夹中拷贝下列文件至 configs/RoadSign/_base_ 文件夹,包括:faster_rcnn_r50_fpn.yml, faster_fpn_reader.ymloptimizer_1x.yml
  4. configs/datasets 文件夹中复制 coco_detection_yml 并创建 roadsign_coco.yml

4.3 配置文件详细参数介绍

4.3.1 项目的配置文件

项目配置文件的主要功能是指定其他相关文件,并将这些文件组合成一个整体,相当于一个项目的入口文件。

项目配置文件:RoadSign/faster_rcnn_r50_fpn_1x_coco.yml

_BASE_: [                                  # 需要继承的相关配置文件
  'runtime.yml',                           # 全局配置文件
  '../datasets/roadsign_coco.yml',         # 路标数据集配置文件
  '_base_/optimizer_1x.yml',               # 优化器配置文件
  '_base_/faster_rcnn_r50_fpn.yml',        # 主干网络配置文件
  '_base_/faster_fpn_reader.yml',          # 数据读取器配置文件
]
weights: output/roadsign/faster_rcnn_r50_fpn_1x_coco/best_model    # 最终模型保存的位置,用于实现评估与推理时的模型调用
save_dir: output/roadsign/faster_rcnn_r50_fpn_1x_coco1x            # 训练过程中,模型保存的位置,该参数会覆盖runtime.yml中的同名参数

PS:上面的weights参数指定的是最终模型保存的位置,这个模型用于实现评估与推理时的模型调用。但训练过程中,模型并不会主动保存到该位置,而是保存在 output 根目录下。因此,训练完成后,需要手动将训练好的模型文件 best_model.pdparams, best_model.pdopt, best_model.pdstates 复制到该 best_model 文件夹。这三个文件中,best_model.pdparams 是模型参数文件,best_model.pdopt 是优化器参数文件,best_model.pdstates 是训练状态文件。如果只是用于部署,只需要 best_model.pdparams 文件即可;后两者用于微调训练和恢复训练使用。不过,为了便于管理,我们也可以在该配置文件中指定模型保存的位置 save_dir,这样训练完成后,模型会自动保存到该位置,无需手动复制;若设置了该参数,它的取值会自动覆盖 runtime.yml 中的同名参数。

4.3.2 全局配置文件

全局配置: configs/runtime.yml

use_gpu: true          # 根据硬件选择是否使用图形处理器GPU
use_xpu: false         # 根据硬件选择是否使用可扩展处理器XPU         
use_mlu: false         # 根据硬件选择是否使用MLU处理器??
use_npu: false         # 根据硬件选择是否使用神经网络处理器NPU
log_iter: 20           # 设置多少次迭代显示一次训练日志
save_dir: output       # 设置模型保存的根目录
snapshot_epoch: 1      # 设置多少个周期保存一次模型
print_flops: false     # 是否显示计算吞吐量,注意启用该选项需要安装paddleslim
print_params: false    # 是否显示模型参数量

# 模型输出配置
export:
  post_process: True  # 是否在导出模型时添加后处理
  nms: True           # 是否在导出模型时添加非极大值抑制NMS模块
  benchmark: False    # It is used to testing model performance, if set `True`, post-process and NMS will not be exported.
  fuse_conv_bn: False 

4.3.3 数据集配置文件

根据数据的标注方式不同,目标检测的数据集一般分为COCO格式和VOC格式,前者通常使用单一 .json 文件保存标注信息,后者为每个样本单独使用 .xml 文件保存标注信息。关于这两种标注方式的介绍,请参考 【项目021】Pascal VOC和MSCOCO数据集简介。此处分别给出这两种格式数据集的配置文件。

MSCOCO格式数据集配置: configs/datasets/roadsign_coco.yml

metric: COCO          # 数据集的结构形态:MSCOCO
num_classes: 4        # 类别数量

TrainDataset:         # 训练集
  name: COCODataSet
# Windows
#  dataset_dir: D:/Workspace/ExpDatasets/roadsign           # 图像集的根目录
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/              # 图像集的根目录
  image_dir: images                              # 图像存储的文件夹
  anno_path: annotations_coco/train.json                # 训练集标注文件.json
  data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']    # json中的关键数据域[图像,bbox标注,类别,是否拥挤]

EvalDataset:         # 验证集
  name: COCODataSet
# Windows
#  dataset_dir: D:/Workspace/ExpDatasets/roadsign           # 图像集的根目录
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/              # 图像集的根目录
  image_dir: images
  anno_path: annotations_coco/valid.json                       # 验证集标注文件.json

TestDataset:         # 测试集
  name: ImageFolder                                            # 测试集数据集类型(不含标签)
# Windows
#  dataset_dir: D:/Workspace/ExpDatasets/roadsign           # 图像集的根目录
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/              # 图像集的根目录
  anno_path: annotations_coco/valid.json                       # 测试集标注文件.json

VOC格式数据集配置: configs/datasets/roadsign_voc.yml

metric: VOC                # 数据集的结构形态:Pascal VOC
map_type: integral
num_classes: 4             # 类别数量

TrainDataset:
  name: VOCDataSet
# Windows
#  dataset_dir: D:/Workspace/ExpDatasets/roadsign           # 图像集的根目录
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/              # 图像集的根目录
  anno_path: train.txt                                         # 训练集标注文件.txt
  label_list: label_list.txt                                   # 类别列表
  data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']   # 数据域[图像,bbox标注,类别,是否拥挤]

EvalDataset:
  name: VOCDataSet
# Windows
#  dataset_dir: D:/Workspace/ExpDatasets/roadsign           # 图像集的根目录
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/              # 图像集的根目录
  anno_path: valid.txt                            # 验证集标注文件.txt
  label_list: label_list.txt
  data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

TestDataset:
  name: ImageFolder                               # 测试集数据集类型(不含标签)
  anno_path: D:\WorkSpace\ExpDatasets\RoadSign\label_list.txt
# Windows
#  anno_path: D:\WorkSpace\ExpDatasets\RoadSign\label_list.txt   # 图像列表文件
# AIStudio
  dataset_dir: /home/aistudio/work/dataset/label_list.txt     # 图像集的根目录

4.3.4 数据读取器配置文件

数据读取器配置文件中,主要配置了数据读取器中各个组件的参数,包括解码、数据增强、数据预处理等操作。在进行数据处理的时候,以下几点需要特别注意:

  1. 与分类任务相同,数据增广只需要在训练阶段使用,验证和测试阶段不需要使用数据增广;但无论是训练、验证还是测试,应该执行相同的数据预处理操作,包括解码、尺度变化、归一化、通道转换等。
  2. 数据打乱操作通常也只在训练阶段使用,验证和测试阶段不需要打乱数据,以尽量节约系统资源。
  3. 为确保数据测试的完整性,验证和测试阶段不执行 drop_last 操作,即验证和测试需要使用全部的数据样本。

数据读取器配置: configs/_base_/faster_fpn_reader.yml

worker_num: 2
TrainReader:                         # 训练阶段的数据读取器
  sample_transforms:
  - Decode: {}
  - RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True}      # 随机裁剪,训练时采用多尺度进行训练,验证和测试时通常使用固定尺寸/比例进行测试
  - RandomFlip: {prob: 0.5}         # 按照0.5的概率随机水平翻转
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}     # 数据标准化:减均值、去方差;均值和方差均在整个数据集上进行计算,对于自然图像以上数据一般是固定的,它来源于ImageNet数据集;一些特殊的数据集,例如遥感数据集、医学图像数据集、人脸数据集等,均值和方差通常需要重新计算
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}   # 执行批正则化的pad尺度  
  batch_size: 1                     # 每批次训练样本的数量
  shuffle: true                     # 是否随机打乱数据,通常在训练过程中需要随机打乱
  drop_last: true                   # epoch/batch_size有余数时,是否将末尾的数据进行丢弃,训练中通常进行丢弃
  collate_batch: false


EvalReader:                         # 验证阶段的数据读取器
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}
  batch_size: 1
  shuffle: false
  drop_last: false


TestReader:                         # 测试阶段的数据读取器
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}
  batch_size: 1
  shuffle: false
  drop_last: false

4.3.5 主干网络配置文件

主干网络配置文件是模型的核心部分,它定义了模型的主体结构。在本例中,我们使用的是基于ResNet50的FasterRCNN作为主干网络。ResNet50是一种深度卷积神经网络,它通过引入残差连接来缓解深度网络中的梯度消失问题,从而提高模型的训练效果。FasterRCNN是由何凯明等人提出的一种两阶段目标检测算法,它首先通过RPN网络生成候选区域,然后通过分类和回归网络对候选区域进行分类和定位。与分类任务类似,目标检测也可以调用预训练模型进行参数初始化,从而加快训练速度并提高模型性能。

主干网络配置: configs/_base_/faster_rcnn_r50_fpn.yml

architecture: FasterRCNN                     # 模型架构 FasterRCNN
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams  # 预训练权重

FasterRCNN:                                  # 定义FasterRCNN各模块名称
  backbone: ResNet                           # 1. 主干网络:ResNet
  neck: FPN                                  # 2. neck模块(特征提取):FPN特征金字塔
  rpn_head: RPNHead                          # 3. RPN头:区域建议网络
  bbox_head: BBoxHead                        # 4. BBox头:BoundingBox 区域回归模块
  bbox_post_process: BBoxPostProcess         # 5. 后处理模块


ResNet:                        ## 1. 主干网络:ResNet
  # index 0 stands for res2
  depth: 50                    # 模型深度,此处标识为ResNet50
  norm_type: bn                # 设置是否启用batch-norm, bn正则化
  freeze_at: 0                 # 微调训练时冻结模块的起点,index=0表示的是res2,因此,第一组卷积在微调时将永久冻结 (fastRCNN)
  return_idx: [0,1,2,3]        # 实际参与微调的层为[2,3,4,5]
  num_stages: 4

FPN:                           ## 2. neck模块(特征提取):FPN特征金字塔
  out_channel: 256             # FPN输出的通道数为 256

RPNHead:                       ## 3. RPN头:区域建议网络
  anchor_generator:            # 3.1 Anchor采样的基本原则
    aspect_ratios: [0.5, 1.0, 2.0]                     # 采样长宽比例,即1:2, 1:1, 2:1
    anchor_sizes: [[32], [64], [128], [256], [512]]    # FPN采样基准尺度
    strides: [4, 8, 16, 32, 64]                        # 采样步长
  rpn_target_assign:           # 3.2 RPN采样规则
    batch_size_per_im: 256     # 共采样256个Anchor
    fg_fraction: 0.5           # 正样本比例为 0.5,即 512*0.5=256个
    negative_overlap: 0.3      # 与所有真实框的IoU<0.3的Anchor为负样本
    positive_overlap: 0.7      # 与任意真实框的IoU>0.7的Anchor为正样本
    use_random: True           # 使用随机方式进行采样
  train_proposal:              # 3.3 训练阶段RPN参数
    min_size: 0.0
    nms_thresh: 0.7            # nms阈值 0.7
    pre_nms_top_n: 2000        # 使用RPN采样2000个RoIs用于后续的处理
    post_nms_top_n: 1000       # 经过对象性排序后保留1000个样本
    topk_after_collect: True
  test_proposal:               # 3.4 测试阶段RPN参数
    min_size: 0.0
    nms_thresh: 0.7            # nms阈值 0.7
    pre_nms_top_n: 1000        # 使用RPN采样1000个RoIs用于后续的处理
    post_nms_top_n: 1000       # 经过对象性排序后保留1000个样本,原作为300个


BBoxHead:                     ## 4. BBox头的超参数
  head: TwoFCHead             # 输出头为TwoFCHead,通道数为 1024
  roi_extractor:
    resolution: 7             # RoI的输出特征为 7×7,也即输入BBox的特征为7×7
    sampling_ratio: 0
    aligned: True             # 启用RoI Align模式
  bbox_assigner: BBoxAssigner

BBoxAssigner:                 ## 6. BBox回归的超参数
  batch_size_per_im: 512      # 采样总数为 512
  bg_thresh: 0.5              # IoU<0.5为负样本
  fg_thresh: 0.5              # IoU>0.5为正样本
  fg_fraction: 0.25           # 正样本比率为0.25,即 512*0.25=128个
  use_random: True            # 使用随机方式进行采样

TwoFCHead:                    ## 7. 全连接层输出头的超参数
  out_channel: 1024           # 输入BBoxHead的特征通道数

BBoxPostProcess:              ## 5. 后处理方法为:多类非极大抑制NMS
  decode: RCNNBox
  nms:
    name: MultiClassNMS      # 使用多类非极大抑制
    keep_top_k: 100          # 保留评分最高的100个patch(Anchor)
    score_threshold: 0.05    # 评分最低阈值
    nms_threshold: 0.5       # nms阈值

4.3.6 优化器配置文件

优化器配置文件给出训练过程中控制训练进程的各种优化器的超参数,包括学习率、权重衰减等。一般来说,对于一个模型来说,最难以确定的超参数就是优化器的各种超参数,因为这些超参数与数据集、模型结构、训练策略等都有关系。在这里给出一些建议:

  1. 关于学习率策略,近年来的深度学习模型一般使用学习率预热和余弦退火策略,即在训练初期使用较小的学习率,然后逐渐增大,最后再逐渐减小,这样可以使得模型在训练初期更加稳定,避免训练过程中的震荡,同时也可以使得模型在训练后期更加精细,避免过拟合。但通常,也可以使用分段学习率策略,即在一定的epoch之后,将学习率乘以一个小于1的因子,这样可以使得学习率逐渐减小,避免过拟合,这个因子通常为0.1,即降低10倍(起源于AlexNet)。
  2. 训练周期的确定,通常是启发式的,需要根据训练进程中精度和损失值的变化规律来确定,如果训练进程中的精度和损失值在训练初期下降很快,然后趋于平稳,那么在稳定一段时间后,则需要进行学习率的衰减。若开始时无法确定,可以参考类似数据集的通用设置作为初始状态,本例中,我们设置初始训练周期为12个epoch,然后在第8个和第11个epoch时,分别将学习率降低10倍。
  3. 对于训练周期,两阶段的模型通常比单阶段模型需要更少的训练周期,因为两阶段的模型在RPN阶段已经剔除了大部分背景样本,使得模型在训练后期更加关注前景样本,从而使得模型在训练后期更加稳定,避免过拟合。一般来说,单阶段的模型所需要的训练周期可能会更多,甚至是5~10倍之多(并不绝对)。
  4. 学习率预热策略可以有效防止训练初期的损失振荡引起的不稳定,一般需要总迭代次数的5~10%左右,通常不超过10%。
  5. 权重衰减(Weight Decay)是防止过拟合的常用手段,其作用与正则化类似,可以使得模型在训练过程中更加稳定,避免过拟合。权重衰减的值通常在1e-4~1e-2之间,具体值需要根据训练进程中的精度和损失值的变化规律来确定,但该选项总体影响不大。

优化器配置: configs/_base_/optimizer_1x.yml

epoch: 4                         # 迭代训练的周期数,默认为12个周期

LearningRate:                    # 学习率超参数
  base_lr: 0.01                  # 初始学习率
  schedulers:               
  - !PiecewiseDecay              # 学习率策略:分段学习率
    gamma: 0.1                   # 学习率衰减率超参数:0.1
    milestones: [8, 11]          # 学习率衰减的时刻点,第8个epoch和第11个epoch
  - !LinearWarmup                # 线性热身(学习率慢启动),避免较大的初始学习率引起损失过分振荡
    start_factor: 0.1            # 预热衰减率为 0.1,即从初始学习率的10%开始逐渐上升至base_lr
    steps: 1000                  # 热身周期为 1000次迭代

OptimizerBuilder:                # 优化方法设置
  optimizer:
    momentum: 0.9                # 动量值 0.9
    type: Momentum               # 优化方法:基于动量的随机梯度下降
  regularizer:
    factor: 0.0001               # 正则化因子  0.0001
    type: L2                     # 正则化方法 L2正则化

注意:为了较快得到输出模型,此处设置周期数epoch为4,更好的收敛周期请参考 5.3 节的表格。


【任务五】模型训练和验证

任务描述: 使用 PaddelDetection 的命令行模式完成模型的训练和验证。

任务要求:

  1. 学会使用 PaddleDetection 的命令行完成模型训练
  2. 学会在训练过程中启用模型验证,输出验证集的测试结果
  3. 能够使用 PaddleDetection 的命令行完成模型验证
  4. 学会在命令行任务中启用日志保存功能,以供后续分析使用
  5. 学会统计训练日志中的关键指标,如:loss、mAP等
  6. 能够根据评估结果分析模型的性能。

5.1 模型的训练

由于 PaddelDetection 进行了一定程度的封装,因此无法象 PaddlePaddle 一样自定义编写代码,但 PaddleDetection 提供了基于命令行的程序控制方法。在本任务中,训练和验证都是模型训练过程中非常重要的环节。与分类任务相同,训练过程基于训练集完成,验证任务基于验证集完成,测试任务基于测试集完成。(在一些示例任务中,也会使用测试集来完成验证)

在使用PaddleDetection训练时,首先需要指定用于训练的模型,其参数为 -c。其次,若开启了--eval,则会在指定周期snapshot_epoch 时使用验证集数据进行评估,并将保存所有的 checkpoint 模型到默认的 output 目录。同时,评估结果最好的 checkpoint 模型保存为 best_model。最后,我们可以调用Shell命令 tee 来完成日志的输出。需要注意的是,该命令必须在Linux下,或支持Shell的命令提示符工具的才能起作用。下面给出训练模型的基本命令,

>> python -u .\tools\train.py -c .\configs\roadsign\faster_rcnn_r50_fpn_1x_coco.yml --eval  2>&1 | tee .\output\roadsign\faster_rcnn_r50_fpn_1x_coco\train_log.txt
>> python -u ./tools/train.py -c ./configs/roadsign/faster_rcnn_r50_fpn_1x_coco.yml --eval  2>&1 | tee ./output/roadsign/faster_rcnn_r50_fpn_1x_coco/train_log.txt

另一方面,我们也可以使用 Notebook 来调用Shell命令执行训练代码。但值得注意的是,在Notebook中运行训练进程,无法实时打印出日志文件(只能在整个训练过程结束后,一次性打印出所有训练日志)。鉴于训练时间通常比较长,为了便于观察训练过程,建议使用Windows PowerShell终端或Linux(AIStudio命令行)来进行训练。

import os
workspace = 'D:\\Workspace\\MyProjects\\PaddleDetection-release-2.8'
# workspace = '/home/aistudio/work/PaddleDetection-release-2.8'
os.chdir(workspace)

##################### JupyterLab ######################################
model_template1 = 'faster_rcnn_r34_fpn_1x_coco'
model_template2 = 'faster_rcnn_r34_vd_fpn_1x_coco'
model_template3 = 'faster_rcnn_r50_1x_coco'
model_template4 = 'faster_rcnn_r50_vd_fpn_1x_coco'
model_template5 = 'faster_rcnn_r50_vd_fpn_2x_coco'
model_template6 = 'faster_rcnn_r50_fpn_1x_coco'
model_template7 = 'faster_rcnn_r50_fpn_1x_voc'
model_template8 = 'yolov3_mobilenet_v1_coco'
model_template9 = 'yolov3_r34_40e_coco'
model_template10 = 'ppyolo_mbv1_small_coco'
model_template = model_template6

# {model_template} 是Shell命令的变量名,由上面的赋值运算进行定义
!python -u /tools/train.py -c ./configs/roadsign/{model_template}.yml --eval

训练日志摘要如下:

loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[01/27 22:30:49] ppdet.data.source.coco INFO: Load [701 samples valid, 0 samples invalid] in file D:\WorkSpace\ExpDatasets\RoadSign\annotations_coco/train.json.
W0127 22:30:49.500597  3608 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.9, Driver API Version: 12.6, Runtime API Version: 12.3
W0127 22:30:49.501602  3608 gpu_resources.cc:164] device: 0, cuDNN Version: 9.0.
[01/27 22:30:50] ppdet.utils.checkpoint INFO: Finish loading model weights: C:\Users\Administrator/.cache/paddle/weights\ResNet50_cos_pretrained.pdparams
[01/27 22:30:50] ppdet.engine.callbacks INFO: Epoch: [0] [  0/701] learning_rate: 0.001000 loss_rpn_cls: 0.686891 loss_rpn_reg: 0.021275 loss_bbox_cls: 1.592575 loss_bbox_reg: 0.021352 loss: 2.322093 eta: 0:56:43 batch_cost: 0.4046 data_cost: 0.0011 ips: 2.4716 images/s, max_mem_reserved: 1260 MB, max_mem_allocated: 1100 MB
[01/27 22:30:51] ppdet.engine.callbacks INFO: Epoch: [0] [ 20/701] learning_rate: 0.001180 loss_rpn_cls: 0.584425 loss_rpn_reg: 0.010486 loss_bbox_cls: 0.182464 loss_bbox_reg: 0.015377 loss: 0.703980 eta: 0:10:17 batch_cost: 0.0570 data_cost: 0.0007 ips: 17.5443 images/s, max_mem_reserved: 2062 MB, max_mem_allocated: 1888 MB
[01/27 22:30:52] ppdet.engine.callbacks INFO: Epoch: [0] [ 40/701] learning_rate: 0.001360 loss_rpn_cls: 0.072091 loss_rpn_reg: 0.010289 loss_bbox_cls: 0.156038 loss_bbox_reg: 0.064737 loss: 0.319977 eta: 0:08:56 batch_cost: 0.0541 data_cost: 0.0006 ips: 18.4895 images/s, max_mem_reserved: 2190 MB, max_mem_allocated: 1888 MB

......

[01/27 21:07:38] ppdet.engine.callbacks INFO: Epoch: [11] [660/701] learning_rate: 0.000100 loss_rpn_cls: 0.000442 loss_rpn_reg: 0.001940 loss_bbox_cls: 0.019229 loss_bbox_reg: 0.034070 loss: 0.053261 eta: 0:00:02 batch_cost: 0.0528 data_cost: 0.0004 ips: 18.9233 images/s, max_mem_reserved: 2348 MB, max_mem_allocated: 1945 MB
[01/27 21:07:39] ppdet.engine.callbacks INFO: Epoch: [11] [680/701] learning_rate: 0.000100 loss_rpn_cls: 0.000350 loss_rpn_reg: 0.001637 loss_bbox_cls: 0.018042 loss_bbox_reg: 0.039892 loss: 0.053054 eta: 0:00:01 batch_cost: 0.0498 data_cost: 0.0002 ips: 20.0656 images/s, max_mem_reserved: 2348 MB, max_mem_allocated: 1945 MB
[01/27 21:07:40] ppdet.engine.callbacks INFO: Epoch: [11] [700/701] learning_rate: 0.000100 loss_rpn_cls: 0.000401 loss_rpn_reg: 0.002411 loss_bbox_cls: 0.021346 loss_bbox_reg: 0.049573 loss: 0.072737 eta: 0:00:00 batch_cost: 0.0495 data_cost: 0.0005 ips: 20.1972 images/s, max_mem_reserved: 2348 MB, max_mem_allocated: 1945 MB
[01/27 21:07:41] ppdet.utils.checkpoint INFO: Save checkpoint: output
[01/27 21:07:41] ppdet.engine.callbacks INFO: Eval iter: 0
[01/27 21:07:43] ppdet.engine.callbacks INFO: Eval iter: 100
[01/27 21:07:46] ppdet.metrics.metrics INFO: The bbox result is saved to bbox.json.
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[01/27 21:07:46] ppdet.metrics.coco_utils INFO: Start evaluate...
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.04s).
Accumulating evaluation results...
DONE (t=0.02s).
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.711
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.923
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.798
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.696
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.774
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.693
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.660
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.759
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.759
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.719
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.815
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.748
[01/27 21:07:46] ppdet.engine.callbacks INFO: Total sample number: 176, average FPS: 36.34668871043512
[01/27 21:07:46] ppdet.engine INFO: Best test bbox ap is 0.711.
[01/27 21:07:47] ppdet.utils.checkpoint INFO: Save checkpoint: output/roadsign/faster_rcnn_r50_fpn_1x_coco1

5.2 模型评估验证

PaddleDetection 的评估验证可以使用工具包所提供的 tools/eval.py 脚本完成,该命令可以使用模型的默认参数 weights 所指定的模型进行评估,若使用预先下载的模型也可以通过 -o weights= 命令进行指定。参数 --classwise 可以打印出每个类别的精确度。下面给出在命令行中进行评估的命令:

>> python -u tools\eval.py -c .\configs\roadsign\faster_rcnn_r50_fpn_1x_coco.yml --classwise
>> python -u tools/eval.py -c ./configs/roadsign/faster_rcnn_r50_fpn_1x_coco.yml --classwise

以下命令为Notebook中用于评估的代码:

# 评估
import os
# workspace = 'D:\\Workspace\\MyProjects\\PaddleDetection-release-2.8'
workspace = '/home/aistudio/work/PaddleDetection-release-2.8'
os.chdir(workspace)

##################### JupyterLab ######################################
model_template1 = 'faster_rcnn_r34_fpn_1x_coco'
model_template2 = 'faster_rcnn_r34_vd_fpn_1x_coco'
model_template3 = 'faster_rcnn_r50_1x_coco'
model_template4 = 'faster_rcnn_r50_vd_fpn_1x_coco'
model_template5 = 'faster_rcnn_r50_vd_fpn_2x_coco'
model_template6 = 'faster_rcnn_r50_fpn_1x_coco'
model_template7 = 'faster_rcnn_r50_fpn_1x_voc'
model_template8 = 'yolov3_mobilenet_v1_coco'
model_template9 = 'yolov3_r34_40e_coco'
model_template10 = 'ppyolo_mbv1_small_coco'
model_template = model_template6

# {model_template} 是Shell命令的变量名,由上面的赋值运算进行定义
!python -u tools/eval.py -c configs/roadsign/{model_template}.yml --classwise
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[04/09 23:06:31] ppdet.utils.checkpoint INFO: Finish loading model weights: contrib/RoadSign/output/faster_rcnn_r50_fpn_1x_coco/best_model.pdparams
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[04/09 23:06:32] ppdet.engine INFO:  Model FLOPs : 163.633649G. (image shape is [1, 3, 1088, 800])
[04/09 23:06:33] ppdet.engine INFO: Eval iter: 0
[04/09 23:06:41] ppdet.engine INFO: Eval iter: 100
[04/09 23:06:48] ppdet.metrics.metrics INFO: The bbox result is saved to bbox.json.
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[04/09 23:06:48] ppdet.metrics.coco_utils INFO: Start evaluate...
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.11s).
Accumulating evaluation results...
DONE (t=0.06s).
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.704
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.929
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.752
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.668
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.776
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.671
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.659
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.767
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.767
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.711
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.824
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.755
[04/09 23:06:48] ppdet.metrics.coco_utils INFO: Per-category of bbox AP: 
+------------+-------+-----------+-------+--------------+-------+
| category   | AP    | category  | AP    | category     | AP    |
+------------+-------+-----------+-------+--------------+-------+
| speedlimit | 0.866 | crosswalk | 0.646 | trafficlight | 0.471 |
| stop       | 0.833 | None      | None  | None         | None  |
+------------+-------+-----------+-------+--------------+-------+
[04/09 23:06:48] ppdet.metrics.coco_utils INFO: per-category PR curve has output to bbox_pr_curve folder.
[04/09 23:06:48] ppdet.engine INFO: Total sample number: 176, averge FPS: 10.85748081560342
W0409 23:06:28.093667 17536 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 6.1, Driver API Version: 11.1, Runtime API Version: 10.2
W0409 23:06:28.108626 17536 device_context.cc:465] device: 0, cuDNN Version: 7.6.

5.3 实验结果分析

下表给给出了10个模型的评估结果,有兴趣的同学可以尝试进行多个模型的训练,并总结出不同模型之间的异同。

序号 模型名称 epoch AP@(0.5:0.95) AP@(0.5) Recall fps speedlimit crosswalk trafficlight stop
A faster_rcnn_r34_fpn_1x_coco 12                
B faster_rcnn_r34_vd_fpn_1x_coco 12                
C faster_rcnn_r50_1x_coco 12                
D faster_rcnn_r50_fpn_1x_coco 12 0.701 0.929 0.767 34.8 0.862 0.682 0.433 0.827
E faster_rcnn_r50_fpn_1x_voc 12                
F faster_rcnn_r50_vd_fpn_1x_coco 12                
G faster_rcnn_r50_vd_fpn_2x_coco 24                
H yolov3_mobilenet_v1_coco 40                
I yolov3_r34_40e_coco 40                
J ppyolo_mbv3_small_coco 40                

【实验分析】(仅供参考)

实验结果分析是人工智能项目的重要组成部分,有助于更好地了解和分析算法的优劣,也是获取新研究创新点的重要来源。【强烈建议】所有同学,特别是想要读研究生/发表论文的同学认真思考。分析的结果合理即可。

从实验结果来看,可以得到如下结论:
1.
2.
3.


【任务六】模型的推理预测

任务描述: 在PaddleDetection中,使用给定的图片在训练好的模型上进行推理和预测。
任务要求:

  1. 能够在命令行中使用训练好的模型对给定图片进行推理和预测;
  2. 能够Notebook中使用训练好的模型对给定图片进行推理和预测;
  3. 能够将推理生成的图片进行可视化。

PaddleDetection提供了推理预测脚本 tools/infer.py,通过该脚本可以实现利用训练好的模型对给定图片进行预测。在 infer.py 命令中,-c {config.yml} 参数用于模型选择;--output_dir={output_dir} 参数用于指定结果输出路径;--infer_img={img_path} 参数用于选择待预测样本。下面给出该命令的范例:

>> python tools/infer.py -c configs/RoadSign/faster_rcnn_r50_fpn_1x_coco.yml --output_dir=output/RoadSign/faster_rcnn_r50_fpn_1x_coco --infer_img=demo/road554.png

运行结果如下:

(base) D:\WorkSpace\MyProjects\PaddleDetection-release-2.8>python tools/infer.py -c configs/RoadSign/faster_rcnn_r50_fpn_1x_coco.yml --output_dir=output/RoadSign/faster_rcnn_r50_fpn_1x_coco --infer_img=demo/road554.png
W0127 23:49:59.058647 15208 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.9, Driver API Version: 12.6, Runtime API Version: 12.3
W0127 23:49:59.058647 15208 gpu_resources.cc:164] device: 0, cuDNN Version: 9.0.
[01/27 23:49:59] ppdet.utils.checkpoint INFO: Finish loading model weights: output/roadsign/faster_rcnn_r50_fpn_1x_coco/best_model.pdparams
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
100%|███████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  3.74it/s]
[01/27 23:49:59] ppdet.engine INFO: Detection bbox results save in output/RoadSign/faster_rcnn_r50_fpn_1x_coco\road554.png

下面给出Notebook中的推理代码,代码中同时实现将推理生成的图片进行可视化。

####### 预测
import os
import matplotlib.pyplot as plt 
from PIL import Image

import cv2

# 0. 设置工作路径
# workspace = 'D:\\Workspace\\MyProjects\\PaddleDetection-release-2.8'
workspace = '/home/aistudio/work/PaddleDetection-release-2.8'
os.chdir(workspace)

####### 1. 执行预测Inference
# 1.1 设置图片路径
img_root = 'demo'
img_file = 'road554.png'  
img_path = os.path.join(img_root, img_file)
# output_dir = 'output\\R\roadsign\\faster_rcnn_r50_fpn_1x_coco'
output_dir = 'output/roadsign/faster_rcnn_r50_fpn_1x_coco'

# 1.2 设置模型路径
model_template1 = 'faster_rcnn_r34_fpn_1x_coco'
model_template2 = 'faster_rcnn_r34_vd_fpn_1x_coco'
model_template3 = 'faster_rcnn_r50_1x_coco'
model_template4 = 'faster_rcnn_r50_vd_fpn_1x_coco'
model_template5 = 'faster_rcnn_r50_vd_fpn_2x_coco'
model_template6 = 'faster_rcnn_r50_fpn_1x_coco'
model_template7 = 'faster_rcnn_r50_fpn_1x_voc'
model_template8 = 'yolov3_mobilenet_v1_coco'
model_template9 = 'yolov3_r34_40e_coco'
model_template10 = 'ppyolo_mbv1_small_coco'
model_template = model_template6

# 1.3 执行预测脚本
!python tools/infer.py -c configs/roadsign/{model_template}.yml -o --output_dir={output_dir} --infer_img={img_path}

####### 2. 可视化Inference结果
# 2.1 设置Inference路径
infer_img_path = os.path.join(output_dir, img_file)

# 2.1 PIL显示接口
infer_img = Image.open(infer_img_path)
infer_img
# 2.2 OpenCV显示接口
# infer_img = cv2.imread(infer_img_path)
# cv2.imshow('detection result', infer_img)
# cv2.waitKey(0)
[01/27 23:48:15] ppdet.utils.checkpoint INFO: Finish loading model weights: output/roadsign/faster_rcnn_r50_fpn_1x_coco/best_model.pdparams
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[01/27 23:48:16] ppdet.engine INFO: Detection bbox results save in output\RoadSign\faster_rcnn_r50_fpn_1x_coco\road554.png
W0127 23:48:15.742193  9612 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.9, Driver API Version: 12.6, Runtime API Version: 12.3
W0127 23:48:15.742193  9612 gpu_resources.cc:164] device: 0, cuDNN Version: 9.0.

  0%|          | 0/1 [00:00<?, ?it/s]
100%|██████████| 1/1 [00:00<00:00,  3.76it/s]
100%|██████████| 1/1 [00:00<00:00,  3.72it/s]
RoodSign554

【项目014】基于深度学习的路标识别(学生版) 显示答案 | 返回首页

【任务二】PaddleDetection环境的安装与调试

【任务三】数据准备

【任务四】配置文件的准备

【任务五】模型训练和验证