【深度学习】滴滴出行-交通场景目标检测

案例5:滴滴出行-交通场景目标检测

相关知识点:目标检测、开源框架的配置和使用(mmdetection, mmcv)

1 任务目标

1.1 任务和数据简介

本次案例将使用深度学习技术来完成城市交通场景下的目标检测任务,案例所使用的数据集由滴滴出行提供,基于D2-City大规模行车记录视频数据集[1],经过视频抽帧等预处理步骤得到。数据集共包含12,000张图像,每张图像的大小为1080×1920或720×1280,已划分为训练集(10,000张)、验证集(1,000张)、测试集(1,000张),其中训练集和验证集提供了检测标签,测试集仅提供图像,用于提交后测试模型效果。本数据集共包含12个待检测的物体类别,包括小汽车、公交车、自行车、行人等,具体定义及示例如图1所示。本任务的目标是在给定的交通场景图像中,尽可能完整、准确地检测出所有要求的物体,检测结果示例如图2所示。关于数据的更多细节可参考D2-City文献[1].

为了方便使用,数据集的标注信息已被预处理成MS-COCO格式,MS-COCO是通用物体检测领域最常用的数据集,如需深入理解数据集格式,请自行学习:MS-COCO数据集官网[2]、MS-COCO数据集文献[3]、MS-COCO标注格式[4]. 模型的评估指标也使用MS-COCO常用指标mAP(mean average precision),请自行学习其定义及计算方式(无需自己实现):mAP定义[5],mAP计算方式[6][7]

1.2 参考程序及使用说明

本次案例提供了完整、可供运行的参考程序,选取了带FPN[8]结构的Faster R-CNN[9]模型,基于MMDetection物体检测框架[10]实现,各程序简介如下:

  • faster_rcnn_r50_fpn_1x_didi.py为模型配置文件,安装MMDetection后置于mmdetection/configs/faster_rcnn路径下;

  • didi_detection.py为数据集配置文件,置于mmdetection/configs/_base_/datasets路径下,并将data_root变量修改为数据集所在路径;

  • test.json为测试数据集文件信息,置于mmdetection/[数据集所在路径]/dataset_release路径下,在测试集上做推理时会用到;

  • didi_demo.ipynb用于可视化模型的检测结果。

参考程序的使用步骤及说明

  • 自行安装MMDetection最新版(v3.2.0)及其全部依赖库,包括PyTorch等(MMDetection GitHub: [10],安装指南: [11]);
  • 学习必要的使用说明:MMDetection文档[12] (请务必仔细阅读Getting Started章节);

在这里插入图片描述

图1: 待检测的12个物体类别及其示例

在这里插入图片描述

图2: 检测结果示例,不同颜色的框代表不同类别

  • 下载案例数据集,配置上述文件并置于MMDetection目录下的指定位置;

  • 以参考程序(Faster R-CNN with FPN)为例,训练模型:

     python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py
    
  • 根据训练得到的模型(.pth文件,训练后自动保存于work_dirs/路径下),在测试集上进行推理并得到.json格式的输出文件:

    python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py \
        ./work_dirs/faster_rcnn_r50_fpn_1x_didi/latest.pth \
        --cfg-options "outfile_prefix=./test_results"
    

    该命令会生成test_results.bbox.json文件,用于最终提交和评分。文件结构大致为

    [
       {"image_id":, "bbox": [,,,], "score":, "category_id":},
       {"image_id":, "bbox": [,,,], "score":, "category_id":},]
    
  • 参考程序的超参数沿用了MS-COCO数据集上的配置,可能在本案例数据集上表现不够好,仅以此为例展示如何完成本案例;图3是参考程序训练完成后在验证集上的结果(每轮训练结束后自动输出),图4是测试集上的结果(学生不可见,用于最后评分)。

    image-20240317163433679

    图3: 参考程序训练完成后在验证集上的mAP结果

    image-20240317163511360

    图4: 参考程序训练完成后在测试集上的mAP结果 (学生不可见)

1.3 要求和建议

​ 在参考程序的基础上,综合使用深度学习各项技术,尝试提升该模型在城市交通场景目标检测任务上的效果,以最后提交的.json输出结果对应的测试集mAP值为评价标准。

