COCO 和 CityScapes 是 Detection 常用的两个数据集,当然由于 Instance Segmentation 和 Detection 任务是相似的,且它们都提供 mask 级的 label,所以也可以使用。目前它们也都提供了 stuff 的 label,所以也可以用于 Semantic Segmentation,以及结合两种 label 之后用于 Panoptic Segmentation。此外它们还可以用于一些其它任务,下面会提到。

本文主要关注 Detection/Instance Segmentation,对于其它 Segmentation 也会简略概括,其余一些 labels 则直接复制网上现有资料或略过。

2023 年了重新看了下,原来我 2019 年 8 月还在学习这个,这几年 AI 的发展真是快哇,有些后来很著名的东西当时还是刚刚听说,说的就是你 Transformer(其实对那会我的记忆里是 BERT 听说很屌,当时还搞不清它和 Transformer 的关系)。最近准备再认真看几篇这些年重要的论文和全部 Code,写一点 Blog。。
这几年边上班边玩耍,开始在 YouTube 更新一点旅游视频(4K HDR/3DVR),欢迎订阅:https://youtube.com/@snow_miku

Table of Contents

  1. COCO Dataset
  2. COCO 标注格式
    1. Instance (Object Detection) 的标注格式
    2. COCO Keypoint Detection / Stuff Segmentation / Image Caption 的标注格式
    3. COCO Panoptic Segmentaion 的标注格式
  3. COCO Python API
    1. 获取 Annotation 信息相关 API
    2. BBox/Mask 相关 API
    3. 标注可视化
    4. Common Practice
    5. Panoptic API
  4. CityScapes Dataset
  5. CityScapes 的标注格式
  6. cityscapesScripts
    1. helpers & preparation
    2. cityscapesViewer
    3. Convert Cityscapes Annotations to COCO Format

COCO Dataset

COCO 的全称是 Common Objects in COntext,是微软团队提供的一个可以用来进行目标检测、图像分割、关键点检测、图像描述的数据集。COCO 通过在 Flickr 上搜索 80 个对象类别和各种场景类型来收集图像,其使用了亚马逊的 Mechanical Turk (AMT)。

COCO 目前有 2014 和 2017 两个版本,图片都是一样的,只是 train/val 的划分不同。COCO 2014 经过实践后,开始将一部分 val 的图片划入 train 中。后来的 2017 中采用了这一划分。如果是 Detection/Instance Segmentation 这两个版本没有太多区别,2014 有现成的新 JSON。2017 后来出了 Semantic Segmentation 和 Panoptic Segmentation 的 label,除了 JSON 还提供一种 PNG 图片格式的,这两个 task 直接用 2017 会方便一些。

对于 Detection/Instance Segmentation,COCO_2017_train = COCO_2014_train + valminusminival (:val - minival) COCO_2017_val = minival

在同一个文件夹中解压 zip 文件,得到的文件结构如下:

  • COCO 2014

    COCO 2014COCO 2014
  • COCO 2017

    COCO 2017COCO 2017

有些解压工具会一次性读取/扫描 zip 里面的所有文件,导致 train 这种超大的 zip 打开就卡住,可以使用以下 Python 脚本解压,只需修改 coco_dataset_path 后运行。且多数解压工具会自动在外面再套上一个文件夹,需要手动调整一下目录结构或者用下面的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import zipfile
import os

coco_dataset_path = '/export/public/MS-COCO-2017'

def extract_zipfile(filepath):
print('Extracting {}...'.format(filepath))

global coco_dataset_path
zip_ref = zipfile.ZipFile(filepath, 'r')
zip_ref.extractall(coco_dataset_path)
zip_ref.close()

print('Successfully Extracted {}.'.format(filepath))

assert os.path.exists(coco_dataset_path), 'Path not exist.'
zipfiles = [os.path.join(coco_dataset_path, file_name)
for file_name in os.listdir(coco_dataset_path)
if os.path.splitext(file_name)[-1] == '.zip']

print("Zip files will be extrated:")
print('\n'.join(zipfiles))

