案例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是测试集上的结果(学生不可见,用于最后评分)。
图3: 参考程序训练完成后在验证集上的mAP结果
图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文件夹 空间不足。
运行程序,上传本地文件,到project文件夹。
2.2 项目配置
本环节需要配置 MMdetection 的环境,根据文档内容,下载安装一些必备库。
-
更新pip
之后安装的库,需要高版本的pip,所以需要先更新pip。在Jupyter的代码框中,运行以下命令。
!pip install --upgrade pip
-
将
test.json
置于/home/mw/input/datasets1367/dataset/dataset_release
文件夹中在Jupyter的代码框中,运行以下命令,完成文件的拷贝。
%cp /home/mw/project/test.json /home/mw/input/datasets1367/dataset/dataset_release
-
用 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 ...
等内容。 -
使用源码安装 MMDetection
!git clone https://github.com/open-mmlab/mmdetection.git %cd mmdetection !pip install -e .
安装完成后,project文件夹中,会出现mmdetection文件夹。
-
文件配置
将
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 项目训练
-
在线训练
在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 ...
-
离线训练
本程序训练需要12个epoch,训练时长需要8~10个小时,在线训练需要保持一直联网,不然就会断掉,所以建议放到离线环境上运行。
当以上步骤全部跑通后,测试项目是否可以点击 “运行全部” 就可以执行所有代码,完成项目训练。如果可以,则可以放在离线任务中训练。
在长达10个小时的离线训练后,终于完成了离线训练,可以在云平台的离线训练日志中,看到训练进度以及资源占用。
-
训练结果分析
训练结束后在work_dirs文件夹中存储训练项目日志以及保存的模型。
项目运行结束后,最后一轮训练结果如下。
模型采用了平均精度 (AP)、平均召回率 (AR) 、IoU 、maxDets 和 Area 四个维度对模型进行评估,下面介绍以上信息具体内容。
-
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文档 来完成配置。
-
创建并激活一个 conda 环境
conda create --name openmmlab python=3.8 -y conda activate openmmlab
-
基于 Pytorch官方平台 安装Pytorch
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
-
使用 MIM 安装 MMEngine 和 MMCV
pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0"
-
安装 MMDetection
git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection pip install -v -e .
安装完成后,会生成一个mmdetection文件夹。
-
文件配置
-
将
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 项目训练
-
训练项目
在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个小时
-
训练结果分析
在命令行窗口训练,输出的结果只显示在窗口中,但是在文件夹中存有了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
-
训练日志分析
其中,通过
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
- 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
- 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
3.3 项目测试
-
在测试集测试性能
利用 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/
输出结果如下:
生成了一个
result.pkl
文件,并得到了以下测试图片: -
结果分析
输入以下指令,利用
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文件无法正常的使用,得到的测试图片如下。
-
绘制混淆矩阵
同样的,显示混淆矩阵时也发生错误。
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
分析感觉是数据集格式问题,测试集不存在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 算法。
-
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。
-
修改训练脚本
建立
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' ]
-
项目训练
-
训练
输入以下命令进行训练。
python tools/train.py configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_didi.py
-
训练结果分析
将 Faster R-CNN 和 Cascade R-CNN 各项参数以表格形式对比,结果如下。
参数 Faster R-CNN Cascade R-CNN coco/bbox_mAP 0.290 0.294 coco/bbox_mAP_50 0.492 0.476 coco/bbox_mAP_75 0.293 0.307 coco/bbox_mAP_s 0.120 0.130 coco/bbox_mAP_m 0.321 0.322 coco/bbox_mAP_l 0.456 0.462 coco/bbox_mAR_100 0.449 0.454 coco/bbox_mAR_300 0.449 0.454 coco/bbox_mAR_1000 0.449 0.454 coco/bbox_mAR_s 0.252 0.260 coco/bbox_mAR_m 0.482 0.486 coco/bbox_mAR_l 0.642 0.636 可以看到,除了 coco/bbox_mAP_50 、coco/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
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
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
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
-
-
测试
在测试集测试性能
利用 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。
可以看到,下图对各个车辆的预测值更高,并且左侧有一个模糊的货车,Cascade R-CNN 成功的预测正确,标签为
van:79.2
,而 Faster R-CNN 将其重复预测,并且标注标签为car:32.3
标注错误。右侧行人,Cascade R-CNN成功将其标注,而 Faster R-CNN 并没有将其标注出来。对比可知,Cascade R-CNN 预测效果优于 Faster R-CNN。
4.2 RegNet替换ResNet50 backbone
-
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),
-
模型训练
输入以下指令进行训练。
python tools/train.py configs/faster_rcnn/faster_rcnn_regnet_fpn.py
将FasterRCNN的 ResNet50 和 RegNet框架 与 Cascade RCNN 的训练结果以表格形式对比,结果如下。
参数 ResNet50 RegNet Cascade R-CNN coco/bbox_mAP 0.290 0.290 0.294 coco/bbox_mAP_50 0.492 0.485 0.476 coco/bbox_mAP_75 0.293 0.298 0.307 coco/bbox_mAP_s 0.120 0.121 0.130 coco/bbox_mAP_m 0.321 0.324 0.322 coco/bbox_mAP_l 0.456 0.448 0.462 coco/bbox_mAR_100 0.449 0.457 0.454 coco/bbox_mAR_300 0.449 0.457 0.454 coco/bbox_mAR_1000 0.449 0.457 0.454 coco/bbox_mAR_s 0.252 0.254 0.260 coco/bbox_mAR_m 0.482 0.496 0.486 coco/bbox_mAR_l 0.642 0.637 0.636 可以看到,RegNet相比于ResNet在大部分参数上都有所提升,有效的提升了目标检查能力。
-
训练日志分析
-
对比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
-
对比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
根据以上对比结果可知,使用RegNet替换ResNet50,loss值与之前相近,准确率较好于ResNet50骨架,但是不如Cascade RCNN。
-
-
模型测试
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架构,预测的图片。
下图为Faster RCNN采用RegNet架构,预测的图片。
可以看到,采用 RegNet 预测的汽车与人更加准确,比采用 ResNet 的Faster RCNN 预测出了更多的汽车和人物。
5 总结
本次实验在云平台和本地分别跑了基础的 Faster RCNN 算法,进交通目标检查,并分析其结果。然后分别替换了算法和骨架,尝试了用 Cascade RCNN 算法替换 Faster RCNN 算法;用 RegNet 替换 ResNet50,并分析结果。发现使用 Cascade RCNN 算法进行交通目标检查,结果最好。