MMDetection——2.快速入门1(翻译版)
1: 推断和训练现有模型和标准数据集
- MMDetection在Model Zoo中提供了数百种现有和现有的检测模型,并支持多个标准数据集,包括Pascal VOC,COCO,CityScapes,LVIS等。此注释将说明如何在这些现有模型和标准数据集上执行常见任务,包括:
- 使用现有模型推断给定图像。
- 在标准数据集上测试现有模型。
- 在标准数据集上训练预定义的模型。
推论现有模型
通过推论,我们的意思是使用训练有素的模型来检测图像上的物体。在MMDetection中,模型由配置文件(configuration file)定义,现有模型参数保存在检查点文件(checkpoint file)中。
首先,我们建议使用此配置文件 configuration file 和此检查点文件checkpoint file来使用Faster RCNN 。建议将检查点文件(checkpoint file)下载到目录 checkpoints文件夹中.
用于推理的高级API
MMDetection提供了高级Python API来推断图像。这是在给定的图像或视频上建立模型和推断的示例。
from mmdet.apis import init_detector, inference_detector
import mmcv
# Specify the path to model config and checkpoint file
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
# build the model from a config file and a checkpoint file
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# test a single image and show the results
img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once
result = inference_detector(model, img)
# visualize the results in a new window
model.show_result(img, result)
# or save the visualization results to image files
model.show_result(img, result, out_file='result.jpg')
# test a video and show the results
video = mmcv.VideoReader('video.mp4')
for frame in video:
result = inference_detector(model, frame)
model.show_result(frame, result, wait_time=1)
notebook demo 可以在demo/inference_demo.ipynb中找到。
注意: inference_detector 仅支持单图像推断。
异步接口-受Python 3.7+支持
对于Python 3.7 +,MMDetection还支持异步接口。通过利用CUDA流,它可以不阻塞GPU绑定推理代码上的CPU,并为单线程应用程序提供更好的CPU / GPU利用率。可以在不同的输入数据样本之间或某个推理管道的不同模型之间同时进行推理。
请参阅 tests/async_benchmark.py 比较同步和异步接口的速度。
import asyncio
import torch
from mmdet.apis import init_detector, async_inference_detector
from mmdet.utils.contextmanagers import concurrent
async def main():
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
device = 'cuda:0'
model = init_detector(config_file, checkpoint=checkpoint_file, device=device)
# queue is used for concurrent inference of multiple images
streamqueue = asyncio.Queue()
# queue size defines concurrency level
streamqueue_size = 3
for _ in range(streamqueue_size):
streamqueue.put_nowait(torch.cuda.Stream(device=device))
# test a single image and show the results
img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once
async with concurrent(streamqueue):
result = await async_inference_detector(model, img)
# visualize the results in a new window
model.show_result(img, result)
# or save the visualization results to image files
model.show_result(img, result, out_file='result.jpg')
asyncio.run(main())
演示版
我们还提供了三个演示脚本,这些脚本使用高级API和支持的功能代码实现。源代码可在 here获得。
图片演示
该脚本在单个图像上执行推理.
python demo/image_demo.py \
${IMAGE_FILE} \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--device ${GPU_ID}] \
[--score-thr ${SCORE_THR}]
例子:
python demo/image_demo.py demo/demo.jpg \
configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
--device cpu
网络摄像头演示
这是来自网络摄像头的现场演示.
python demo/webcam_demo.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--device ${GPU_ID}] \
[--camera-id ${CAMERA-ID}] \
[--score-thr ${SCORE_THR}]
例子s:
python demo/webcam_demo.py \
configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
视频演示
该脚本对视频执行推断.
python demo/video_demo.py \
${VIDEO_FILE} \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--device ${GPU_ID}] \
[--score-thr ${SCORE_THR}] \
[--out ${OUT_FILE}] \
[--show] \
[--wait-time ${WAIT_TIME}]
例子:
python demo/video_demo.py demo/demo.mp4 \
configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
--out result.mp4
在标准数据集上测试现有模型
为了评估模型的准确性,通常会在一些标准数据集上对模型进行测试。MMDetection支持多种公共数据集,包括 COCO, Pascal VOC, CityScapes, and more. 本节将展示如何在受支持的数据集上测试现有模型。
准备数据集
可以从官方网站或镜像获得 Pascal VOC 或镜像和 COCO 之类的数据集。注意:在检测任务中,Pascal VOC 2012是 Pascal VOC 2007的扩展,没有重叠, 我们通常将它们一起使用。建议下载数据集并将其提取到项目目录之外的某个位置,并将数据集根链接 $MMDETECTION/data如下所示。如果您的文件结构不同,则可能需要更改配置文件中的相应路径。
mmdetection
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
│ │ ├── test2017
│ ├── cityscapes
│ │ ├── annotations
│ │ ├── leftImg8bit
│ │ │ ├── train
│ │ │ ├── val
│ │ ├── gtFine
│ │ │ ├── train
│ │ │ ├── val
│ ├── VOCdevkit
│ │ ├── VOC2007
│ │ ├── VOC2012
某些模型需要其他 COCO-stuff 数据集, 如 HTC, DetectoRS and SCNet,您可以下载并解压缩然后移至coco文件夹。目录应该是这样的。
mmdetection
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
│ │ ├── test2017
│ │ ├── stuffthingmaps
需要使用以下方法将 cityscapes 注释转换为coco格式 tools/dataset_converters/cityscapes.py:
pip install cityscapesscripts
python tools/dataset_converters/cityscapes.py \
./data/cityscapes \
--nproc 8 \
--out-dir ./data/cityscapes/annotations
待办事项: 更改新路径
测试现有模型
我们提供测试脚本,用于评估整个数据集 (COCO, PASCAL VOC, Cityscapes, etc.)上的现有模型。支持以下测试环境:
- 单GPU
- 单节点多GPU
- 多个节点
根据测试环境选择适当的脚本来执行测试。
# single-gpu testing
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
[--out ${RESULT_FILE}] \
[--eval ${EVAL_METRICS}] \
[--show]
# multi-gpu testing
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
[--out ${RESULT_FILE}] \
[--eval ${EVAL_METRICS}]
tools/dist_test.sh 它还支持多节点测试,但依赖于 PyTorch的 launch utility(启动实用程序)
可选参数:
RESULT_FILE:输出结果的文件名采用pickle格式。如果未指定,结果将不会保存到文件中。EVAL_METRICS: 要根据结果评估的项目。允许的值取决于数据集,例如proposal_fast,proposal,bbox,segm可用于COCO,mAP,recall为PASCAL VOC。可以通过cityscapes和所有COCO指标来评估城市景观Cityscapes。--show: 如果指定,检测结果将绘制在图像上并显示在新窗口中。它仅适用于单个GPU测试,并用于调试和可视化。请确保GUI在您的环境中可用。否则,您可能会遇到类似的错误。cannot connect to X server--show-dir: 如果指定,检测结果将绘制在图像上并保存到指定目录。它仅适用于单个GPU测试,并用于调试和可视化。使用该选项时不需要您的环境中具有可用的GUI。--show-score-thr: 如果指定,则分数低于此阈值的检测将被删除。--cfg-options:如果指定,则键值对可选cfg将合并到配置文件中。--eval-options:如果指定,则键值对可选eval cfg将成为dataset.evaluate()函数的kwargs,仅用于评估。
例子
假设您已经将检查点下载到目录中 checkpoints/.
-
测试 Faster R-CNN 并可视化结果。按任意键查看下一张图像。配置文件和检查点文件在此处可用。
python tools/test.py \ configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ --show -
测试Faster R-CNN 并保存绘制的图像以供将来可视化。配置文件和检查点文件在此处可用。
python tools/test.py \ configs/faster_rcnn/faster_rcnn_r50_fpn_1x.py \ checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ --show-dir faster_rcnn_r50_fpn_1x_results -
PASCAL VOC 上测试Faster R-CNN(不保存测试结果) 并评估mAP. 配置文件和检查点文件在此处可用。
python tools/test.py \ configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc.py \ checkpoints/faster_rcnn_r50_fpn_1x_voc0712_20200624-c9895d40.pth \ --eval mAP -
使用8个GPU测试Mask R-CNN,并评估bbox和mask AP。配置文件和检查点文件在此处可用。
./tools/dist_test.sh \ configs/mask_rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8 \ --out results.pkl \ --eval bbox segm -
使用8个GPU测试Mask R-CNN,并评估分类bbox和mask AP。配置文件和检查点文件在此处可用。
./tools/dist_test.sh \ configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8 \ --out results.pkl \ --eval bbox segm \ --options "classwise=True" -
在具有8个GPU的COCO test-dev上测试Mask R-CNN,并生成JSON文件以提交给官方评估服务器。配置文件和检查点文件在此处可用。
./tools/dist_test.sh \ configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ 8 \ --format-only \ --options "jsonfile_prefix=./mask_rcnn_test-dev_results"此命令生成两个JSON文件
mask_rcnn_test-dev_results.bbox.json和mask_rcnn_test-dev_results.segm.json。 -
在Cityscapes上使用8个GPU测试Test Mask R-CNN,并生成txt和png文件提交给官方评估服务器。配置文件和检查点文件在此处可用。
./tools/dist_test.sh \ configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py \ checkpoints/mask_rcnn_r50_fpn_1x_cityscapes_20200227-afe51d5a.pth \ 8 \ --format-only \ --options "txtfile_prefix=./mask_rcnn_cityscapes_test_results"生成的png和txt将在
./mask_rcnn_cityscapes_test_results目录下。
在没有标签注释的情况下进行测试
MMDetection支持使用 CocoDataset来测试没有标签注释的模型。如果您的数据集格式不是COCO格式,请将其转换为COCO格式。 例如,如果您的数据集格式为VOC,则可以通过工具中的脚本将其直接转换为COCO格式。
# single-gpu testing
python tools/test.py \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
--format-only \
--options ${JSONFILE_PREFIX} \
[--show]
# multi-gpu testing
bash tools/dist_test.sh \
${CONFIG_FILE} \
${CHECKPOINT_FILE} \
${GPU_NUM} \
--format-only \
--options ${JSONFILE_PREFIX} \
[--show]
假设已将 model zoo 中的检查点下载到目录中checkpoints/,我们可以在具有8个GPU的COCO test-dev上测试Mask R-CNN,并使用以下命令生成JSON文件。
./tools/dist_test.sh \
configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \
checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \
8 \
-format-only \
--options "jsonfile_prefix=./mask_rcnn_test-dev_results"
此命令生成两个JSON文件mask_rcnn_test-dev_results.bbox.json和mask_rcnn_test-dev_results.segm.json。
批量推断
MMDetection支持在测试模式下对单个图像或批处理图像进行推理。默认情况下,我们使用单图像推断,您可以通过在测试数据的配置中进行修改samples_per_gpu来使用批量推断。您可以通过如下修改配置来实现。
data = dict(train=dict(...), val=dict(...), test=dict(samples_per_gpu=2, ...))
或者您可以将其设置--cfg-options为--cfg-options data.test.samples_per_gpu=2
不推荐使用的 ImageToTensor
在测试模式下, ImageToTensor pipeline 不建议使用,用 DefaultFormatBundle 来代替,建议使用手动替换配置文件中的测试数据管道。例如:
# use ImageToTensor (deprecated)
pipelines = [
dict(type='LoadImageFromFile'),
dict(
type='MultiScaleFlipAug',
img_scale=(1333, 800),
flip=False,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(type='RandomFlip'),
dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]),
dict(type='Pad', size_divisor=32),
dict(type='ImageToTensor', keys=['img']),
dict(type='Collect', keys=['img']),
])
]
# manually replace ImageToTensor to DefaultFormatBundle (recommended)
pipelines = [
dict(type='LoadImageFromFile'),
dict(
type='MultiScaleFlipAug',
img_scale=(1333, 800),
flip=False,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(type='RandomFlip'),
dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img']),
])
]
在标准数据集上训练预定义模型
MMDetection还提供用于训练检测模型的现成工具。本节将展示如何在标准数据集(即COCO)上训练预定义的模型(在config下)。
重要说明:配置文件中的默认学习率是8个GPU和2 img / gpu(批量大小= 8 * 2 = 16)。根据线性缩放规则,如果您使用不同的GPU或者每个GPU处理不用数量的图片,则需要按批次大小设置学习率,例如,lr=0.01对于4个GPU * 2 imgs / gpu和lr=0.08对于16个GPU * 4 imgs / gpu。
准备数据集
训练也需要准备数据集。有关详细信息,请参见 Prepare datasets
注意:当前,配置文件下configs/cityscapes使用COCO预训练的权重进行初始化。如果网络连接不可用或速度较慢,可以提前下载现有模型。否则,将在训练开始时导致错误。
在单个GPU上训练
我们提供了tools/train.py在单个GPU上启动训练工作的信息。基本用法如下。
python tools/train.py \
${CONFIG_FILE} \
[optional arguments]
在培训期间,日志文件和检查点将保存到工作目录,该目录work_dir在config文件中或通过CLI参数指定--work-dir。
默认情况下,模型在每一次迭代后对验证集进行评估,评估间隔可以在配置文件中指定,如下所示。
# evaluate the model every 12 epoch.
evaluation = dict(interval=12)
- 该工具接受几个可选参数,包括:
--no-validate(不建议):禁用训练期间的评估。--work-dir ${WORK_DIR}:覆盖工作目录。--resume-from ${CHECKPOINT_FILE}:从先前的检查点文件恢复。--options 'Key=value':覆盖使用的配置中的其他设置。
注意事项:
resume-from和之间的区别load-from:
resume-from同时加载模型权重和优化器状态,并且迭代也从指定的检查点继承。通常用于恢复意外中断的训练过程。 load-from仅加载模型权重,训练时期从0开始。通常用于微调。
在多个GPU上进行训练
我们提供tools/dist_train.sh在多个GPU上启动培训的方法。基本用法如下。
bash ./tools/dist_train.sh \
${CONFIG_FILE} \
${GPU_NUM} \
[optional arguments]
可选参数与上面所述相同。
同时启动多个作业
如果要在一台计算机上启动多个作业,例如,在具有8个GPU的计算机上执行2个4-GPU训练作业,则需要为每个作业指定不同的端口(默认为29500),以避免通信冲突。
如果dist_train.sh用于启动培训作业,则可以在命令中设置端口。
CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4
在多个节点上训练
MMDetection依靠torch.distributed软件包进行分布式培训。因此,作为一种基本用法,可以通过PyTorch的启动实用程序启动分布式培训。
Manage jobs with Slurm
使用Slurm管理职位
Slurm是用于计算集群的良好作业调度系统。在Slurm管理的群集上,您可以slurm_train.sh用来生成训练作业。它支持单节点和多节点训练。
基本用法如下。
[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR}
下面是使用16个GPU在名为dev的Slurm分区上训练Mask R-CNN并将工作目录设置为某些共享文件系统的示例。
GPUS=16 ./tools/slurm_train.sh dev mask_r50_1x configs/mask_rcnn_r50_fpn_1x_coco.py /nfs/xxxx/mask_rcnn_r50_fpn_1x
您可以检查源代码以查看完整的参数和环境变量。
使用Slurm时,需要通过以下方式之一设置端口选项:
- 通过设置端口
--options。推荐这样做,因为它不会更改原始配置。
CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --options 'dist_params.port=29500'
CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --options 'dist_params.port=29501'
2.修改配置文件以设置不同的通信端口。
在 config1.py中,设置
dist_params = dict(backend='nccl', port=29500)
在 config2.py中,设置
dist_params = dict(backend='nccl', port=29501)
然后,您可以使用config1.py和config2.py启动两个作业。
CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR}
CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR}
本文介绍MMDetection的快速入门指南,涵盖模型推断、现有模型测试及预定义模型训练等内容,适合初学者快速上手。
1109

被折叠的 条评论
为什么被折叠?