for file_name in zipfiles: extract_zipfile(file_name)

COCO 有 Object Detection (Instance Segmentation)、Keypoint Detection、Stuff Segmentation (Semantic Segmentation)、Panoptic Segmentation、Image Captioning 五种标注。

COCO 标注格式

COCO 官网有 Data Format 的简介,下面逐项详细介绍。

Instance (Object Detection) 的标注格式

以下为 COCO-2017 Val 的 JSON (instance_val2017.json) 部分内容和整体格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{
"info": {"description": "COCO 2017 Dataset",
"url": "http://cocodataset.org",
"version": "1.0",
"year": 2017,
"contributor": "COCO Consortium",
"date_created": "2017/09/01"
},
"licenses": [
{"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
"id": 1,
"name": "Attribution-NonCommercial-ShareAlike License"},
{"url": "...","id": 2,"name": "..."},
...],
"images": [
{"license": 4,
"file_name": "000000397133.jpg",
"coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg",
"height": 427,
"width": 640,
"date_captured": "2013-11-14 17:02:52",
"flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg",
"id": 397133
},
{"license": 1,
"file_name": "000000037777.jpg",
"coco_url": "http://images.cocodataset.org/val2017/000000037777.jpg",
"height": 230,
"width": 352,
"date_captured": "2013-11-14 20:55:31",
"flickr_url": "http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg",
"id": 37777
},
...],
"annotations": [
{"segmentation": [[510.66,423.01,511.72,420.03,510.45,416.0,510.34,413.02,510.77,410.26,510.77,407.5,510.34,405.16,511.51,402.83,511.41,400.49,510.24,398.16,509.39,397.31,504.61,399.22,502.17,399.64,500.89,401.66,500.47,402.08,499.09,401.87,495.79,401.98,490.59,401.77,488.79,401.77,485.39,398.58,483.9,397.31,481.56,396.35,478.48,395.93,476.68,396.03,475.4,396.77,473.92,398.79,473.28,399.96,473.49,401.87,474.56,403.47,473.07,405.59,473.39,407.71,476.68,409.41,479.23,409.73,481.56,410.69,480.4,411.85,481.35,414.93,479.86,418.65,477.32,420.03,476.04,422.58,479.02,422.58,480.29,423.01,483.79,419.93,486.66,416.21,490.06,415.57,492.18,416.85,491.65,420.24,492.82,422.9,493.56,424.39,496.43,424.6,498.02,423.01,498.13,421.31,497.07,420.03,497.07,415.15,496.33,414.51,501.1,411.96,502.06,411.32,503.02,415.04,503.33,418.12,501.1,420.24,498.98,421.63,500.47,424.39,505.03,423.32,506.2,421.31,507.69,419.5,506.31,423.32,510.03,423.01,510.45,423.01]],
"area": 702.1057499999998,
"iscrowd": 0,
"image_id": 289343,
"bbox": [473.07,395.93,38.65,28.67],
"category_id": 18,
"id": 1768
},
...,
{"segmentation": {"counts": [20736,2,453,5,452,9,447,13,444,13,443,15,442,15,442,15,443,15,442,15,443,14,444,13,446,10,448,8,451,4,108769,9,446,12,439,19,1,14,8,11,402,39,3,14,401,57,399,59,398,59,397,60,397,60,397,60,398,59,397,60,397,60,397,59,399,57,400,15,1,9,7,25,401,14,16,26,402,12,15,28,404,9,14,30,406,5,14,31,406,50,405,50,407,44,412,41,7,6,402,40,7,9,401,40,7,10,399,40,7,12,398,39,8,12,397,39,8,13,397,60,397,60,397,61,396,61,397,61,396,62,396,61,397,60,399,4,1,53,405,52,406,51,407,50,408,17,1,30,410,8,2,4,18,14,413,4,32,6,95474,8,5,14,428,11,2,17,425,33,412,1,3,41,410,4,1,43,409,48,408,50,407,51,405,52,405,47,5,1,404,28,4,8,418,25,432,24,434,22,436,12,2,6,439,5,34552],
"size": [457,640]
},
"area": 3074,
"iscrowd": 1,
"image_id": 49759,
"bbox": [45,167,519,65],
"category_id": 1,
"id": 900100049759
},
...],
"categories": [{"supercategory": "person","id": 1,"name": "person"},
...,
{"supercategory": "indoor","id": 90,"name": "toothbrush"}
]
}
  1. info 是整个数据集的描述信息,之后不会用到。

  2. licenses 是协议的 id、网址和名称,之后每张图片的信息中都会有一个 licenses id。

  3. images 中一般需要用到的有四个。file_name:图片在对应 train/val/test 文件夹中的文件名;height/width:图片的宽高;id:图片的唯一 id,在 COCO API 中会用到。

  4. annotations 所有图片上所有物体的标注统一储存在同一个 “annotations” 中,在这里面的每一个标注都含有它对应哪张图片的信息(img_id),和它自己的序号(id)。
    "iscrowd": 0 的 annotation 是 Polygons 形式的,表示单个的对象,它的 “segmentation” 是二维 list,这是因为一个物体可能被遮挡部分而分隔开(少数情况),需要多个封闭的曲线才能标注。每个一维 list 里面就是一个封闭图形,值为 xyxyxy… 形式的坐标,即 [510.66,423.01,511.72,420.03,...] 代表图上 (510.66,423.01), (511.72,420.03), ... n 个点。
    "iscrowd": 1 的是 RLE(Run-Length Encoding,游程编码) 形式的,标注一组对象(密集,无法很好地分隔成单个的标注)。由 0 开始,交替进行,比如 [20736,2,453, ...] 表示有 20736 个 0,接下来是 2 个 1,接下来是 453 个 0 …,所以这种形式还需要一个 size 信息,最后把这一行 reshape 成这个形状就得到 label。
    "area" 为 mask 的面积。
    "bbox" 框的坐标,xywh 格式。都是 0-index 的,横轴为 x/w,像素的中心点为原点,即 bbox = [0, 0, 1, 1] 包围了(左上角)第一个像素。

  5. categories 一个小类一个 id,被 annotations 中指向。一个大类下包含若干个小类。注意 COCO 总共有 80+1 类 things,而 id 是 1~90,并不是连续的。

