Как обрабатывать вложенные списки JSON с помощью Python - PullRequest
1 голос
/ 19 июня 2019

Я тренирую набор данных по маске rcnn.Я написал около 1500 изображений на инструменте labelIMG (https://github.com/tzutalin/labelImg).

Короче говоря, мне нужно получить координаты x и y из списка сегментации в файлах JSON.

КакМогу ли я получить доступ к списку с помощью программирования на Python? ИЛИ есть ли другой способ использовать аннотацию .xml для маски Rcnn.

Это форма набора данных, преобразованная из VOC PASCAL в COCO. XML была преобразована в синтаксис JSON.

Код

import json
import codecs

data = json.load(codecs.open('example.json', 'r', 'utf-8-sig'))

for i in data['annotations']:
    print(data['annotations'][0]) #want to output segmentation values in JSON files

Файл JSON

{
    "images": [
        {
          "file_name": "out538.png",
          "height": 720,
          "id": 20180000001,
          "width": 1280
        },
        {
          "file_name": "3 0751.jpg",
          "height": 720,
          "id": 20180000002,
          "width": 1280
        }
    ],
    "type": "instances",
    "annotations": [
        {
            "segmentation": [
            [
                935,
                372,
                935,
                554,
                1195,
                554,
                1195,
                372
            ]
            ],
            "area": 47320,
            "iscrowd": 0,
            "ignore": 0,
            "image_id": 20180000001,
            "bbox": [
            935,
            372,
            260,
            182
            ],
            "category_id": 1,
            "id": 1
        },
        {
            "segmentation": [
            [
                743,
                317,
                743,
                480,
                962,
                480,
                962,
                317
            ]
            ],
            "area": 35697,
            "iscrowd": 0,
            "ignore": 0,
            "image_id": 20180000001,
            "bbox": [
            743,
            317,
            219,
            163
            ],
            "category_id": 1,
            "id": 2
        }
    ],
    "categories": [
      {
        "supercategory": "none",
        "id": 1,
        "name": "bike"
      },
      {
        "supercategory": "none",
        "id": 2,
        "name": "Bike"
      }
    ]

}

я хочу значения списка сегментации: например, 935, 372, 935, 554, 1195, 554, 1195, 372, но все, что я получаю, это ошибка "индексы списка должны быть целыми числами или кусочками, а не dict"

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Переменная i в вашем цикле for i in data['annotations']: будет словарем, поскольку annotations является списком словарей.Чтобы получить доступ к списку segmentation, вам нужно сделать что-то вроде этого:

for annotation in data['annotations']:
    segmentation = annotation['segmentation']
    actual_segment_data = segmentation[0]

Последняя строка кода необходима, потому что segmentation - это список в списке.

Это должно вернуть следующее: [935, 372, 935, 554, 1195, 554, 1195, 372].

0 голосов
/ 19 июня 2019

JSON - это диктат из ... диктов. Таким образом, вам нужен правильный ключ для перехода к сегментам.

annotations[0]['segmentation'] 

должен дать вам список

...