MS COCO 风格数据集的通用加载函数
Generic Loader Function for MS COCO Style Dataset
我正在使用 Mask-RCNN 并想训练我自己的几类 coco 风格的数据集。首先,我只有 2 classes(除了背景)。
虽然 Mask-RCNN 自带样本数据集,但它们要么只包含一个 class,要么它们自己生成数据,这让我无法理解如何加载带注释的图像并开始训练。我在 Python 函数上花费了大量时间,但不断收到如下错误:
TypeError: list indices must be integers or slices, not str
这让我一头雾水。
我当前的加载器(用于加载我的 coco 样式数据集)如下(来自 Mask R-CNN 存储库中的 coco 加载器)
def load_components(self, dataset_dir, subset, year=DEFAULT_DATASET_YEAR):
coco = COCO("{}/annotations/instances_{}{}.json".format(dataset_dir, subset, year))
if subset == "minival" or subset == "valminusminival":
subset = "val"
image_dir = "{}/{}{}".format(dataset_dir, subset, year)
# Load all classes or a subset?
class_ids = sorted(coco.getCatIds())
# All images or a subset?
image_ids = list(coco.imgs.keys())
# Add classes
for i in class_ids:
self.add_class("coco", i, coco.loadCats(i)[0]["name"])
# Add images
for i in image_ids:
self.add_image(
"coco", image_id=i,
path=os.path.join(image_dir, coco.imgs[i]['file_name']),
width=coco.imgs[i]["width"],
height=coco.imgs[i]["height"],
annotations=coco.loadAnns(coco.getAnnIds(
imgIds=[i], catIds=class_ids, iscrowd=None)))
自然不会加载任何东西。
谁能帮我写一个加载器函数,它可以用于各种 coco 风格的数据集,无论 class 数量如何?
这是我的数据集结构,是 coco 风格的:
components
│
└───train
│ │
│ └───annotations
│ │ │ <image_id>_<object_class_name>_<annotation_id>.png
│ │ │ ...
│ │
│ └───<subset><year>
│ │ │ <image_id>.jpeg
│ │ │ ...
│ └─── instances_components_train2018.json
└───val
│
└───annotations
│ │ <image_id>_<object_class_name>_<annotation_id>.png
│ │ ...
│
└───<subset><year>
│ │ <image_id>.jpeg
│ │ ...
│ │
└─── instances_components_val2018.json
编辑:完整追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-5f1fb6581c25> in <module>()
1 # Load dataset
2 dataset = components.ComponentsDataset()
----> 3 dataset.load_components(DATASET_DIR, subset="train")
4
5 # Must call before using the dataset
~/workspace/Mask_RCNN/samples/components/components.py in load_components(self, dataset_dir, subset)
72 # Load all classes or a subset?
73 class_ids = sorted(coco.getCatIds())
---> 74
75 # All images or a subset?
76 image_ids = list(coco.imgs.keys())
~/workspace/Mask_RCNN/samples/components/components.py in <listcomp>(.0)
72 # Load all classes or a subset?
73 class_ids = sorted(coco.getCatIds())
---> 74
75 # All images or a subset?
76 image_ids = list(coco.imgs.keys())
TypeError: list indices must be integers or slices, not str
好的,我明白了。我找到了一个文件 here,显示了加载 coco 样式数据集并使其工作的通用方法。
当然,如果你想这样做,你需要稍微修改变量,因为它最初是为"shapes"数据集设计的。因此,您将具有 "shapes" 的所有内容重命名为您的数据集名称。
请勿尝试更改功能及其工作方式。不要试图将其他内容复制到该代码中,整个结构是一个链式结构,如果您更改函数中的某些内容(就流程而言),您可能无法获得代码 运行.
我正在使用 Mask-RCNN 并想训练我自己的几类 coco 风格的数据集。首先,我只有 2 classes(除了背景)。
虽然 Mask-RCNN 自带样本数据集,但它们要么只包含一个 class,要么它们自己生成数据,这让我无法理解如何加载带注释的图像并开始训练。我在 Python 函数上花费了大量时间,但不断收到如下错误:
TypeError: list indices must be integers or slices, not str
这让我一头雾水。
我当前的加载器(用于加载我的 coco 样式数据集)如下(来自 Mask R-CNN 存储库中的 coco 加载器)
def load_components(self, dataset_dir, subset, year=DEFAULT_DATASET_YEAR):
coco = COCO("{}/annotations/instances_{}{}.json".format(dataset_dir, subset, year))
if subset == "minival" or subset == "valminusminival":
subset = "val"
image_dir = "{}/{}{}".format(dataset_dir, subset, year)
# Load all classes or a subset?
class_ids = sorted(coco.getCatIds())
# All images or a subset?
image_ids = list(coco.imgs.keys())
# Add classes
for i in class_ids:
self.add_class("coco", i, coco.loadCats(i)[0]["name"])
# Add images
for i in image_ids:
self.add_image(
"coco", image_id=i,
path=os.path.join(image_dir, coco.imgs[i]['file_name']),
width=coco.imgs[i]["width"],
height=coco.imgs[i]["height"],
annotations=coco.loadAnns(coco.getAnnIds(
imgIds=[i], catIds=class_ids, iscrowd=None)))
自然不会加载任何东西。
谁能帮我写一个加载器函数,它可以用于各种 coco 风格的数据集,无论 class 数量如何?
这是我的数据集结构,是 coco 风格的:
components
│
└───train
│ │
│ └───annotations
│ │ │ <image_id>_<object_class_name>_<annotation_id>.png
│ │ │ ...
│ │
│ └───<subset><year>
│ │ │ <image_id>.jpeg
│ │ │ ...
│ └─── instances_components_train2018.json
└───val
│
└───annotations
│ │ <image_id>_<object_class_name>_<annotation_id>.png
│ │ ...
│
└───<subset><year>
│ │ <image_id>.jpeg
│ │ ...
│ │
└─── instances_components_val2018.json
编辑:完整追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-5f1fb6581c25> in <module>()
1 # Load dataset
2 dataset = components.ComponentsDataset()
----> 3 dataset.load_components(DATASET_DIR, subset="train")
4
5 # Must call before using the dataset
~/workspace/Mask_RCNN/samples/components/components.py in load_components(self, dataset_dir, subset)
72 # Load all classes or a subset?
73 class_ids = sorted(coco.getCatIds())
---> 74
75 # All images or a subset?
76 image_ids = list(coco.imgs.keys())
~/workspace/Mask_RCNN/samples/components/components.py in <listcomp>(.0)
72 # Load all classes or a subset?
73 class_ids = sorted(coco.getCatIds())
---> 74
75 # All images or a subset?
76 image_ids = list(coco.imgs.keys())
TypeError: list indices must be integers or slices, not str
好的,我明白了。我找到了一个文件 here,显示了加载 coco 样式数据集并使其工作的通用方法。
当然,如果你想这样做,你需要稍微修改变量,因为它最初是为"shapes"数据集设计的。因此,您将具有 "shapes" 的所有内容重命名为您的数据集名称。
请勿尝试更改功能及其工作方式。不要试图将其他内容复制到该代码中,整个结构是一个链式结构,如果您更改函数中的某些内容(就流程而言),您可能无法获得代码 运行.