其中,infolicensesimages 这三个字段的内容在不同的 task 的 JSON 文件中是一样的。不同的是 annotationcategory。下面的只会介绍这两个字段。

COCO Keypoint Detection / Stuff Segmentation / Image Caption 的标注格式

Keypoint Detection

annotations 完全包含上面 Detection 中的内容,并且每个 anno 多出两个字段:"keypoints": [x1,y1,v1,...], ..."num_keypoints": <int>, ...
keypoints 是一个长度为 3×k 的数组,其中 k 是这个类中 keypoints 的总数量。每一个 keypoint 是一个长度为 3 的数组。第一和第二个元素分别是 x 和 y 坐标值,第三个元素是个标志位 v,v=0 时表示这个关键点没有标注(这种情况下 x=y=v=0),v=1 时表示这个关键点标注了但是不可见(被遮挡了),v=2 时表示这个关键点标注了同时也可见。
num_keypoints 表示这个目标上被标注的关键点的数量(v>0),比较小的目标上无法标注关键点。

categories 则只有一类 "supercategory": "person",同样包含了 Instance Detection 中的所有内容,并且多出了两个字段:"keypoints": [str]"skeleton": [edge]
keypoints 是一个长度为k的数组,包含了每个关键点的名字。
skeleton 定义了各个关键点之间的连接性(比如人的左手腕和左肘就是连接的)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"annotations":[
{
"segmentation": [[125.12,539.69,140.94,522.43...]],
"num_keypoints": 10,
"area": 47803.27955,
"iscrowd": 0,
"keypoints": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,309,1,177,320,2,191,398...],
"image_id": 425226,"bbox": [73.35,206.02,300.58,372.5],"category_id": 1,
"id": 183126
}, ...]
,