​ 可从物体检测领域的各个方面着手对模型进行提升,如尝试其它的检测算法(替换Faster R-CNN),如FCOS, Cascade R-CNN等;或者尝试改进Faster R-CNN算法本身的部件,如尝试其它网络结构(替换ResNet50)、其它更适合本案例数据集的超参数(训练图像分辨率、anchor设置、训练策略等)。建议参考MMDetection已经实现好的若干模型[13],以及通用物体检测领域的其它常用方法和技巧[14]

1.4 注意事项

  • 提交所有代码和一份案例报告,提交test_results.bbox.json文件;

  • 案例报告应详细介绍所有改进尝试及对应的结果(包括验证集mAP值和若干检测结果示例图),无论是否成功提升模型效果,并对结果作出分析;

  • 禁止任何形式的抄袭,借鉴开源程序务必加以说明。

1.5 参考资料

[1] Che et al. D2-City: A Large-Scale Dashcam Video Dataset of Diverse Traffic Scenarios. arXiv 2019.

[2] MS-COCO数据集: https://cocodataset.org/

[3] Lin et al. Microsoft COCO: Common Objects in Context. ECCV 2014.

[4] MS-COCO标注格式: https://www.immersivelimit.com/tutorials/create-coco-annotations-from-scratch

[5] MS-COCO mAP定义: https://cocodataset.org/#detection-eval

[6] mAP计算方式: https://www.zhihu.com/question/53405779

[7] mAP计算方式: https://github.com/rafaelpadilla/Object-Detection-Metrics/

[8] Lin et al. Feature pyramid networks for object detection. CVPR 2017.

[9] Ren et al. Faster r-cnn: Towards real-time object detection with region proposal networks. NIPS 2015.

[10] MMDetection: https://github.com/open-mmlab/mmdetection

[11] MMDetection安装指南: https://mmdetection.readthedocs.io/en/latest/get_started.html

[12] MMDetection文档: https://mmdetection.readthedocs.io/

[13] MMDetection Model Zoo: https://github.com/open-mmlab/mmdetection/blob/master/docs/model_zoo.md

[14] Liu et al. Deep Learning for Generic Object Detection: A Survey. IJCV 2020.

2 通过云平台训练基础代码

​ 在本次实验中,并没有给出全部的代码,需要自己从 github 上 clone MMdetection 项目,并自己学习 MMdetection 文档,来完成整个项目。

2.1 环境配置

​ 创建项目,点击右上角设置按钮配置环境。选择“挂载Work目录”,“T4 GPU”,“GPU Pytorch1.6 Tensorflow 2.3.0 Python 3.8.5”完成基础环境配置。本次训练时长较长,占用云平台空间较大,需要挂载 work 文件夹,不然可能会提示 protect文件夹 空间不足。

image-20240301221212761

运行程序,上传本地文件,到project文件夹。

2.2 项目配置

本环节需要配置 MMdetection 的环境,根据文档内容,下载安装一些必备库。

  1. 更新pip

    之后安装的库,需要高版本的pip,所以需要先更新pip。在Jupyter的代码框中,运行以下命令。

    !pip install --upgrade pip
    
  2. test.json 置于 /home/mw/input/datasets1367/dataset/dataset_release 文件夹中

    在Jupyter的代码框中,运行以下命令,完成文件的拷贝。

    %cp /home/mw/project/test.json /home/mw/input/datasets1367/dataset/dataset_release 
    
  3. 用 MIM 安装 MMEngine 和 MMCV

    !pip3 install openmim
    !mim install mmengine
    !mim install "mmcv>=2.0.0,<2.1.0"
    

    安装完成后,会显示Successfully installed mmcv-2.1.0 mmengine-0.10.3 ... 等内容。

  4. 使用源码安装 MMDetection

    !git clone https://github.com/open-mmlab/mmdetection.git
    %cd mmdetection
    !pip install -e .
    

    安装完成后,project文件夹中,会出现mmdetection文件夹。

  5. 文件配置

    faster_rcnn_r50_fpn_1x_didi.py 复制到 mmdetection/configs/faster_rcnn路径下。

    didi_detection.py 复制到mmdetection/configs/_base_/datasets路径下,并将data_root变量修改为数据集所在路径。

    data_root = '/home/mw/input/datasets1367/dataset/dataset_release/'
    

