Как получить множественные координаты ограничивающего прямоугольника в API обнаружения объектов tensorflow

Я хочу получить координаты нескольких ограничивающих прямоугольников и класс каждого ограничивающего прямоугольника и вернуть его в виде файла JSON.

когда я печатаю коробки [] из следующего кода, он имеет форму (1,300,4). В прямоугольниках [] находится 300 координат. Но на моем предсказанном изображении их всего 2. Мне нужны координаты ограничивающих рамок, которые предсказаны на моем изображении.

Кроме того, как мы узнаем, какая ограничивающая рамка сопоставлена ​​с какой категорией / классом на изображении?

например, предположим, что у меня есть собака и человек на изображении, как мне узнать, какая ограничивающая рамка соответствует классу собаки, а какая - классу человека? Коробки [] дают нам массив формы (1,300,4) без какого-либо указания того, какой ограничивающий прямоугольник соответствует какому классу на изображении.

Я следил за этим ответом, чтобы получить координаты ограничивающей рамки из 300 координат в блоках [], используя пороговую оценку.

Я пробовал получить ограничивающую рамку с наивысшим баллом. Но он возвращает только одну ограничивающую рамку, даже если у прогнозируемого изображения есть несколько ограничивающих рамок.

Координаты ограничивающего прямоугольника с наивысшим баллом даже не совпадают с координатами ограничивающего прямоугольника на прогнозируемом изображении. Как мне получить координаты ограничивающего прямоугольника на моем прогнозируемом изображении?

            vis_util.visualize_boxes_and_labels_on_image_array(
                image_np,
                np.squeeze(boxes),
                np.squeeze(classes).astype(np.int32),
                np.squeeze(scores),
                category_index,
                use_normalized_coordinates=True,
                line_thickness=8)
            im = Image.fromarray(image_np)

            true_boxes = boxes[0][scores[0]==scores.max()]    # Gives us the box with max score
            for i in range(true_boxes.shape[0]):   # rescaling the coordinates
                ymin = true_boxes[i,0]*height
                xmin = true_boxes[i,1]*width
                ymax = true_boxes[i,2]*height
                xmax = true_boxes[i,3]*width

Координаты, которые я получаю из приведенного выше кода xmin, ymin, xmax, ymax (который имеет максимальную оценку), не совсем соответствуют координатам ограничивающего прямоугольника на прогнозируемом изображении. Они погашены на несколько пикселей. Кроме того, я получаю только одну ограничивающую рамку, хотя у предсказанного изображения есть несколько ограничивающих рамок и несколько классов (например, собака и человек).

Я хотел бы вернуть файл JSON с image_name, bounding_boxes и классом, соответствующим каждому ограничивающему прямоугольнику.

Спасибо, я новичок в этом. Пожалуйста, спросите, если вы не поняли какую-либо часть вопроса.


person keshav N    schedule 24.05.2019    source источник
comment
Одна из распространенных ошибок - испортить height и width, пробовали ли вы переключить их и посмотреть, верны ли результаты?   -  person danyfang    schedule 24.05.2019
comment
Высота и ширина - не проблема. Я проверил ограничивающий прямоугольник с наивысшим баллом в квадратах [] и сравнил его с ограничивающим прямоугольником на моем изображении. Они довольно близки, но на несколько пикселей отстают. Я не думаю, что проблема в значениях высоты и ширины.   -  person keshav N    schedule 27.05.2019
comment
Неважно, я понял это. Спасибо.   -  person keshav N    schedule 28.05.2019


Ответы (1)


Я следил за этим ответом здесь ссылка и я нашел все координаты своего ограничивающего прямоугольника:

min_score_thresh=0.60
true_boxes = boxes[0][scores[0] > min_score_thresh]
for i in range(true_boxes.shape[0]):
    ymin = int(true_boxes[i,0]*height)
    xmin = int(true_boxes[i,1]*width)
    ymax = int(true_boxes[i,2]*height)
    xmax = int(true_boxes[i,3]*width)

    roi = image[ymin:ymax,xmin:xmax].copy()
    cv2.imwrite("box_{}.jpg".format(str(i)), roi)
person Tong    schedule 09.07.2019