"categories":[
{
"supercategory": "person",
"id": 1,
"name": "person",
"keypoints": ["nose","left_eye","right_eye","left_ear","right_ear","left_shoulder","right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"],
"skeleton": [[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7],[6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]]
}]

Stuff Segmentation (Semantic Segmentation)

格式字段与上面 Instance Detection 的完全相同,只是 annotations 中的 iscrowd 没有意义,默认为 0,且每个 segmentation 的值都是 encoded RLE,而不是之前的 polygons/uncompressed RLE(后面有 encoded/uncompressed 的介绍)。categories 的 id 为 92~183,共有 92 类。

1
2
3
4
5
6
7
{
"segmentation":
{"counts": "omh51Y=0ng31PXL01O10iW10ThN1PPY2", "size": [426, 640]},
"area": 11.0, "iscrowd": 0, "image_id": 139,
"bbox": [444.0, 226.0, 20.0, 11.0],
"category_id": 105, "id": 20000002
},

Image Caption

没有 categories 字段。 annotations 多于 images 的个数,一张图片可以有多个描述。且只含三个信息,很简单,如下:

1
2
3
4
5
6
7
8
9
10
annotation{
"id": <int>,
"image_id": <int>,
"caption": <str>
}

{
"image_id": 179765,
"id": 38,"caption": "A black Honda motorcycle parked in front of a garage."
}

COCO Panoptic Segmentaion 的标注格式

全景分割的 annotations 与之前的格式不一样,它将一张图片的所有 annos 储存在一个 dict 中,而不像之前一样所有图片所有 annos 平级共同储存。以下是 COCO 2017 的 panoptic_val2017.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{
"info": {...},
"licenses": [...],
"images": [...],

"annotations": [
{
"segments_info": [
{
"id": 3226956,
"category_id": 1,
"iscrowd": 0,
"bbox": [413,158,53,138],
"area": 2840
},
...
{
"id": 6391959,
"category_id": 200,
"iscrowd": 0,
"bbox": [135,359,336,67],
"area": 12618
}
],
"file_name": "000000000139.png",
"image_id": 139
},
...
],

"categories": [
{
"supercategory": "person",
"isthing": 1,
"id": 1,
"name": "person"
},
...
{
"supercategory": "indoor",
"isthing": 1,
"id": 90,
"name": "toothbrush"
},
{
"supercategory": "textile",
"isthing": 0,
"id": 92,
"name": "banner"
},
...
{
"supercategory": "window",
"isthing": 0,
"id": 181,
"name": "window-other"
},
{
"supercategory": "plant",
"isthing": 0,
"id": 184,
"name": "tree-merged"
},
...
{
"supercategory": "textile",
"isthing": 0,
"id": 200,
"name": "rug-merged"
}
]
}

因为 Panoptic 是 Non-Overlap 的,所以 segmentation 是用一张 PNG 图片储存:["annotations"][i]["file_name"]。它是 class-agnostic 的,每个 segment 的 semantic information (class) 储存在 JSON:["annotations"][i]["segments_info"][j] ([id])。以 RGB24 打开 PNG,如果像素值为 (0,0,0),则表示 Unlabeled pixels (void),其余的通过 ids = R + G×256 + B×256^2 即可得到 JSON 中对应的 id 值。
i 表示总图片数量,j 表示每张图中标签的数量

此外,iscrowd 只与 things 有关。thing categories 与 Detection 中的完全相同,stuff categories 与 Semantic Seg 中的有所不同。categories 里面多出的 isthing 用来区分 things 和 stuff。在 panopticapi/panoptic_coco_categories.json 中还会多出一个 color: [int, int, int] 表示这一类的在生成 PNG 时的颜色,对于 things,不同 instance 之间会在这个 base color 上抖动一点,然后通过最终的 RGB 生成 JSON 里的 id。

COCO Python API

安装 COCO Python API:

1
2
3
4
5
6
7
# Offical
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install

# Or
pip install pycocotools

所有的 API 可以参考 GitHub/cocoapi-coco.pyGitHub/cocoapi-mask.py。这里列出部分 API 使用方式。