2.3 项目训练

  1. 在线训练

    在Jupyter的代码框中,运行以下命令,开始项目的训练。

    %cd /home/mw/project/mmdetection
    !python ./tools/train.py ./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py --work-dir /home/mw/work/work_dir
    

    当看到程序运行显示以下内容,表示程序已经成功进行训练。

    02/29 06:00:41 - mmengine - INFO - Epoch(train)  [1][  50/5000]  lr: 1.9820e-03  eta: 9:34:04  time: 0.5746  data_time: 0.0061  memory: 3606  loss: 1.4120  loss_rpn_cls: 0.4417  loss_rpn_bbox: 0.0850  loss_cls: 0.8184  acc: 92.2852  loss_bbox: 0.0669
    02/29 06:01:08 - mmengine - INFO - Epoch(train)  [1][ 100/5000]  lr: 3.9840e-03  eta: 9:17:54  time: 0.5431  data_time: 0.0047  memory: 3606  loss: 0.7339  loss_rpn_cls: 0.1702  loss_rpn_bbox: 0.0733  loss_cls: 0.3048  acc: 95.0195  loss_bbox: 0.1856
    ...
    
  2. 离线训练

    本程序训练需要12个epoch,训练时长需要8~10个小时,在线训练需要保持一直联网,不然就会断掉,所以建议放到离线环境上运行。

    当以上步骤全部跑通后,测试项目是否可以点击 “运行全部” 就可以执行所有代码,完成项目训练。如果可以,则可以放在离线任务中训练。

    在长达10个小时的离线训练后,终于完成了离线训练,可以在云平台的离线训练日志中,看到训练进度以及资源占用。

    image-20240302130335293

    image-20240302130411320

  3. 训练结果分析

    训练结束后在work_dirs文件夹中存储训练项目日志以及保存的模型。

    项目运行结束后,最后一轮训练结果如下。

    image-20240301230910260

    模型采用了平均精度 (AP)平均召回率 (AR)IoUmaxDetsArea 四个维度对模型进行评估,下面介绍以上信息具体内容。

    • IoU(Intersection over Union)

      IoU 是一个用于评估目标检测模型性能的常见指标。它衡量了模型预测的边界框(bounding box)与真实边界框之间的重叠程度。

    • 目标对象大小 Area

      MMDetection 将 Area 分为三类:small, medium, 和 large,代表了小、中、大不同尺寸的目标。

    • maxDets (Maximum Detections)

      maxDets用于限制每张图像或每个类别的最大检测数量。限制每个图像或每个类别的最大检测数,以便更全面地评估模型的准确性。

    • 平均精度 AP (Average Precision)

      平均精度是在不同IoU阈值下计算出的精度的平均值,是指模型预测为正类别的样本中有多少是真正的正例。

      • 在所有的目标尺寸上,IoU 从 0.50 到 0.95 的平均精度 (AP) 为 0.290;IoU 为 0.50 时平均精度(AP)最高,达到0.492;IoU 为 0.75 时平均精度(AP)为0.293。

        可以看出,AP 的计算中,更高的 IoU 阈值通常对模型提出更严格的要求。

      • 当 IoU 在0.5到0.95之间,小目标的平均精度(AP) 最低,只有0.120;中等目标的平均精度(AP) 为0.321;大目标的平均精度(AP) 最高,为0.456。

        可以看出,对识别尺寸越大的目标,模型的平均精度(AP) 就越高。

    • 平均召回率 AR (Average Recall)

      平均召回率是在不同IoU阈值下计算出的召回率的平均值,是指所有真正的正例中,模型成功预测为正类别的比例。

      • 在所有的目标尺寸上,当IoU 在 0.50 到 0.95 之间,在maxDets 为100、300、1000的平均召回率 (AR) 都为 0.449。

        可以看出maxDets 对AR没有影响。

      • 当 IoU 在0.5到0.95之间,小目标的平均召回率(AR) 最低,只有0.252;中等目标的平均召回率(AR)为0.482;大目标的平均召回率(AR)最高,为0.642。

        可以看出,对识别尺寸越大的目标,模型的平均召回率 (AR) 就越高。

3 在本地训练基础代码

​ 因为云平台环境配置总容易出问题,之后我便换到了本地进行训练以及进一步的测试。

3.1 环境配置

