forked from open-mmlab/mmdetection
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Docs] Add Chinese version of single_stage_as_rpn.md and test_results…
…_submission.md (open-mmlab#9434) * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update test_results_submission.md * Update single_stage_as_rpn.md * Create test_results_submission.md * Update test_results_submission.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update test_results_submission.md * update * update * update * Update single_stage_as_rpn.md * Update .pre-commit-config.yaml * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update test_results_submission.md * Update single_stage_as_rpn.md * 已经运行pre-commit run --all-files,以下是其修改结果 * Update test_results_submission.md * Update test_results_submission.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md * Update single_stage_as_rpn.md
- Loading branch information
Showing
2 changed files
with
345 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,171 @@ | ||
# 将单阶段检测器作为 RPN(待更新) | ||
# 将单阶段检测器作为 RPN | ||
|
||
候选区域网络 (Region Proposal Network, RPN) 作为 [Faster R-CNN](https://arxiv.org/abs/1506.01497) 的一个子模块,将为 Faster R-CNN 的第二阶段产生候选区域。在 MMDetection 里大多数的二阶段检测器使用 [`RPNHead`](../../../mmdet/models/dense_heads/rpn_head.py)作为候选区域网络来产生候选区域。然而,任何的单阶段检测器都可以作为候选区域网络,是因为他们对边界框的预测可以被视为是一种候选区域,并且因此能够在 R-CNN 中得到改进。因此在 MMDetection v3.0 中会支持将单阶段检测器作为 RPN 使用。 | ||
|
||
接下来我们通过一个例子,即如何在 [Faster R-CNN](../../../configs/faster_rcnn/faster-rcnn_r50_fpn_fcos-rpn_1x_coco.py) 中使用一个无锚框的单阶段的检测器模型 [FCOS](../../../configs/fcos/fcos_r50-caffe_fpn_gn-head_1x_coco.py) 作为 RPN ,详细阐述具体的全部流程。 | ||
|
||
主要流程如下: | ||
|
||
1. 在 Faster R-CNN 中使用 `FCOSHead` 作为 `RPNHead` | ||
2. 评估候选区域 | ||
3. 用预先训练的 FCOS 训练定制的 Faster R-CNN | ||
|
||
## 在 Faster R-CNN 中使用 `FCOSHead` 作为` RPNHead` | ||
|
||
为了在 Faster R-CNN 中使用 `FCOSHead` 作为 `RPNHead` ,我们应该创建一个名为 `configs/faster_rcnn/faster-rcnn_r50_fpn_fcos-rpn_1x_coco.py` 的配置文件,并且在 `configs/faster_rcnn/faster-rcnn_r50_fpn_fcos-rpn_1x_coco.py` 中将 `rpn_head` 的设置替换为 `bbox_head` 的设置,此外我们仍然使用 FCOS 的瓶颈设置,步幅为`[8,16,32,64,128]`,并且更新 `bbox_roi_extractor` 的 `featmap_stride` 为 ` [8,16,32,64,128]`。为了避免损失变慢,我们在前1000次迭代而不是前500次迭代中应用预热,这意味着 lr 增长得更慢。相关配置如下: | ||
|
||
```python | ||
_base_ = [ | ||
'../_base_/models/faster-rcnn_r50_fpn.py', | ||
'../_base_/datasets/coco_detection.py', | ||
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' | ||
] | ||
model = dict( | ||
# 从 configs/fcos/fcos_r50-caffe_fpn_gn-head_1x_coco.py 复制 | ||
neck=dict( | ||
start_level=1, | ||
add_extra_convs='on_output', # 使用 P5 | ||
relu_before_extra_convs=True), | ||
rpn_head=dict( | ||
_delete_=True, # 忽略未使用的旧设置 | ||
type='FCOSHead', | ||
num_classes=1, # 对于 rpn, num_classes = 1,如果 num_classes > 1,它将在 TwoStageDetector 中自动设置为1 | ||
in_channels=256, | ||
stacked_convs=4, | ||
feat_channels=256, | ||
strides=[8, 16, 32, 64, 128], | ||
loss_cls=dict( | ||
type='FocalLoss', | ||
use_sigmoid=True, | ||
gamma=2.0, | ||
alpha=0.25, | ||
loss_weight=1.0), | ||
loss_bbox=dict(type='IoULoss', loss_weight=1.0), | ||
loss_centerness=dict( | ||
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), | ||
roi_head=dict( # featmap_strides 的更新取决于于颈部的步伐 | ||
bbox_roi_extractor=dict(featmap_strides=[8, 16, 32, 64, 128]))) | ||
# 学习率 | ||
param_scheduler = [ | ||
dict( | ||
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, | ||
end=1000), # 慢慢增加 lr,否则损失变成 NAN | ||
dict( | ||
type='MultiStepLR', | ||
begin=0, | ||
end=12, | ||
by_epoch=True, | ||
milestones=[8, 11], | ||
gamma=0.1) | ||
] | ||
``` | ||
|
||
然后,我们可以使用下面的命令来训练我们的定制模型。更多训练命令,请参考[这里](train.md)。 | ||
|
||
```python | ||
# 使用8个 GPU 进行训练 | ||
bash | ||
tools/dist_train.sh | ||
configs/faster_rcnn/faster-rcnn_r50_fpn_fcos-rpn_1x_coco.py | ||
--work-dir /work_dirs/faster-rcnn_r50_fpn_fcos-rpn_1x_coco | ||
``` | ||
|
||
## 评估候选区域 | ||
|
||
候选区域的质量对检测器的性能有重要影响,因此,我们也提供了一种评估候选区域的方法。和上面一样创建一个新的名为 `configs/rpn/fcos-rpn_r50_fpn_1x_coco.py` 的配置文件,并且在 `configs/rpn/fcos-rpn_r50_fpn_1x_coco.py` 中将 `rpn_head` 的设置替换为 `bbox_head` 的设置。 | ||
|
||
```python | ||
_base_ = [ | ||
'../_base_/models/rpn_r50_fpn.py', '../_base_/datasets/coco_detection.py', | ||
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' | ||
] | ||
val_evaluator = dict(metric='proposal_fast') | ||
test_evaluator = val_evaluator | ||
model = dict( | ||
# 从 configs/fcos/fcos_r50-caffe_fpn_gn-head_1x_coco.py 复制 | ||
neck=dict( | ||
start_level=1, | ||
add_extra_convs='on_output', # 使用 P5 | ||
relu_before_extra_convs=True), | ||
rpn_head=dict( | ||
_delete_=True, # 忽略未使用的旧设置 | ||
type='FCOSHead', | ||
num_classes=1, # 对于 rpn, num_classes = 1,如果 num_classes >为1,它将在 rpn 中自动设置为1 | ||
in_channels=256, | ||
stacked_convs=4, | ||
feat_channels=256, | ||
strides=[8, 16, 32, 64, 128], | ||
loss_cls=dict( | ||
type='FocalLoss', | ||
use_sigmoid=True, | ||
gamma=2.0, | ||
alpha=0.25, | ||
loss_weight=1.0), | ||
loss_bbox=dict(type='IoULoss', loss_weight=1.0), | ||
loss_centerness=dict( | ||
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0))) | ||
``` | ||
|
||
假设我们在训练之后有检查点 `./work_dirs/faster-rcnn_r50_fpn_fcos-rpn_1x_coco/epoch_12.pth` ,然后,我们可以使用下面的命令来评估建议的质量。 | ||
|
||
```python | ||
# 使用8个 GPU 进行测试 | ||
bash | ||
tools/dist_test.sh | ||
configs/rpn/fcos-rpn_r50_fpn_1x_coco.py | ||
--work_dirs /faster-rcnn_r50_fpn_fcos-rpn_1x_coco/epoch_12.pth | ||
``` | ||
|
||
## 用预先训练的 FCOS 训练定制的 Faster R-CNN | ||
|
||
预训练不仅加快了训练的收敛速度,而且提高了检测器的性能。因此,我们在这里给出一个例子来说明如何使用预先训练的 FCOS 作为 RPN 来加速训练和提高精度。假设我们想在 Faster R-CNN 中使用 `FCOSHead` 作为 `rpn_head`,并加载预先训练权重来进行训练 [`fcos_r50-caffe_fpn_gn-head_1x_coco`](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth)。 配置文件 `configs/faster_rcnn/faster-rcnn_r50-caffe_fpn_fcos- rpn_1x_copy .py` 的内容如下所示。注意,`fcos_r50-caffe_fpn_gn-head_1x_coco` 使用 ResNet50 的 caffe 版本,因此需要更新 `data_preprocessor` 中的像素平均值和 std。 | ||
|
||
```python | ||
_base_ = [ | ||
'../_base_/models/faster-rcnn_r50_fpn.py', | ||
'../_base_/datasets/coco_detection.py', | ||
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' | ||
] | ||
model = dict( | ||
data_preprocessor=dict( | ||
mean=[103.530, 116.280, 123.675], | ||
std=[1.0, 1.0, 1.0], | ||
bgr_to_rgb=False), | ||
backbone=dict( | ||
norm_cfg=dict(type='BN', requires_grad=False), | ||
style='caffe', | ||
init_cfg=None), # the checkpoint in ``load_from`` contains the weights of backbone | ||
neck=dict( | ||
start_level=1, | ||
add_extra_convs='on_output', # 使用 P5 | ||
relu_before_extra_convs=True), | ||
rpn_head=dict( | ||
_delete_=True, # 忽略未使用的旧设置 | ||
type='FCOSHead', | ||
num_classes=1, # 对于 rpn, num_classes = 1,如果 num_classes > 1,它将在 TwoStageDetector 中自动设置为1 | ||
in_channels=256, | ||
stacked_convs=4, | ||
feat_channels=256, | ||
strides=[8, 16, 32, 64, 128], | ||
loss_cls=dict( | ||
type='FocalLoss', | ||
use_sigmoid=True, | ||
gamma=2.0, | ||
alpha=0.25, | ||
loss_weight=1.0), | ||
loss_bbox=dict(type='IoULoss', loss_weight=1.0), | ||
loss_centerness=dict( | ||
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), | ||
roi_head=dict( # update featmap_strides due to the strides in neck | ||
bbox_roi_extractor=dict(featmap_strides=[8, 16, 32, 64, 128]))) | ||
load_from = 'https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth' | ||
``` | ||
|
||
训练命令如下。 | ||
|
||
```python | ||
bash | ||
tools/dist_train.sh | ||
configs/faster_rcnn/faster-rcnn_r50-caffe_fpn_fcos-rpn_1x_coco.py \ | ||
--work-dir /work_dirs/faster-rcnn_r50-caffe_fpn_fcos-rpn_1x_coco | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,174 @@ | ||
# 提交测试结果(待更新) | ||
# 提交测试结果 | ||
|
||
## 全景分割测试结果提交 | ||
|
||
下面几节介绍如何在 COCO 测试开发集上生成泛视分割模型的预测结果,并将预测提交到 [COCO评估服务器](https://competitions.codalab.org/competitions/19507) | ||
|
||
### 前提条件 | ||
|
||
- 下载 [COCO测试数据集图像](https://images.cocodataset.org/zips/test2017.zip),[测试图像信息](https://images.cocodataset.org/annotations/image_info_test2017.zip),和[全景训练/相关注释](https://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip),然后解压缩它们,把 `test2017` 放到 `data/coco/`,把 json 文件和注释文件放到 `data/coco/annotations/` 。 | ||
|
||
```shell | ||
# 假设 data/coco/ 不存在 | ||
mkdir -pv data/coco/ | ||
# 下载 test2017 | ||
wget -P data/coco/ https://images.cocodataset.org/zips/test2017.zip | ||
wget -P data/coco/ https://images.cocodataset.org/annotations/image_info_test2017.zip | ||
wget -P data/coco/ https://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip | ||
# 解压缩它们 | ||
unzip data/coco/test2017.zip -d data/coco/ | ||
unzip data/coco/image_info_test2017.zip -d data/coco/ | ||
unzip data/coco/panoptic_annotations_trainval2017.zip -d data/coco/ | ||
# 删除 zip 文件(可选) | ||
rm -rf data/coco/test2017.zip data/coco/image_info_test2017.zip data/coco/panoptic_annotations_trainval2017.zip | ||
``` | ||
|
||
- 运行以下代码更新测试图像信息中的类别信息。由于 `image_info_test-dev2017.json` 的类别信息中缺少属性 `isthing` ,我们需要用 `panoptic_val2017.json` 中的类别信息更新它。 | ||
|
||
```shell | ||
python tools/misc/gen_coco_panoptic_test_info.py data/coco/annotations | ||
``` | ||
|
||
在完成上述准备之后,你的 `data` 目录结构应该是这样: | ||
|
||
```text | ||
data | ||
`-- coco | ||
|-- annotations | ||
| |-- image_info_test-dev2017.json | ||
| |-- image_info_test2017.json | ||
| |-- panoptic_image_info_test-dev2017.json | ||
| |-- panoptic_train2017.json | ||
| |-- panoptic_train2017.zip | ||
| |-- panoptic_val2017.json | ||
| `-- panoptic_val2017.zip | ||
`-- test2017 | ||
``` | ||
|
||
### coco 测试开发的推理 | ||
|
||
要在 coco test-dev 上进行推断,我们应该首先更新 `test_dataloder` 和 `test_evaluator` 的设置。有两种方法可以做到这一点:1. 在配置文件中更新它们;2. 在命令行中更新它们。 | ||
|
||
#### 在配置文件中更新它们 | ||
|
||
相关的设置在 `configs/_base_/datasets/ coco_panoptical .py` 的末尾,如下所示。 | ||
|
||
```python | ||
test_dataloader = dict( | ||
batch_size=1, | ||
num_workers=1, | ||
persistent_workers=True, | ||
drop_last=False, | ||
sampler=dict(type='DefaultSampler', shuffle=False), | ||
dataset=dict( | ||
type=dataset_type, | ||
data_root=data_root, | ||
ann_file='annotations/panoptic_image_info_test-dev2017.json', | ||
data_prefix=dict(img='test2017/'), | ||
test_mode=True, | ||
pipeline=test_pipeline)) | ||
test_evaluator = dict( | ||
type='CocoPanopticMetric', | ||
format_only=True, | ||
ann_file=data_root + 'annotations/panoptic_image_info_test-dev2017.json', | ||
outfile_prefix='./work_dirs/coco_panoptic/test') | ||
``` | ||
|
||
以下任何一种方法都可以用于更新 coco test-dev 集上的推理设置 | ||
|
||
情况1:直接取消注释 `configs/_base_/datasets/ coco_panoptical .py` 中的设置。 | ||
|
||
情况2:将以下设置复制到您现在使用的配置文件中。 | ||
|
||
```python | ||
test_dataloader = dict( | ||
dataset=dict( | ||
ann_file='annotations/panoptic_image_info_test-dev2017.json', | ||
data_prefix=dict(img='test2017/', _delete_=True))) | ||
test_evaluator = dict( | ||
format_only=True, | ||
ann_file=data_root + 'annotations/panoptic_image_info_test-dev2017.json', | ||
outfile_prefix='./work_dirs/coco_panoptic/test') | ||
``` | ||
|
||
然后通过以下命令对 coco test-dev et 进行推断。 | ||
|
||
```shell | ||
python tools/test.py \ | ||
${CONFIG_FILE} \ | ||
${CHECKPOINT_FILE} | ||
``` | ||
|
||
#### 在命令行中更新它们 | ||
|
||
coco test-dev 上更新相关设置和推理的命令如下所示。 | ||
|
||
```shell | ||
# 用一个 gpu 测试 | ||
CUDA_VISIBLE_DEVICES=0 python tools/test.py \ | ||
${CONFIG_FILE} \ | ||
${CHECKPOINT_FILE} \ | ||
--cfg-options \ | ||
test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ | ||
test_dataloader.dataset.data_prefix.img=test2017 \ | ||
test_dataloader.dataset.data_prefix._delete_=True \ | ||
test_evaluator.format_only=True \ | ||
test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ | ||
test_evaluator.outfile_prefix=${WORK_DIR}/results | ||
# 用四个 gpu 测试 | ||
CUDA_VISIBLE_DEVICES=0,1,3,4 bash tools/dist_test.sh \ | ||
${CONFIG_FILE} \ | ||
${CHECKPOINT_FILE} \ | ||
8 \ # eights gpus | ||
--cfg-options \ | ||
test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ | ||
test_dataloader.dataset.data_prefix.img=test2017 \ | ||
test_dataloader.dataset.data_prefix._delete_=True \ | ||
test_evaluator.format_only=True \ | ||
test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ | ||
test_evaluator.outfile_prefix=${WORK_DIR}/results | ||
# 用 slurm 测试 | ||
GPUS=8 tools/slurm_test.sh \ | ||
${Partition} \ | ||
${JOB_NAME} \ | ||
${CONFIG_FILE} \ | ||
${CHECKPOINT_FILE} \ | ||
--cfg-options \ | ||
test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ | ||
test_dataloader.dataset.data_prefix.img=test2017 \ | ||
test_dataloader.dataset.data_prefix._delete_=True \ | ||
test_evaluator.format_only=True \ | ||
test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ | ||
test_evaluator.outfile_prefix=${WORK_DIR}/results | ||
``` | ||
|
||
例子:假设我们使用预先训练的带有 ResNet-50 骨干网的 MaskFormer 对 `test2017` 执行推断。 | ||
|
||
```shell | ||
# 单 gpu 测试 | ||
CUDA_VISIBLE_DEVICES=0 python tools/test.py \ | ||
configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py \ | ||
checkpoints/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth \ | ||
--cfg-options \ | ||
test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ | ||
test_dataloader.dataset.data_prefix.img=test2017 \ | ||
test_dataloader.dataset.data_prefix._delete_=True \ | ||
test_evaluator.format_only=True \ | ||
test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ | ||
test_evaluator.outfile_prefix=work_dirs/maskformer/results | ||
``` | ||
|
||
### 重命名文件并压缩结果 | ||
|
||
推理之后,全景分割结果(一个 json 文件和一个存储掩码的目录)将在 `WORK_DIR` 中。我们应该按照 [COCO's Website](https://cocodataset.org/#upload)上的命名约定重新命名它们。最后,我们需要将 json 和存储掩码的目录压缩到 zip 文件中,并根据命名约定重命名该 zip 文件。注意, zip 文件应该**直接**包含上述两个文件。 | ||
|
||
重命名文件和压缩结果的命令: | ||
|
||
```shell | ||
# 在 WORK_DIR 中,我们有 panoptic 分割结果: 'panoptic' 和 'results. panoptical .json'。 | ||
cd ${WORK_DIR} | ||
# 将 '[algorithm_name]' 替换为您使用的算法名称 | ||
mv ./panoptic ./panoptic_test-dev2017_[algorithm_name]_results | ||
mv ./results.panoptic.json ./panoptic_test-dev2017_[algorithm_name]_results.json | ||
zip panoptic_test-dev2017_[algorithm_name]_results.zip -ur panoptic_test-dev2017_[algorithm_name]_results panoptic_test-dev2017_[algorithm_name]_results.json | ||
``` |