TensorFlow: Как найти минимальные / максимальные координаты сегментации в тензоре, исключая нули? - PullRequest
0 голосов
/ 23 марта 2019

Для вычисления пересечения по объединению (IoU) я хочу найти координаты минимальных и максимальных значений (граничных пикселей) в изображении сегментации image_pred, которое представлено трехмерным тензором float32. В частности, я стремлюсь найти координаты объектов в изображении в верхнем левом и нижнем правом углу. Изображение полностью состоит из черных пикселей (значение 0.0), за исключением того, где находится объект, у меня есть цветные пиксели (0.0 <значения <1.0). Вот пример для такого ограничивающего прямоугольника (в моем случае объект является дорожным знаком, а среда затемнена): </p>

enter image description here

Мой подход до сих пор заключается в tf.boolean_mask для установки каждого пикселя в False, за исключением цветных пикселей:

zeros = tf.zeros_like(image_pred)
mask = tf.greater(image_pred, zeros)
boolean_mask_pred = tf.boolean_mask(image_pred, mask)

, а затем используйте tf.where, чтобы найти координаты маскированного изображения. Чтобы определить значения горизонтальной и вертикальной координат верхнего левого и нижнего правого углов прямоугольника, я подумал об использовании tf.recude_max и tf.reduce_min, но поскольку они не возвращают ни одного значения, если я предоставлю axis, я не уверен, что это правильная функция для использования. Согласно документации, если я не укажу axis, функция уменьшит все размеры, что тоже не то, что я хочу. Какая правильная функция для этого? IoU, в конце концов, представляет собой одно значение с плавающей запятой 1 *.

coordinates_pred = tf.where(boolean_mask_pred)
x21 = tf.reduce_min(coordinates_pred, axis=1)
y21 = tf.reduce_min(coordinates_pred, axis=0)
x22 = tf.reduce_max(coordinates_pred, axis=1)
y22 = tf.reduce_max(coordinates_pred, axis=0)

1 Ответ

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

Все, что вам нужно сделать, это не использовать tf.boolean_mask.Сначала я настроил похожую картинку.

import numpy as np
from matplotlib import pyplot as plt

image = np.zeros(shape=(256,256))
np.random.seed(0)
image[12:76,78:142] = np.random.random_sample(size=(64,64))
plt.imshow(image)
plt.show()

enter image description here

Затем получим координаты максимума и минимума по тензорному потоку.

import tensorflow as tf

image_pred = tf.placeholder(shape=(256,256),dtype=tf.float32)
zeros = tf.zeros_like(image_pred)
mask = tf.greater(image_pred, zeros)

coordinates_pred = tf.where(mask)
xy_min = tf.reduce_min(coordinates_pred, axis=0)
xy_max = tf.reduce_max(coordinates_pred, axis=0)

with tf.Session() as sess:
    print(sess.run(xy_min,feed_dict={image_pred:image}))
    print(sess.run(xy_max,feed_dict={image_pred:image}))

[12 78]
[ 75 141]
...