Универсальная функция загрузчика для набора данных в стиле MS COCO
Я работаю с Mask-RCNN и хочу обучить свой собственный набор данных в кокосовом стиле с несколькими категориями. Для начала у меня всего 2 занятия (кроме фона).
Хотя Mask-RCNN поставляется с образцом набора данных, они либо содержат только один класс, либо сами генерируют данные, поэтому я не могу понять, как загрузить аннотированные изображения и начать обучение. Я проводил много времени в функциях Python, но продолжал получать ошибки, такие как:
TypeError: list indices must be integers or slices, not str
который оставил меня в значительной степени невежественным.
У меня есть текущий загрузчик (для загрузки моего набора данных в стиле кокосов) (из загрузчика кокосов в репозитории Mask R-CNN)
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)))
Который ничего не загружает, естественно.
Может ли кто-нибудь помочь мне написать функцию загрузчика, которая может быть использована во всех видах наборов данных в стиле кокосов, независимо от номера класса?
Вот моя структура набора данных в кокосовом стиле:
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
1 ответ
Хорошо, так что я понял это. Я нашел здесь файл, показывающий общий способ загрузки набора данных в кокосовом стиле и обеспечения его работы.
Конечно, если вы хотите сделать это, вам нужно немного изменить переменные, так как изначально он был разработан для набора данных "shape". Таким образом, вы переименовываете все, что имеет "формы", в любое имя вашего набора данных.
НЕ пытайтесь изменить функции и способ их работы. Не пытайтесь скопировать что-то еще в этот код, вся структура является цепной, и если вы что-то измените в функции (с точки зрения потока), вы не сможете запустить код.