作者:欧新宇(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
config/roadsign
目录和 output/roadsign
目录下的所有文件实验结果表
的数据给出实验结果分析.ipynb
文件提交到百度飞桨平台任务描述: 在本地计算机及百度AIStudio中配置和部署用于目标检测的相关文件夹和文件。
任务要求:
1.能够充分理解项目部署规范性的重要性;
2.能够根据需要完成必要文件夹的创建,并将相关文件保存到指定文件夹。
为了便于项目管理,本课程所有环境都按照统一规范进行设置,详细内容请参考 【项目002】 Python机器学习环境安装和配置。
如上图所示,我们在 PaddleDetecion-release-2.8
的目录中可以看到多个不同功能的文件夹,其中 configs
保存了预制的多个经典模型,包括faster_rcnn, yolov3, ppyolo等;tools
文件夹中保存了PaddleDetection工具用于训练、验证、推理等功能的可执行文件,output
文件夹用于保存生成的模型和预测结果等文件。此外,我们需要在根目录下创建 dataset
文件夹用于保存下载的数据集。此外,建议先在 PaddleDetection/configs
目录下创建项目文件夹 roadsign
。之后还需要将相关的模型配置文件从内置模型库文件夹中拷贝至路径下(【任务四】)。
PS: 【任务一】只需要阅读了解即可,不需要做额外的操作。
任务描述: 与基于 PaddlePaddle 的分类识别不同,目标检测还需要另外一个封装好的工具包 PaddleDetection 的辅助才能完成。该任务的主要工作是安装PaddleDetection工具包,并解决安装过程中遇到的各种问题。
任务要求:
PaddleDetection-release-2.8.zip
工具包到项目文件夹 MyProjects
,实现方法有两种:文件夹名
改为 DetectionRoadSign
(便于项目管理)或直接使用带版本的命名 PaddleDetection-release-2.8
(便于版本管理),本教案使用后者进行实现。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()
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
的创建。
本例给出PaddleDetection的具体安装配置方法,完整的安装请参考 【项目002】Python机器学习环境的安装和配置。 通常,PaddleDetection环境的安装只需要执行一次,确认服务器或本地环境已经具备相关依赖文件后,可跳过该步。 但AIStudio 每次启动服务器都需要重新安装,除非你已经完成了持久化安装。
>> pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
>> python setup.py install
Finished processing dependencies for paddledet==2.8.0
pip config list
。此外,若速度较慢其他几个源也可尝试,包括 阿里云 http://mirrors.aliyun.com/pypi/simple/
, 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
, 华中科技大学 http://pypi.hustunique.com/
, 腾讯源 http://mirrors.cloud.tencent.com/pypi/simple
此处,建议先执行下列第三方库的手动安装再运行
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
为了验证安装的正确性,安装完成后最好进行一定能的测试,以确认 PaddleDetection 是否安装成功。测试代码如下。
>> python ppdet/modeling/tests/test_architectures.py
若能输出以下提示,则说明测试验证通过。
Ran 7 tests in 12.816s
OK
任务描述: 下载路标识别数据集,并按规范解压到指定目录,用于后续的训练、评估和预测。
任务要求:
本项目使用 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数据集简介。
要求按照【任务一】中的说明,将下载好 RoadSign
数据集解压到 ExpDatasets\dataset
(Windows) 或 work/dataset
(AIStudio) 目录中。
任务描述: 飞桨PaddlePaddle提供了强大的自定义开发环境,但对于目标检测任务,我们通常使用PaddleDetection工具包来完成模型的训练和推理会更方便一些。为了更好地使用该工具包,我们需要对PaddleDetection的基本工作流程有较为清楚的了解。本任务的目标是,通过实际操作,掌握PaddleDetection的基本工作流程,并能够根据实际需求,基于PaddleDetection完成自定义模型的训练和推理。
任务要求:
PaddleDetection的模型都是基于yaml文件完成配置,在不对模型进行修改的时候,只需要设置yaml中的超参数即可完成快速的训练和部署。此处,为避免不可恢复错误,要求按照【任务一】的说明,,复制原版配置文件到项目文件夹 configs/roadsign
后,再对副本配置文件进行修改。在本项目的 [教学版] 中,我们给出十种相对简单的模型,用于实验对比。本教案中,我们针对其中的模型 D. faster_rcnn_r50_fpn_1x_coco
进行介绍。这十种模型具体包括:
在以上各版本的模型中,各参数含义描述如下:
r34
, r50
分别表示主干网络使用ResNet34和ResNet50模型,mobilenet_v1
和 mbv1
表示主干网络使用MobileNet_v1模型。下面以 faster_rcnn_r50_fpn_1x_coco.yml
为例子,说明PaddleDetection关键超参数配置文件的组成和相互之间的逻辑关系,如下图所示:
本项目在配置模型超参数时,需要先需要复制/创建如下文件:
PaddleDetecion-release-2.8/configs
目录下创建项目文件夹 RoadSign
。configs/faster_rcnn
文件夹中拷贝项目配置文件 faster_rcnn_r50_fpn_1x_coco.yml
文件至 configs/RoadSign
文件夹。configs/faster_rcnn/_base_
文件夹中拷贝下列文件至 configs/RoadSign/_base_
文件夹,包括:faster_rcnn_r50_fpn.yml
, faster_fpn_reader.yml
和 optimizer_1x.yml
。configs/datasets
文件夹中复制 coco_detection_yml
并创建 roadsign_coco.yml
。项目配置文件的主要功能是指定其他相关文件,并将这些文件组合成一个整体,相当于一个项目的入口文件。
项目配置文件: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
中的同名参数。
全局配置: 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
根据数据的标注方式不同,目标检测的数据集一般分为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 # 图像集的根目录
数据读取器配置文件中,主要配置了数据读取器中各个组件的参数,包括解码、数据增强、数据预处理等操作。在进行数据处理的时候,以下几点需要特别注意:
数据读取器配置: 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
主干网络配置文件是模型的核心部分,它定义了模型的主体结构。在本例中,我们使用的是基于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阈值
优化器配置文件给出训练过程中控制训练进程的各种优化器的超参数,包括学习率、权重衰减等。一般来说,对于一个模型来说,最难以确定的超参数就是优化器的各种超参数,因为这些超参数与数据集、模型结构、训练策略等都有关系。在这里给出一些建议:
优化器配置: 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 的命令行模式完成模型的训练和验证。
任务要求:
由于 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
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.
下表给给出了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中,使用给定的图片在训练好的模型上进行推理和预测。
任务要求:
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]