Я пытаюсь переопределить метод __getitem__
в абстрактном классе набора данных PyTorch для задачи обнаружения объекта, в которой набор данных состоит из нескольких изображений, каждое из которых имеет несколько ограничительных рамок.
https://pytorch.org/tutorials/beginner/data_loading_tutorial.html
Ограничивающие прямоугольники определяются 5 параметрами: верхняя левая координата прямоугольника, нижняя правая координата прямоугольника и аннотация метки класса для объекта, обнаруженного внутри ограничивающего прямоугольника.
Итак: x1, y1, x2, y2, class_label
Метод PyTorch __getitem__
должен возвращать один (image, set_of_bounding_box_and_annotations)
при вызове с индексом целочисленного типа. Таким образом, __getitem__(17)
вернет 17-е изображение с набором всех ограничивающих рамок и меток.
Формат данных представляет собой словарь списков, каждый из которых состоит из словаря.
Пример:
my_dict =
{img_1.png: [{x1: 0, y1: 0, x2: 10, y2: 20, label: 'dog'}, {x1: 30, y1: 40, x2: 50, y2: 60, label: 'cat'}, ...],
{img_2.png: [{x1: 84, y1: 27, x2: 95, y2: 43, label: 'bird'}, {x1: 91, y1: 91, x2: 102, y2: 110, label: 'alligator'}, ...],
...
}
Таким образом, PyTorch требует метод __getitem__
для возврата изображения, сэмплового набора при передаче ему индекса данных.
Проблема в том, что словарь не имеет внутреннего порядка в Python, поэтому вы не можете просто вызвать my_dict[0]
. Похоже, OrderedDict
будет работать здесь, но мы хотим, чтобы значением пары ключ-значение был набор / список словаря boundingbox / label.
Как перевести данные в индексируемый формат, чтобы метод __getitem__
мог вернуть образец (image, bbox_and_labels)
?