​ 环境配置和云平台类似,可以通过查看 MMDetection文档 来完成配置。

  1. 创建并激活一个 conda 环境

    conda create --name openmmlab python=3.8 -y
    conda activate openmmlab
    
  2. 基于 Pytorch官方平台 安装Pytorch

    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
    
  3. 使用 MIM 安装 MMEngine 和 MMCV

    pip install -U openmim
    mim install mmengine
    mim install "mmcv>=2.0.0"
    
  4. 安装 MMDetection

    git clone https://github.com/open-mmlab/mmdetection.git
    cd mmdetection
    pip install -v -e .
    

    安装完成后,会生成一个mmdetection文件夹。

  5. 文件配置

    • test.json置于mmdetection/[数据集所在路径]/dataset_release路径下。

    • faster_rcnn_r50_fpn_1x_didi.py 复制到 mmdetection/configs/faster_rcnn路径下。

    • didi_detection.py 复制到mmdetection/configs/_base_/datasets路径下,并将data_root变量修改为数据集所在路径。

      data_root = 'xxxx/dataset_release/'
      

3.2 项目训练

  1. 训练项目

    在mmdetection文件夹下,通过命令行窗口执行以下命令。

    python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py
    

    显示以下内容,说明成功开始训练。

    02/29 06:00:41 - mmengine - INFO - Epoch(train)  [1][  50/5000]  lr: 1.9820e-03  eta: 9:34:04  time: 0.5746  data_time: 0.0061  memory: 3606  loss: 1.4120  loss_rpn_cls: 0.4417  loss_rpn_bbox: 0.0850  loss_cls: 0.8184  acc: 92.2852  loss_bbox: 0.0669
    02/29 06:01:08 - mmengine - INFO - Epoch(train)  [1][ 100/5000]  lr: 3.9840e-03  eta: 9:17:54  time: 0.5431  data_time: 0.0047  memory: 3606  loss: 0.7339  loss_rpn_cls: 0.1702  loss_rpn_bbox: 0.0733  loss_cls: 0.3048  acc: 95.0195  loss_bbox: 0.1856
    ...
    

    注意,训练时长还是比较长的,我是4060的显卡,训练时间大约有6个小时

  2. 训练结果分析

    在命令行窗口训练,输出的结果只显示在窗口中,但是在文件夹中存有了log日志文件。

    .\mmdetection\work_dirs\faster_rcnn_r50_fpn_1x_didi\20240229_232911文件夹下,有以下文件:

    20240229_232911
    ├── 20240229_232911.log			# 训练日志文件
    ├── vis_data
    │   ├── 20240229_232911.json	# 与scalars.json相同
    │   ├── config.py				# 训练配置信息:包括训练的模型、数据集地址等信息
    │   ├── scalars.json			# 训练数据信息:包括每轮训练的loss、mAP等信息
    

    可以从 20240229_232911.log 中的最后,看到第12轮训练的结果。

    2024/03/01 05:26:41 - mmengine - INFO - bbox_mAP_copypaste: 0.283 0.476 0.289 0.126 0.303 0.447
    2024/03/01 05:26:41 - mmengine - INFO - Epoch(val) [12][500/500]    coco/bbox_mAP: 0.2830  coco/bbox_mAP_50: 0.4760  coco/bbox_mAP_75: 0.2890  coco/bbox_mAP_s: 0.1260  coco/bbox_mAP_m: 0.3030  coco/bbox_mAP_l: 0.4470  data_time: 0.0014  time: 0.1407
    
  3. 训练日志分析

    其中,通过tools/analysis_tools/analyze_logs.py 可利用指定的训练 log 文件绘制 loss 曲线图, 第一次运行前请先运行 pip install seaborn 安装必要依赖。

    python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json --keys loss_cls loss_bbox  --legend loss_cls loss_bbox --out work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/log.png
    

    log2

    • loss_cls (分类损失): 这是用于目标检测任务中的分类损失。它通常使用交叉熵损失函数来计算模型预测的类别与真实类别之间的差异。如果使用sigmoid激活函数,则采用二元交叉熵损失。
    • loss_bbox (边界框回归损失): 这是用于目标检测中的边界框回归损失。它计算模型预测的边界框与真实边界框之间的差异。常用的损失函数包括L1Loss、SmoothL1Loss、IoULoss等。
    python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json --keys loss_rpn_cls loss_rpn_bbox  --legend loss_rpn_cls loss_rpn_bbox --out work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/log2.png
    

    image-20240311205435858

    • loss_rpn_cls (RPN分类损失): 这是区域提议网络(RPN)的分类损失,用于评估RPN预测的锚点是前景还是背景的准确性。这通常也使用交叉熵损失函数。
    • loss_rpn_bbox (RPN边界框回归损失): 这是RPN的边界框回归损失,用于评估RPN预测的锚点边界框与真实边界框之间的差异。这通常使用SmoothL1Loss作为损失函数。
    python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json --keys loss_cls loss_bbox loss_rpn_cls loss_rpn_bbox  --legend loss_cls loss_bbox loss_rpn_cls loss_rpn_bbox --out work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/log3.png
    

    log3