获取 Annotation 信息相关 API

首先读取 annotation json 文件:

1
2
from pycocotools.coco import COCO
coco = COCO("path_to_GT_json_file")
  1. img_ids = coco.getImgIds(imgIds=[], catIds=[]): -> list[int]
    空参数:返回所有图片的 id:[397133, 37777, 252219, 87038, 174482, 403385, 6818, 480985, 458054, 331352, ...],在 json 文件的 "images" -> "id" 字段。
    一个或两个参数传入 int 或 list[int]:返回同时满足所有参数中条件的所有图片(一张图片中可能有多个 Cats)

  2. imgs = coco.loadImgs(img_ids) -> list[dict]
    传入一个图片 id 组成的 list(或单个 int id),返回一个长度相同的 list,每个元素为一个 dict,就是 json 文件的 "images" 字段中一个/多个的 dict 组成的 list。
    一般使用 imgs = {k: v for k, v in imgs.items() if k in ['id', 'width', 'height', 'file_name']} 去除无用的信息。

  3. ann_ids = coco.getAnnIds(imgIds=[], catIds=[], areaRng=[], iscrowd=None)
    getImgIds() 类似,返回所有 annotation 的 id,在 "annotations" -> "id" 字段。一般传入 imgIds=img_ids, iscrowd=False
    areaRng 传入一个 float array,代表 area 字段中的大小筛选。

  4. cat_ids = coco.getCatIds(catNms=[], supNms=[], catIds=[])
    返回所有 categories 的 id:list[int],在这里就是 [1, 2, 3, ..., 90]。前两个参数是 list[string],最后一个是 list[int] 类型。

  5. anns = coco.loadAnns(ann_ids)cats = coco.loadCats(cat_ids)
    loadImgs() 类似,返回的就是 annotations 字段中一个/多个的 dict 组成的 list。注意这里都是 Python list 而不是 Numpy Array,所以不能 bbox[2:] = bbox[:2] + bbox[2:] 转换 xywh 为 xyxy。

BBox/Mask 相关 API

1
import pycocotools.mask as mask

各种函数和它的参数及格式在代码 GitHub/cocoapi-mask.py 开头的注释已经写得比较清楚了。说明两点:

  1. 里面的 Mask IoU 等计算都需要将 binary masks 转换为 encoded RLE 格式之后进行。之前 JSON 里面的 RLE 是 uncompressed RLE,由 binary masks 到它的转换之前已经介绍过了,而 encoded RLE 是 bytes 类型的,类似于 1。[hxwxn] Binary mask 可以使用 mask.encode() 转换为 encoded RLE,而其他的包括 uncompressed RLE 可以用 mask.frPyObjects() 转换。

  2. 例如 binary masks 等等,coco 里面的数组都是 column-major order (Fortran memory order),调用一些 API 也要使用这种。一般的 numpy array 都是 row-major order (C memory order),也就是数组里面的每一行内的数在内存中是相邻的,同时在 reshape 和 broadcast 等操作中 last dim 是变化最快的。使用 np.ascontiguousarray()np.asfortranarray() 构造/转换数组。

标注可视化

GitHub/cocoapi-pycocoDemo.ipynb 中已经有了部分 anno 的图片和可视化代码。里面直接使用了 coco.showAnns(anns),下面 Gist 中的代码用 Numpy/OpenCV 画出一个被分隔成两个 Polygon 的物体的 Mask,和一个 RLE 格式的 Mask。

Multi-Polygon Annos

Multi-Polygon Annos

RLE Annos

RLE Annos

全部的可以在 COCO 官网上使用 COCO Explorer 搜索查看。

COCO ExplorerCOCO Explorer

Common Practice

COCO 除了 crowd 通常不参与训练,需要排除,此外有一些无效的标注也需要排除,它的类别标号不是连续的,需要创建 dict 映射一下,不然 Loss 函数会不接受大于 len(logit) 的标注。这部分的代码可参考 maskrcnn-benchmark/coco.py

Panoptic API

