Как извлечь значения из файла CSV с аннотациями изображений и добавить их в новый файл CSV для Retin aNet в Python? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь преобразовать файл CSV из программного обеспечения VGG Image Annotator в файл CSV, который можно использовать в Retin aNet. Формат, который мне нужен для тренировочных данных Retin aNet: path / to / image.jpg, x1, y1, x2, y2, имя класса . Это пример моего CSV-файла от VIA: + ============= + =========== + ============ == + =========== + =================================== ===================== + === + | имя файла | file_size | region_count | region_id | region_shape_attributes | | + + ============= =========== + ============== + ======== === + ============================================== ========== + === + | img - 30.png | 2331731 | 10 | 0 | {"name": "rect", "x": 65, "y": 778, "width": 108, "height": 65} | | + ------------- + ----------- + -------------- + -------- --- + ---------------------------------------------- ---------- + --- +

По сути, мне нужно вытащить атрибуты x, y, width и height из скобок и добавить их в список. Это мой python код:

import csv

via_path = 'data/tiled/via.csv'

image_annotations = []

with open(via_path, "r") as f:
    reader = csv.reader(f, delimiter=",")
    for line in reader: 
        if '#' in line[0][0]:
            # bypassing comments in csv
            continue
        filename = line[1][2:-2]
        # strip brackets, split and get only the values we care about, then convert all the string to int 
        top_left_x, top_left_y, width, height = list(map(int,list(map(float, line[4].strip('][').split(',')[1:]))))

        if width == 0 or height == 0:
            continue

        # move from top left and width/height to x and y values
        if top_left_x < 0:
            top_left_x = 1
        if top_left_y < 0:
            top_left_y = 1
        x1 = top_left_x
        x2 = top_left_x + width
        y1 = top_left_y
        y2 = top_left_y + height 

        # TODO didn't add names this time since it is all one class
        name = "bird"

        # create the csv row
        new_row = []
        new_row.append(filename)
        new_row.append(x1)
        new_row.append(y1)
        new_row.append(x2)
        new_row.append(y2)
        new_row.append(name)

        image_annotations.append(new_row)

Этот код выводит:

ValueError
---> top_left_x, top_left_y, width, height = list(map(int,list(map(float, line[4].strip('][').split(',')[1:]))))
ValueError: not enough values to unpack (expected 4, got 0)

1 Ответ

1 голос
/ 13 марта 2020

Столбец region_shape_attributes представляет собой строку JSON. Вам нужно проанализировать его, чтобы получить содержащиеся в нем значения.

Python имеет встроенную поддержку JSON:

import json

# ... open CSV file, for each record ...

    shape = json.parse(line[4])

    top_left_x = shape['x']
    top_left_y = shape['y']
    # etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...