Skip to content

Commit 057155d

Browse files
[Feature] add bdd100K datasets (#3158)
## Motivation Integrate [BDD100K](https://paperswithcode.com/dataset/bdd100k) dataset. It shares the same classes as Cityscapes, and it's commonly used for evaluating segmentation/detection tasks in driving scenes, such as in [RobustNet](https://arxiv.org/abs/2103.15597), [WildNet](https://github.com/suhyeonlee/WildNet). Enhancement for Add BDD100K Dataset #2808 --------- Co-authored-by: xiexinch <[email protected]>
1 parent 7254f53 commit 057155d

33 files changed

+518
-10
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ Results and models are available in the [model zoo](docs/en/model_zoo.md).
253253
- [x] [iSAID](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#isaid)
254254
- [x] [Mapillary Vistas](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#mapillary-vistas-datasets)
255255
- [x] [LEVIR-CD](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#levir-cd)
256+
- [x] [BDD100K](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#bdd100K)
256257

257258
</details>
258259

README_zh-CN.md

+1
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ MMSegmentation v1.x 在 0.x 版本的基础上有了显著的提升,提供了
247247
- [x] [iSAID](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/dataset_prepare.md#isaid)
248248
- [x] [Mapillary Vistas](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#mapillary-vistas-datasets)
249249
- [x] [LEVIR-CD](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/user_guides/2_dataset_prepare.md#levir-cd)
250+
- [x] [BDD100K](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/zh_cn/user_guides/2_dataset_prepare.md#bdd100K)
250251

251252
</details>
252253

configs/_base_/datasets/bdd100k.py

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# dataset settings
2+
dataset_type = 'BDD100KDataset'
3+
data_root = 'data/bdd100k/'
4+
5+
crop_size = (512, 1024)
6+
train_pipeline = [
7+
dict(type='LoadImageFromFile'),
8+
dict(type='LoadAnnotations'),
9+
dict(
10+
type='RandomResize',
11+
scale=(2048, 1024),
12+
ratio_range=(0.5, 2.0),
13+
keep_ratio=True),
14+
dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),
15+
dict(type='RandomFlip', prob=0.5),
16+
dict(type='PhotoMetricDistortion'),
17+
dict(type='PackSegInputs')
18+
]
19+
test_pipeline = [
20+
dict(type='LoadImageFromFile'),
21+
dict(type='Resize', scale=(2048, 1024), keep_ratio=True),
22+
# add loading annotation after ``Resize`` because ground truth
23+
# does not need to do resize data transform
24+
dict(type='LoadAnnotations'),
25+
dict(type='PackSegInputs')
26+
]
27+
img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75]
28+
tta_pipeline = [
29+
dict(type='LoadImageFromFile', backend_args=None),
30+
dict(
31+
type='TestTimeAug',
32+
transforms=[
33+
[
34+
dict(type='Resize', scale_factor=r, keep_ratio=True)
35+
for r in img_ratios
36+
],
37+
[
38+
dict(type='RandomFlip', prob=0., direction='horizontal'),
39+
dict(type='RandomFlip', prob=1., direction='horizontal')
40+
], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')]
41+
])
42+
]
43+
train_dataloader = dict(
44+
batch_size=2,
45+
num_workers=2,
46+
persistent_workers=True,
47+
sampler=dict(type='InfiniteSampler', shuffle=True),
48+
dataset=dict(
49+
type=dataset_type,
50+
data_root=data_root,
51+
data_prefix=dict(
52+
img_path='images/10k/train',
53+
seg_map_path='labels/sem_seg/masks/train'),
54+
pipeline=train_pipeline))
55+
val_dataloader = dict(
56+
batch_size=1,
57+
num_workers=4,
58+
persistent_workers=True,
59+
sampler=dict(type='DefaultSampler', shuffle=False),
60+
dataset=dict(
61+
type=dataset_type,
62+
data_root=data_root,
63+
data_prefix=dict(
64+
img_path='images/10k/val',
65+
seg_map_path='labels/sem_seg/masks/val'),
66+
pipeline=test_pipeline))
67+
test_dataloader = val_dataloader
68+
69+
val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU'])
70+
test_evaluator = val_evaluator

docs/en/user_guides/2_dataset_prepare.md

+63
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,26 @@ mmsegmentation
178178
| │ │ │ ├── labels
179179
| │ │ │ ├── panoptic
180180
| │   │   │ └── polygons
181+
│ ├── bdd100k
182+
│ │ ├── images
183+
│ │ │ └── 10k
184+
| │ │ │ ├── test
185+
| │ │ │ ├── train
186+
| │   │   │ └── val
187+
│ │ └── labels
188+
│ │ │ └── sem_seg
189+
| │ │ │ ├── colormaps
190+
| │ │ │ │ ├──train
191+
| │ │ │ │ └──val
192+
| │ │ │ ├── masks
193+
| │ │ │ │ ├──train
194+
| │ │ │ │ └──val
195+
| │ │ │ ├── polygons
196+
| │ │ │ │ ├──sem_seg_train.json
197+
| │ │ │ │ └──sem_seg_val.json
198+
| │   │   │ └── rles
199+
| │ │ │ │ ├──sem_seg_train.json
200+
| │ │ │ │ └──sem_seg_val.json
181201
```
182202

183203
## Cityscapes
@@ -653,3 +673,46 @@ python tools/dataset_converters/levircd.py --dataset-path /path/to/LEVIR-CD+ --o
653673
```
654674

655675
The size of cropped image is 256x256, which is consistent with the original paper.
676+
677+
## BDD100K
678+
679+
- You could download BDD100k datasets from [here](https://bdd-data.berkeley.edu/) after registration.
680+
681+
- You can download images and masks by clicking `10K Images` button and `Segmentation` button.
682+
683+
- After download, unzip by the following instructions:
684+
685+
```bash
686+
unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/
687+
unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/
688+
```
689+
690+
- And get
691+
692+
```none
693+
mmsegmentation
694+
├── mmseg
695+
├── tools
696+
├── configs
697+
├── data
698+
│ ├── bdd100k
699+
│ │ ├── images
700+
│ │ │ └── 10k
701+
| │ │ │ ├── test
702+
| │ │ │ ├── train
703+
| │   │   │ └── val
704+
│ │ └── labels
705+
│ │ │ └── sem_seg
706+
| │ │ │ ├── colormaps
707+
| │ │ │ │ ├──train
708+
| │ │ │ │ └──val
709+
| │ │ │ ├── masks
710+
| │ │ │ │ ├──train
711+
| │ │ │ │ └──val
712+
| │ │ │ ├── polygons
713+
| │ │ │ │ ├──sem_seg_train.json
714+
| │ │ │ │ └──sem_seg_val.json
715+
| │   │   │ └── rles
716+
| │ │ │ │ ├──sem_seg_train.json
717+
| │ │ │ │ └──sem_seg_val.json
718+
```

docs/zh_cn/user_guides/2_dataset_prepare.md

+63
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,26 @@ mmsegmentation
178178
| │ │ │ ├── labels
179179
| │ │ │ ├── panoptic
180180
| │   │   │ └── polygons
181+
│ ├── bdd100k
182+
│ │ ├── images
183+
│ │ │ └── 10k
184+
| │ │ │ ├── test
185+
| │ │ │ ├── train
186+
| │   │   │ └── val
187+
│ │ └── labels
188+
│ │ │ └── sem_seg
189+
| │ │ │ ├── colormaps
190+
| │ │ │ │ ├──train
191+
| │ │ │ │ └──val
192+
| │ │ │ ├── masks
193+
| │ │ │ │ ├──train
194+
| │ │ │ │ └──val
195+
| │ │ │ ├── polygons
196+
| │ │ │ │ ├──sem_seg_train.json
197+
| │ │ │ │ └──sem_seg_val.json
198+
| │   │   │ └── rles
199+
| │ │ │ │ ├──sem_seg_train.json
200+
| │ │ │ │ └──sem_seg_val.json
181201
```
182202

183203
## Cityscapes
@@ -649,3 +669,46 @@ python tools/dataset_converters/levircd.py --dataset-path /path/to/LEVIR-CD+ --o
649669
```
650670

651671
裁剪后的影像大小为256x256,与原论文保持一致。
672+
673+
## BDD100K
674+
675+
- 可以从[官方网站](https://bdd-data.berkeley.edu/) 下载 BDD100K数据集(语义分割任务主要是10K数据集),按照官网要求注册并登陆后,数据可以在[这里](https://bdd-data.berkeley.edu/portal.html#download)找到。
676+
677+
- 图像数据对应的名称是是`10K Images`, 语义分割标注对应的名称是`Segmentation`
678+
679+
- 下载后,可以使用以下代码进行解压
680+
681+
```bash
682+
unzip ~/bdd100k_images_10k.zip -d ~/mmsegmentation/data/
683+
unzip ~/bdd100k_sem_seg_labels_trainval.zip -d ~/mmsegmentation/data/
684+
```
685+
686+
就可以得到以下文件结构了:
687+
688+
```none
689+
mmsegmentation
690+
├── mmseg
691+
├── tools
692+
├── configs
693+
├── data
694+
│ ├── bdd100k
695+
│ │ ├── images
696+
│ │ │ └── 10k
697+
| │ │ │ ├── test
698+
| │ │ │ ├── train
699+
| │   │   │ └── val
700+
│ │ └── labels
701+
│ │ │ └── sem_seg
702+
| │ │ │ ├── colormaps
703+
| │ │ │ │ ├──train
704+
| │ │ │ │ └──val
705+
| │ │ │ ├── masks
706+
| │ │ │ │ ├──train
707+
| │ │ │ │ └──val
708+
| │ │ │ ├── polygons
709+
| │ │ │ │ ├──sem_seg_train.json
710+
| │ │ │ │ └──sem_seg_val.json
711+
| │   │   │ └── rles
712+
| │ │ │ │ ├──sem_seg_train.json
713+
| │ │ │ │ └──sem_seg_val.json
714+
```

mmseg/datasets/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# yapf: disable
33
from .ade import ADE20KDataset
44
from .basesegdataset import BaseCDDataset, BaseSegDataset
5+
from .bdd100k import BDD100KDataset
56
from .chase_db1 import ChaseDB1Dataset
67
from .cityscapes import CityscapesDataset
78
from .coco_stuff import COCOStuffDataset
@@ -57,5 +58,5 @@
5758
'SynapseDataset', 'REFUGEDataset', 'MapillaryDataset_v1',
5859
'MapillaryDataset_v2', 'Albu', 'LEVIRCDDataset',
5960
'LoadMultipleRSImageFromFile', 'LoadSingleRSImageFromFile',
60-
'ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset'
61+
'ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset', 'BDD100KDataset'
6162
]

mmseg/datasets/bdd100k.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Copyright (c) OpenMMLab. All rights reserved.
2+
3+
from mmseg.datasets.basesegdataset import BaseSegDataset
4+
from mmseg.registry import DATASETS
5+
6+
7+
@DATASETS.register_module()
8+
class BDD100KDataset(BaseSegDataset):
9+
METAINFO = dict(
10+
classes=('road', 'sidewalk', 'building', 'wall', 'fence', 'pole',
11+
'traffic light', 'traffic sign', 'vegetation', 'terrain',
12+
'sky', 'person', 'rider', 'car', 'truck', 'bus', 'train',
13+
'motorcycle', 'bicycle'),
14+
palette=[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156],
15+
[190, 153, 153], [153, 153, 153], [250, 170,
16+
30], [220, 220, 0],
17+
[107, 142, 35], [152, 251, 152], [70, 130, 180],
18+
[220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70],
19+
[0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]])
20+
21+
def __init__(self,
22+
img_suffix='.jpg',
23+
seg_map_suffix='.png',
24+
reduce_zero_label=False,
25+
**kwargs) -> None:
26+
super().__init__(
27+
img_suffix=img_suffix,
28+
seg_map_suffix=seg_map_suffix,
29+
reduce_zero_label=reduce_zero_label,
30+
**kwargs)

mmseg/utils/class_names.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,26 @@ def lip_palette():
419419
]
420420

421421

422+
def bdd100k_classes():
423+
"""BDD100K class names for external use(the class name is compatible with
424+
Cityscapes )."""
425+
return [
426+
'road', 'sidewalk', 'building', 'wall', 'fence', 'pole',
427+
'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky',
428+
'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle',
429+
'bicycle'
430+
]
431+
432+
433+
def bdd100k_palette():
434+
"""bdd100k palette for external use(same with cityscapes)"""
435+
return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156],
436+
[190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0],
437+
[107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60],
438+
[255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100],
439+
[0, 0, 230], [119, 11, 32]]
440+
441+
422442
dataset_aliases = {
423443
'cityscapes': ['cityscapes'],
424444
'ade': ['ade', 'ade20k'],
@@ -435,7 +455,8 @@ def lip_palette():
435455
'stare': ['stare', 'STARE'],
436456
'lip': ['LIP', 'lip'],
437457
'mapillary_v1': ['mapillary_v1'],
438-
'mapillary_v2': ['mapillary_v2']
458+
'mapillary_v2': ['mapillary_v2'],
459+
'bdd100k': ['bdd100k']
439460
}
440461

441462

projects/bdd100k_dataset/README.md

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# BDD100K Dataset
2+
3+
Support **`BDD100K Dataset`**
4+
5+
## Description
6+
7+
Author: CastleDream
8+
9+
This project implements **`BDD100K Dataset`**
10+
11+
### Dataset preparing
12+
13+
Preparing `BDD100K Dataset` dataset following [BDD100K Dataset Preparing Guide](https://github.com/open-mmlab/mmsegmentation/tree/main/projects/mapillary_dataset/docs/en/user_guides/2_dataset_prepare.md#bdd100k)
14+
15+
```none
16+
mmsegmentation/data
17+
└── bdd100k
18+
├── images
19+
│ └── 10k
20+
│ ├── test [2000 entries exceeds filelimit, not opening dir]
21+
│ ├── train [7000 entries exceeds filelimit, not opening dir]
22+
│ └── val [1000 entries exceeds filelimit, not opening dir]
23+
└── labels
24+
└── sem_seg
25+
├── colormaps
26+
│ ├── train [7000 entries exceeds filelimit, not opening dir]
27+
│ └── val [1000 entries exceeds filelimit, not opening dir]
28+
├── masks
29+
│ ├── train [7000 entries exceeds filelimit, not opening dir]
30+
│ └── val [1000 entries exceeds filelimit, not opening dir]
31+
├── polygons
32+
│ ├── sem_seg_train.json
33+
│ └── sem_seg_val.json
34+
└── rles
35+
├── sem_seg_train.json
36+
└── sem_seg_val.json
37+
```
38+
39+
### Training commands
40+
41+
```bash
42+
%cd mmsegmentation
43+
!python tools/train.py projects/bdd100k_dataset/configs/pspnet_r50-d8_4xb2-80k_bdd100k-512x1024.py\
44+
--work-dir your_work_dir
45+
```
46+
47+
## Thanks
48+
49+
- [\[Datasets\] Add Mapillary Vistas Datasets to MMSeg Core Package. #2576](https://github.com/open-mmlab/mmsegmentation/pull/2576/files)
50+
- [\[Feature\] Support CIHP dataset #1493](https://github.com/open-mmlab/mmsegmentation/pull/1493/files)

0 commit comments

Comments
 (0)