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