https://github.com/cocodataset/panopticapi


CityScapes Dataset

在下载界面有很多文件,在这里只需要 leftImg8bit_trainvaltest.zip (11GB)gtFine_trainvaltest.zip (241MB) 即可。图像是在车上左右放了两台相机拍摄的,因此这个数据集还可以有 depth maps 和 Right Image。除了 8bit 以外,还提供 16bit HDR 图片。此外还有车的 GPS 坐标,等等很多信息,供自动驾驶等综合任务使用。extra 中是额外 19998 张粗略标注的图片(对应 gtCoarse.zip (1.3GB))。对于纯粹的 Detection/Segmentation,只需要前面两个文件就足够了(3475 trainval,1525 test)。

对于文件目录结构和文件名含义,可以参考 GitHub/cityscapesScripts,这个 repo 还提供一些有用的脚本,git clone 到同一目录之后(去掉 Git 自动加上的文件夹),文件如下图。

CityScapes DatasetCityScapes Dataset

CityScapes 的标注格式

与 COCO 不同,CityScapes 的 label 储存在对应的文件夹中而不是集中在一个 JSON,每一张图片对应了 4 个 label 文件,前半部分文件名相同:

  • {city}_{seq:0>6}_{frame:0>6}_gtFine_color.png
    用于观看的彩色 label

  • {city}_{seq:0>6}_{frame:0>6}_gtFine_instanceIds.png
    为 16bit png label。如果是 stuff,则像素值为 0~24 的 class ID;如果是 things,则像素值为 class ID × 1000 + X,X 为连续的自然数,例如 26000, 26001, 26003 可以表示图中的三辆不同的车。class ID 对应的类别名称见下一节。

  • {city}_{seq:0>6}_{frame:0>6}_gtFine_labelIds.png

  • {city}_{seq:0>6}_{frame:0>6}_gtFine_polygons.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"imgHeight": 1024,
"imgWidth": 2048,
"objects": [
{
"label": "road",
"polygon": [
[
0,
769
],
[
290,
574
],
// ... n polygon coordinates
]
},
// ... n objects in this image
]
}

cityscapesScripts

在上面 GitHub Repo 里 Scripts 介绍内的 Most important files 中,包含了 label 的定义和转换工具,可以阅读代码开头的注释。

helpers & preparation

helpers/labels.py 内定义了所有类别的 class ID,对于 hasInstances = True and ignoreInEval = False 的,即可以用于 Detection 的,共有 8+1 类。

cityscapesViewer

这是一个使用 PyQt4 写的 GUI 预览程序,在 Windows + Anaconda 下,只需要先 conda install sip,然后在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4 下载编译好的 Windows PyQt4 Wheel,然后 pip install 安装。

1
2
cd CityScapse_ROOT/cityscapesscripts
python viewer/cityscapesViewer.py

即可打开 GUI,按说明使用即可,如果报错 ModuleNotFoundError: No module named 'cityscapesscripts',那么可以在 cityscapesViewer.py 中加上 sys.path.append("../")。如果 GUI 打开之后报错路径错误,那么检查下文件目录是否是上节图中那样,或是把 CityScapes 的根目录加到 PATH 中。

这个 GUI Viewer 非常好用,鼠标移到某个位置显示 label 区域和名称,载入方便迅速,工具齐全。

Cityscapes Viewer
Cityscapes Viewer

Convert Cityscapes Annotations to COCO Format

可以使用 maskrcnn-benchmark 附带的脚本:GitHub/maskrcnn-benchmark/tools/cityscapes/,使用方法:GitHub/Steps to convert Cityscapes Annotations to COCO Format。注意这里面的 gtFine 外面还有一个文件夹,跟上面不一样,或者可以修改 convert_cityscapes_to_coco.py 的 line127~line130

此外,由于 CityScapes 数据集较小,可以使用 COCO 训练的模型作为其预训练模型,需要将 80+1 类的预测改为 10+1 类的预测,因此需要对模型进行部分改动。此外还有其他一些技巧,可参考Mask R-CNN: CityScapes