Обрезать и выбрать только обнаруженную область из изображения в Python - PullRequest
2 голосов
/ 17 марта 2019

Я использовал Tensorflow Object Detection API для обнаружения рук по изображениям.Используя предоставленный пример кода (object_detection_tutorial.ipynb), я смог нарисовать ограничительные рамки на изображениях.Есть ли способ выбрать только обнаруженную область (которая находится внутри ограничительной рамки) и получить ее как изображение?

Например,

Пример входного изображения

enter image description here

Выход с тензорным потоком

enter image description here

Что я хочу

enter image description here enter image description here

Пример кода API обнаружения объектов можно найти здесь.https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 17 марта 2019

Да, в учебнике можно использовать переменную output_dict. Обратите внимание на все переменные, переданные в функцию vis_util.visualize_boxes_and_labels_on_image_array, они содержат поля, оценки и т. Д.

Сначала вам нужно получить форму изображения, поскольку координаты блока находятся в нормализованном виде.

img_height, img_width, img_channel = image_np.shape

Затем преобразуйте все координаты блока в абсолютный формат

absolute_coord = []
THRESHOLD = 0.7 # adjust your threshold here
N = len(output_dict['detection_boxes'])
for i in range(N):
    if output_dict['score'][i] < THRESHOLD:
        continue
    box = output_dict['detection_boxes']
    ymin, xmin, ymax, xmax = box
    x_up = int(xmin*img_width)
    y_up = int(ymin*img_height)
    x_down = int(xmax*img_width)
    y_down = int(ymax*img_height)
    absolute_coord.append((x_up,y_up,x_down,y_down))

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

bounding_box_img = []
for c in absolute_coord:
    bounding_box_img.append(image_np[c[1]:c[3], c[0]:c[2],:])

Затем просто сохраните все массивы в bounding_box_img как изображения. При сохранении вам может понадобиться изменить форму, так как img находится в форме [img_height, img_width, img_channel]. Кроме того, вы можете даже отфильтровать все обнаружения с низким уровнем достоверности, если вы используете массив оценок.

PS: я мог бы ошибиться с img_height и img_width, но это должно дать вам отправную точку.

...