我的AI之路(48)--用同一自有数据集训练和比较CenterNet、EfficientDet、Cascade-RCNN的实际识别效果

本文对比了CenterNet、EfficientDet及两种配置的Cascade-RCNN在自定义数据集上的实际性能。测试涵盖AI服务器与Xavier板的识别速度,及694张图片的误识别与召回率,揭示各模型的优势与局限。

     目标检测模型的发布论文一般给出了基于VOC或COCO等数据集的AP和AR等指标值,这个可以作为比较选择模型的一个参考,实际效果怎么样还是得自己动手实验了才知道真实效果是怎么样,最好采用需要在实际项目中应用的自己制作的同一数据集来训练和比较比较直观和有说服力。

     近两个月来断断续续用一部分时间使用同一自有数据集(内有1个类别)完成了CenterNet、EfficientDet(backbone是adv EfficientNet b7)的训练、为加快进度,让同事同时完成了backbone分别采用ResNet101和HRNet的Cascade-RCNN的训练,最后我测试比较这四种训练出来的模型的效果如下:

1)EfficientDet的理论指标值:

2)CenterNet的理论指标值: 

 3)Cascade-RCNN(HRNet)的理论指标值:

4)Cascade-RCNN(ResNet101)的理论指标值: 

<think>我们使用mmdetection框架来训练测试自定义数据集上的Faster R-CNN、Cascade R-CNNRetinaNet模型。以下是详细步骤: ### 1. 准备自定义数据集 首先,需要将自定义数据集转换为COCO格式或PASCAL VOC格式。mmdetection支持这两种格式。这里以COCO格式为例。 COCO格式的标注文件为JSON文件,包含以下主要字段: - `images`: 每个图像的信息(id, file_name, width, height) - `annotations`: 每个实例标注(id, image_id, category_id, bbox, area, iscrowd) - `categories`: 类别列表(id, name) 例如: ```json { "images": [ { "id": 1, "file_name": "image1.jpg", "width": 640, "height": 480 }, ... ], "annotations": [ { "id": 1, "image_id": 1, "category_id": 1, "bbox": [50, 60, 200, 300], "area": 60000, "iscrowd": 0 }, ... ], "categories": [ { "id": 1, "name": "cat" }, ... ] } ``` 将数据集按照以下结构组织: ``` mmdetection ├── data │ └── coco │ ├── annotations │ │ ├── train.json │ │ ├── val.json │ │ └── test.json (可选) │ ├── train │ │ ├── image1.jpg │ │ └── ... │ ├── val │ │ ├── image2.jpg │ │ └── ... │ └── test (可选) │ ├── image3.jpg │ └── ... ``` ### 2. 修改配置文件 mmdetection使用配置文件来定义模型训练参数。每个模型都有对应的配置文件,位于`configs`目录下。 #### (1) 修改类别数 在配置文件中,需要修改`model`中的`num_classes`参数,将其改为自定义数据集的类别数(包括背景,通常背景也算一类,但mmdetection中会自动处理,所以这里只需要设置为实际类别数,不包括背景)。注意,对于Faster R-CNN、Cascade R-CNNRetinaNet,需要修改的位置可能不同,一般是在`roi_head`或`bbox_head`中。 例如,对于Faster R-CNN(配置文件`configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py`),修改: ```python model = dict( roi_head=dict( bbox_head=dict(num_classes=2) # 假设有2个类别(不包括背景) ) ) ``` 对于Cascade R-CNN(配置文件`configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py`),修改: ```python model = dict( roi_head=dict( bbox_head=[ dict(num_classes=2), dict(num_classes=2), dict(num_classes=2) ] ) ) ``` 对于RetinaNet(配置文件`configs/retinanet/retinanet_r50_fpn_1x_coco.py`),修改: ```python model = dict( bbox_head=dict(num_classes=2) ) ``` #### (2) 修改数据集路径类别名称 我们可以通过修改配置文件中的`data`部分来指定数据集路径。通常,我们会创建一个新的配置文件(例如`my_config.py`),继承基础配置文件,并覆盖相关设置。 例如,对于Faster R-CNN,创建`configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py`: ```python _base_ = './faster_rcnn_r50_fpn_1x_coco.py' # 修改数据集相关设置 dataset_type = 'COCODataset' classes = ('crack', 'hole',) # 自定义数据集的类别名称 data = dict( samples_per_gpu=2, # 根据GPU内存调整 workers_per_gpu=2, train=dict( img_prefix='data/coco/train/', classes=classes, ann_file='data/coco/annotations/train.json' ), val=dict( img_prefix='data/coco/val/', classes=classes, ann_file='data/coco/annotations/val.json' ), test=dict( img_prefix='data/coco/val/', classes=classes, ann_file='data/coco/annotations/val.json' ) ) ``` 同样,为Cascade R-CNNRetinaNet创建类似的配置文件。 ### 3. 下载预训练模型 从mmdetection的模型库中下载对应的预训练模型,并放置在`checkpoints`目录下。例如: - Faster R-CNN: [faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) - Cascade R-CNN: [cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth) - RetinaNet: [retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth) ### 4. 训练模型 使用以下命令进行训练(以Faster R-CNN为例): ```bash python tools/train.py configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py --work-dir work_dirs/faster_rcnn ``` 其中: - `configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py` 是配置文件路径 - `--work-dir` 指定输出目录 同样,训练Cascade R-CNNRetinaNet: ```bash # Cascade R-CNN python tools/train.py configs/cascade_rcnn/my_cascade_rcnn_r50_fpn_1x_coco.py --work-dir work_dirs/cascade_rcnn # RetinaNet python tools/train.py configs/retinanet/my_retinanet_r50_fpn_1x_coco.py --work-dir work_dirs/retinanet ``` ### 5. 测试模型 训练完成后,使用以下命令测试模型(以Faster R-CNN为例): ```bash python tools/test.py configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py work_dirs/faster_rcnn/latest.pth --eval bbox ``` 其中: - `configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py` 是配置文件 - `work_dirs/faster_rcnn/latest.pth` 是训练得到的模型权重 - `--eval bbox` 表示评估bbox的指标(对于RetinaNet同样使用bbox,对于Cascade R-CNN也可以使用bbox) 同样,测试其他模型: ```bash # Cascade R-CNN python tools/test.py configs/cascade_rcnn/my_cascade_rcnn_r50_fpn_1x_coco.py work_dirs/cascade_rcnn/latest.pth --eval bbox # RetinaNet python tools/test.py configs/retinanet/my_retinanet_r50_fpn_1x_coco.py work_dirs/retinanet/latest.pth --eval bbox ``` ### 6. 可视化结果 可以使用`tools/test.py`结合`--show`选项来显示结果,或者使用`tools/analysis_tools/analyze_results.py`来可视化并保存结果。 例如: ```bash python tools/test.py configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py work_dirs/faster_rcnn/latest.pth --show-dir results/faster_rcnn ``` 这将在`results/faster_rcnn`目录下保存带有预测框的图像。 ### 注意事项 - 如果数据集较小,可以减小学习率或减少训练轮数(epochs)以防止过拟合。 - 训练时如果出现内存不足(OOM)错误,可以减小`data`设置中的`samples_per_gpu`(即batch size)`workers_per_gpu`。 - 可以使用分布式训练,例如在8个GPU上训练(每个GPU2张图像): ```bash bash tools/dist_train.sh configs/faster_rcnn/my_faster_rcnn_r50_fpn_1x_coco.py 8 --work-dir work_dirs/faster_rcnn ``` 通过以上步骤,您可以在自定义数据集训练测试Faster R-CNN、Cascade R-CNNRetinaNet模型。 §§相关问题§§ 1. 如何将自定义数据集转换为COCO格式? 2. 在mmdetection中如何调整学习率其他超参数? 3. 如何解决训练过程中出现的内存不足(OOM)问题? 4. 如何评估模型在测试集上的性能?</think>要在 mmdetection 框架中使用 Faster R-CNN、Cascade R-CNN RetinaNet 训练自定义数据集,请按照以下步骤操作: ### 1. 准备自定义数据集数据集转换为 COCO 格式(推荐)或 PASCAL VOC 格式: ```bash mmdetection ├── data │ └── coco │ ├── annotations │ │ ├── train.json │ │ ├── val.json │ ├── train │ │ ├── img1.jpg │ │ └── ... │ ├── val │ │ ├── img2.jpg │ │ └── ... ``` ### 2. 修改配置文件 为每个模型创建自定义配置文件(以 Faster R-CNN 为例): ```python # configs/faster_rcnn/my_faster_rcnn_r50_fpn.py _base_ = [ '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' ] # 修改数据集设置 dataset_type = 'COCODataset' classes = ('class1', 'class2', 'class3') # 你的类别名称 data = dict( samples_per_gpu=2, # 根据GPU内存调整 workers_per_gpu=2, train=dict( img_prefix='data/coco/train/', classes=classes, ann_file='data/coco/annotations/train.json' ), val=dict( img_prefix='data/coco/val/', classes=classes, ann_file='data/coco/annotations/val.json' ), test=dict( img_prefix='data/coco/val/', classes=classes, ann_file='data/coco/annotations/val.json' ) ) # 修改类别数量 (num_classes = 你的类别数 + 1) model = dict( roi_head=dict( bbox_head=dict(num_classes=len(classes)) ) ) ``` ### 3. 下载预训练权重 ```bash # Faster R-CNN wget https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth -P checkpoints/ # Cascade R-CNN wget https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth -P checkpoints/ # RetinaNet wget https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth -P checkpoints/ ``` ### 4. 训练模型 ```bash # Faster R-CNN python tools/train.py configs/faster_rcnn/my_faster_rcnn_r50_fpn.py \ --work-dir work_dirs/faster_rcnn \ --cfg-options load_from=checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth # Cascade R-CNN python tools/train.py configs/cascade_rcnn/my_cascade_rcnn_r50_fpn.py \ --work-dir work_dirs/cascade_rcnn \ --cfg-options load_from=checkpoints/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth # RetinaNet python tools/train.py configs/retinanet/my_retinanet_r50_fpn.py \ --work-dir work_dirs/retinanet \ --cfg-options load_from=checkpoints/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth ``` ### 5. 测试模型 ```bash # Faster R-CNN python tools/test.py configs/faster_rcnn/my_faster_rcnn_r50_fpn.py \ work_dirs/faster_rcnn/latest.pth \ --eval bbox # Cascade R-CNN python tools/test.py configs/cascade_rcnn/my_cascade_rcnn_r50_fpn.py \ work_dirs/cascade_rcnn/latest.pth \ --eval bbox segm # 如果包含分割任务 # RetinaNet python tools/test.py configs/retinanet/my_retinanet_r50_fpn.py \ work_dirs/retinanet/latest.pth \ --eval bbox ``` ### 6. 可视化结果 ```bash python demo/image_demo.py demo/demo.jpg \ configs/faster_rcnn/my_faster_rcnn_r50_fpn.py \ work_dirs/faster_rcnn/latest.pth \ --out-file result.jpg ``` ### 关键配置说明 1. **类别数量**:必须正确设置 `num_classes`(实际类别数 + 1) 2. **数据增强**:可在配置文件中添加: ```python img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='RandomFlip', flip_ratio=0.5), dict(type='Normalize', **img_norm_cfg), ... ] ``` 3. **学习率调整**:小数据集可减小学习率 ```python optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001) ``` ### 常见问题解决 1. **内存不足**: - 减小 `samples_per_gpu` - 使用 `fp16` 训练(添加 `--fp16` 参数) 2. **类别不匹配错误**: - 确保配置文件中 `classes` 顺序与标注文件一致 - 验证 JSON 文件是否符合 COCO 格式 3. **性能优化**: ```python # 使用更小的 backbone _base_ = '../retinanet/retinanet_r18_fpn_1x_coco.py' ``` 使用 mmdetection 训练自定义数据集需要仔细检查数据格式配置文件设置,特别是类别数量路径配置。训练过程中可通过 TensorBoard 监控指标: ```bash tensorboard --logdir work_dirs/ ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值