3.3 项目测试

  1. 在测试集测试性能

    利用 MMDetection 的 test.py ,对数据集上进行测试,对交通图像进行标注。

    python ./tools/test.py ./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py ./work_dirs/faster_rcnn_r50_fpn_1x_didi/epoch_12.pth  --out ./work_dirs/faster_rcnn_r50_fpn_1x_didi/result.pkl --show-dir ./work_dir/faster_rcnn_r50_fpn_1x_didi/test_show/
    

    输出结果如下:

    image-20240302165333266

    生成了一个 result.pkl 文件,并得到了以下测试图片:

    11000

    image-20240302160145463

  2. 结果分析

    输入以下指令,利用 analyze_results.py 对生成的.pkl文件进行结果分析。

    python ./tools/analysis_tools/analyze_results.py ./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py ./work_dirs/faster_rcnn_r50_fpn_1x_didi/result.pkl ./work_dirs/faster_rcnn_r50_fpn_1x_didi/analyze_results
    

    发现在本次实验中,生成的pkl文件无法正常的使用,得到的测试图片如下。

    b73bd659498c79291981b4cec79d32a

  3. 绘制混淆矩阵

    同样的,显示混淆矩阵时也发生错误。

    python ./tools/analysis_tools/confusion_matrix.py ./configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py ./work_dirs/faster_rcnn_r50_fpn_1x_didi/result.pkl ./work_dirs/faster_rcnn_r50_fpn_1x_didi/confusion_matrix --show
    

    confusion_matrix

    分析感觉是数据集格式问题,测试集不存在ground truth label,导致不能正确的生成pkl文件,进行进一步分析,最终也没有解决。但是在使用test.py,可以得到.bbox.json文件,里面存储着预测信息,具体如下。

    [{"image_id": 11453, "bbox": [788.5220336914062, 496.3249816894531, 78.60833740234375, 48.751312255859375], "score": 0.998957633972168, "category_id": 1}, {"image_id": 11453, "bbox": [893.9302368164062, 498.6480407714844, 50.187744140625, 36.162445068359375], "score": 0.9979375600814819, "category_id": 1}, {"image_id": 11453, "bbox": [981.7869873046875, 487.6568908691406, 76.1290283203125, 62.054718017578125], "score": 0.9976244568824768, "category_id": 1},...
    

4 算法优化

4.1 Cascade R-CNN

​ 通过搜索相关资料,尝试将 Faster R-CNN 算法替换为 Cascade R-CNN 算法。

  1. Cascade R-CNN 算法

    Cascade R-CNN是一种高效的目标检测算法,它通过级联(cascade)多个检测器(detector)来逐步提高检测的质量。每个检测器都在不同的IoU阈值上进行训练,以优化对应质量级别的预测。这种方法有效地解决了单一IoU阈值检测器面临的问题,如过拟合和mismatch问题。

    算法结构:

    Cascade R-CNN在Faster R-CNN的基础上进行了扩展。

    • 第一阶段是进行候选区域提取的子网络 H 0 H0 H0 ,应用于整张图片。
    • 第二个阶段进行RoI检测的子网络 H 1 H1 H1 ,最后会有一个分类分数 C C C,边界框 B B B

    image-20240317154945623

  2. 修改训练脚本

    建立cascade_rcnn_r50_fpn_1x_didi.py训练脚本,并放置在mmdetection\configs\cascade_rcnn路径下,脚本内容如下。

    _base_ = [
        '../_base_/models/cascade-rcnn_r50_fpn.py',
        '../_base_/datasets/didi_detection.py',
        '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
    ]
    
  3. 项目训练

    • 训练

      输入以下命令进行训练。

      python tools/train.py configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_didi.py
      

      image-20240311073205349

    • 训练结果分析

      将 Faster R-CNN 和 Cascade R-CNN 各项参数以表格形式对比,结果如下。

      参数Faster R-CNNCascade R-CNN
      coco/bbox_mAP0.2900.294
      coco/bbox_mAP_500.4920.476
      coco/bbox_mAP_750.2930.307
      coco/bbox_mAP_s0.1200.130
      coco/bbox_mAP_m0.3210.322
      coco/bbox_mAP_l0.4560.462
      coco/bbox_mAR_1000.4490.454
      coco/bbox_mAR_3000.4490.454
      coco/bbox_mAR_10000.4490.454
      coco/bbox_mAR_s0.2520.260
      coco/bbox_mAR_m0.4820.486
      coco/bbox_mAR_l0.6420.636

      可以看到,除了 coco/bbox_mAP_50coco/bbox_mAR_l 这两个参数以外,Cascade R-CNN 的表现都优于 Faster R-CNN。

    • 训练日志分析

      输入以下指令,进行日志分析。

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237.json --keys loss_rpn_cls loss_rpn_bbox  --legend loss_rpn_cls loss_rpn_bbox --out work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/log.png
      

      image-20240311204843122

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237.json --keys s0.loss_cls s0.loss_bbox s1.loss_cls s1.loss_bbox s2.loss_cls s2.loss_bbox --legend s0.loss_cls s0.loss_bbox s1.loss_cls s1.loss_bbox s2.loss_cls s2.loss_bbox --out work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/log2.png
      

      image-20240311205106294

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237.json --keys loss --legend Faster_RCNN_loss Cascade_RCNN_loss --out work_dirs/log_compare
      

      image-20240311210437589

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237_2.json --keys acc --legend Faster_RCNN_acc Cascade_RCNN_acc --out work_dirs/log_compare2
      

      image-20240311211325835

  4. 测试

    在测试集测试性能

    利用 MMDetection 的 test.py ,对数据集上进行测试,对交通图像进行标注。

    python ./tools/test.py ./configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_didi.py ./work_dirs/cascade_rcnn_r50_fpn_1x_didi/epoch_12.pth --show-dir ./test_show/
    

    对比 Faster R-CNN 与 Cascade R-CNN 对测试图像的标注结果,上图为Faster R-CNN,下图为 Cascade R-CNN。

    image-20240311213404806

    image-20240311213450990

    可以看到,下图对各个车辆的预测值更高,并且左侧有一个模糊的货车,Cascade R-CNN 成功的预测正确,标签为van:79.2,而 Faster R-CNN 将其重复预测,并且标注标签为car:32.3 标注错误。右侧行人,Cascade R-CNN成功将其标注,而 Faster R-CNN 并没有将其标注出来。

    d63dd3b6f0a346abb4bfe467498d5d7

    c2c59a09dfb905d34195b1fa222d248

    对比可知,Cascade R-CNN 预测效果优于 Faster R-CNN。

4.2 RegNet替换ResNet50 backbone

  1. RegNet

    RegNet是一个基于网络宽度、深度和分辨率等因素来搜索最佳神经网络架构的算法。它的设计理念是通过网络设计空间的逐步简化来找到易于理解、构建和泛化的模型。它结合了手动设计网络和神经网络搜索(NAS)的优点,旨在提高模型的可解释性和性能)。

    faster_rcnn 文件夹中,新建了一个 faster_rcnn_regnet_fpn.py 。修改 backbone 框架,将原来的 ResNet50 框架替换为 RegNet。因为骨架有变动,所以也将输入调到合适的参数in_channels=[96,192, 432, 1008]

        backbone=dict(
            type='RegNet',
            arch='regnetx_3.2gf',
            out_indices=(0,1,2,3),
            frozen_stages=1,
            norm_cfg=dict(type='BN', requires_grad=True),
            norm_eval=True,
            style='pytorch',
            init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')),
        neck=dict(
            type='FPN',
            in_channels=[96,192, 432, 1008],
            out_channels=256,
            num_outs=5),
    
  2. 模型训练

    输入以下指令进行训练。

    python tools/train.py configs/faster_rcnn/faster_rcnn_regnet_fpn.py
    

    image-20240312202449754

    将FasterRCNN的 ResNet50 和 RegNet框架 与 Cascade RCNN 的训练结果以表格形式对比,结果如下。

    参数ResNet50RegNetCascade R-CNN
    coco/bbox_mAP0.2900.2900.294
    coco/bbox_mAP_500.4920.4850.476
    coco/bbox_mAP_750.2930.2980.307
    coco/bbox_mAP_s0.1200.1210.130
    coco/bbox_mAP_m0.3210.3240.322
    coco/bbox_mAP_l0.4560.4480.462
    coco/bbox_mAR_1000.4490.4570.454
    coco/bbox_mAR_3000.4490.4570.454
    coco/bbox_mAR_10000.4490.4570.454
    coco/bbox_mAR_s0.2520.2540.260
    coco/bbox_mAR_m0.4820.4960.486
    coco/bbox_mAR_l0.6420.6370.636

    可以看到,RegNet相比于ResNet在大部分参数上都有所提升,有效的提升了目标检查能力。

  3. 训练日志分析

    • 对比3类实验的loss

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237.json work_dirs/faster_rcnn_regnet_fpn/20240312_011910/vis_data/20240312_011910.json --keys loss --legend Faster_RCNN_loss Cascade_RCNN_loss Faster_RCNN_regnet_loss --out work_dirs/log_compare_loss3
      

      image-20240312224718236

    • 对比3个的训练集精准度

      python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_didi/20240229_232911/vis_data/20240229_232911.json work_dirs/cascade_rcnn_r50_fpn_1x_didi/20240310_230237/vis_data/20240310_230237_2.json work_dirs/faster_rcnn_regnet_fpn/20240312_011910/vis_data/20240312_011910.json --keys acc --legend Faster_RCNN_acc Cascade_RCNN_acc Faster_RCNN_regnet_acc --out work_dirs/log_compare_acc3
      

      image-20240312224413215

    根据以上对比结果可知,使用RegNet替换ResNet50,loss值与之前相近,准确率较好于ResNet50骨架,但是不如Cascade RCNN。

  4. 模型测试

    python ./tools/test.py ./configs/faster_rcnn/faster_rcnn_regnet_fpn.py ./work_dirs/faster_rcnn_regnet_fpn/epoch_12.pth --show-dir ./test_show/
    

    下图为Faster RCNN采用ResNet50架构,预测的图片。

    image-20240317161607807

    image-20240317162033064

    下图为Faster RCNN采用RegNet架构,预测的图片。

    image-20240317161615907

    image-20240317162128472

    可以看到,采用 RegNet 预测的汽车与人更加准确,比采用 ResNet 的Faster RCNN 预测出了更多的汽车和人物。

5 总结

​ 本次实验在云平台和本地分别跑了基础的 Faster RCNN 算法,进交通目标检查,并分析其结果。然后分别替换了算法和骨架,尝试了用 Cascade RCNN 算法替换 Faster RCNN 算法;用 RegNet 替换 ResNet50,并分析结果。发现使用 Cascade RCNN 算法进行交通目标检查,结果最好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/465891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7 安装ErLang语言环境

在线搜索适合当前linux系统的epel在线安装。 yum -y install epel-release下载erlang-solutions安装包。 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm离线安装erlang-solutions安装包。 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm在线…

项目性能优化—使用JMeter压测SpringBoot项目

项目性能优化—使用JMeter压测SpringBoot项目 我们的压力测试架构图如下&#xff1a; 配置JMeter 在JMeter的bin目录&#xff0c;双击jmeter.bat 新建一个测试计划&#xff0c;并右键添加线程组&#xff1a; 进行配置 一共会发生4万次请求。 ctrl s保存&#xff1b; 添加h…

Aigtek电压放大器的作用及优点是什么

电压放大器是电子技术领域中重要的设备&#xff0c;其作用是将输入信号的电压放大到所需的输出电压水平。电压放大器具有多种优点&#xff0c;下面安泰电子将详细介绍其作用及主要优点。 电压放大器的主要作用是增加信号的电压幅值。通过放大信号的电压&#xff0c;可以增强信号…

网络架构层_服务器上下行宽带

网络架构层_服务器上下行宽带 解释一 云服务器ECS网络带宽的概念、计费、安全及使用限制_云服务器 ECS(ECS)-阿里云帮助中心 网络带宽是指在单位时间&#xff08;一般指的是1秒钟&#xff09;内能传输的数据量&#xff0c;带宽数值越大表示传输能力越强&#xff0c;即在单位…

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…

深入浅出Go的`encoding/xml`库:实战开发指南

深入浅出Go的encoding/xml库&#xff1a;实战开发指南 引言基本概念XML简介Go语言中的XML处理结构体标签&#xff08;Struct Tags&#xff09; 解析XML数据使用xml.Unmarshal解析XML结构体标签详解处理常见解析问题 生成XML数据使用xml.Marshal生成XML使用xml.MarshalIndent优化…

Linux服务器磁盘更改挂载目录

linux服务器磁盘弹性扩容时&#xff0c;会出现没有挂载到理想的目录下&#xff0c;这时候就需要通过命令从新挂载目录&#xff0c;以下示例是把默认挂载目录/home更改为/data 1,df -lh ####查看现有挂载信息 2.lsblk ###查看文件形式&#xff0c;确保原有数据盘文件结构。 3.…

团队如何限制合适的在制品(WIP)数量?

看板之父David Anderson曾说过“看板的本质是一个很朴素的思想&#xff1a;在制品必须被限制。”但对于团队来说&#xff0c;确定一个合适的在制品限制可能是件棘手的事。 在《看板快速启动指南》一文中&#xff0c;我们已经初步了解如何打造一个看板&#xff0c;今天我们来一…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

python网络编程:通过socket实现TCP客户端和服务端

目录 写在开头 socket服务端&#xff08;基础&#xff09; socket客户端&#xff08;基础&#xff09; 服务端实现&#xff08;可连接多个客户端&#xff09; 客户端实现 数据收发效果 写在开头 近期可能会用python实现一些网络安全工具&#xff0c;涉及到许多关于网络…

PythonWeb——Django框架

框架介绍 1.什么是框架? 框架就是程序的骨架&#xff0c;主体结构&#xff0c;也是个半成品。 2.框架的优缺点 可重用、成熟,稳健、易扩展、易维护 3.Python中常见的框架 大包大揽 Django被官方称之为完美主义者的Web框架。力求精简web.py和Tornado新生代微框架Flask和B…

hadoop分布式环境ssh设置免密登陆之后目标主机更换无法连接解决

在进行hadoop分布式环境搭建时&#xff08;三台机&#xff0c;master&#xff0c;slave1&#xff0c;slave2&#xff09;&#xff0c;后期slave2系统出现问题&#xff0c;更换新机后&#xff0c;master与slave2文件传输失败&#xff1a; 以为是秘钥过期的问题&#xff0c;更换…

【Linux】一文解决如何在终端查看 python解释器 的位置

【Linux】一文解决如何在终端查看 python解释器 的位置 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

Github主页设置贪吃蛇详细教程

先看最终实现结果&#xff1a; 有条贪吃蛇放在主页还是蛮酷的哈哈哈。接下来我来讲一讲怎么在Github主页添加一条贪吃蛇。 首先要修改自己的Github的主页&#xff0c;我们得有一个特殊的仓库——这个仓库必须与你的Github用户名保持一致&#xff0c;并且需要公开&#xff0c…

静默快速安装oracle 19c

静默快速安装oracle 19c 1.配置yum源 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包&#xff1b; rpm -qa|grep yum >oldyum.pkg 备份原信息rpm -qa|grep yum|xargs rpm -e --nodeps 不检查依赖&#xff0c;直接删除rpm包 1232.自行下载所需要的软件包。包名会…

求解3、4、6自由度仿射变换矩阵

说明&#xff1a;一开始将目光放在了opencv上&#xff0c;发现只有4、6自由度的仿射变换求解&#xff0c;后来发现skimage十分强大。 注&#xff1a;美中不足的是&#xff0c;skimage的实现没有RANSAC。 function&#xff1a;skimage.transform.estimate_transform() ttypeeu…

【SpringMVC】SpringMVC的整体执行流程

概述&#xff1a;MVC是一种设计模式&#xff0c;SpringMVC是按照MVC模式实现的优秀框架&#xff0c;可以帮助我们更简洁的完成Web开发&#xff0c;并且天然与Spring集成。后端项目分为Service层&#xff08;处理业务&#xff09;、Dao层&#xff08;数据库操作&#xff09;、En…

Java复习03 多线程

Java复习03 多线程 初学的时候 我的问题是 多线程是什么意思&#xff1f;进程和线程的区别&#xff1f; 线程创建的方式是什么&#xff1f;线程的状态是什么意思&#xff1f;分为哪几类&#xff1f;线程同步又是什么意思&#xff1f;有哪几种情况 &#xff1f;静态代理是什么意…

外贸人自己的时间管理方法,建议收藏

“最近忙吗&#xff1f;”好像取代“吃了吗”&#xff0c;成为外贸生活非常常见的问候了&#xff0c;有些人可能是真的很忙&#xff0c;有的人的忙可能是因为没有计划跟安排造成了的。 其实业务做的时间长了&#xff0c;容易形成惯性&#xff0c;做事情一成不变&#xff0c;按…