Функция image.combined_non_max_suppression
Функция combined_non_max_suppression применяется к данным
детекции объектов и выполняет не-максимальное подавление
(combined non-max suppression) для пакета изображений
и множества классов одновременно. Первым параметром
передаётся тензор рамок формы [batch_size, num_boxes, q, 4],
вторым - тензор оценок формы [batch_size, num_boxes, num_classes].
Параметр max_output_size_per_class задаёт максимальное число
рамок на класс, max_total_size - общее максимальное число
рамок на изображение. Параметры iou_threshold и
score_threshold управляют порогами пересечения и уверенности.
Функция возвращает кортеж из четырёх тензоров: отфильтрованные
рамки, оценки, индексы классов и количество валидных детекций.
Синтаксис
tf.image.combined_non_max_suppression(
boxes,
scores,
max_output_size_per_class,
max_total_size,
iou_threshold=0.5,
score_threshold=float('-inf'),
pad_per_class=False,
clip_boxes=True,
name=None
)
Пример
Давайте создадим две рамки для одного изображения и оценки для двух классов, а затем выполним подавление:
import tensorflow as tf
boxes = tf.constant([[
[0.0, 0.0, 1.0, 1.0],
[0.1, 0.1, 0.9, 0.9]
]])
scores = tf.constant([[
[0.9, 0.1],
[0.8, 0.2]
]])
res = tf.image.combined_non_max_suppression(
boxes,
scores,
max_output_size_per_class=2,
max_total_size=2
)
print(res[0])
print(res[1])
print(res[2])
print(res[3])
Результат выполнения кода:
tf.Tensor(
[[[0. 0. 1. 1. ]
[0.1 0.1 0.9 0.9]]], shape=(1, 2, 4), dtype=float32)
tf.Tensor([[0.9 0.8]], shape=(1, 2), dtype=float32)
tf.Tensor([[0 0]], shape=(1, 2), dtype=int32)
tf.Tensor([2], shape=(1,), dtype=int32)
Пример
Давайте отфильтруем рамки с низкой уверенностью,
установив порог score_threshold:
import tensorflow as tf
boxes = tf.constant([[
[0.0, 0.0, 1.0, 1.0],
[0.1, 0.1, 0.9, 0.9]
]])
scores = tf.constant([[
[0.9, 0.1],
[0.3, 0.2]
]])
res = tf.image.combined_non_max_suppression(
boxes,
scores,
max_output_size_per_class=2,
max_total_size=2,
score_threshold=0.5
)
print(res[0])
print(res[1])
print(res[3])
Результат выполнения кода:
tf.Tensor(
[[[0. 0. 1. 1.]
[0. 0. 0. 0.]]], shape=(1, 2, 4), dtype=float32)
tf.Tensor([[0.9 0. ]], shape=(1, 2), dtype=float32)
tf.Tensor([1], shape=(1,), dtype=int32)
Пример
Давайте обработаем пакет из двух изображений с двумя классами и выведем количество валидных детекций:
import tensorflow as tf
boxes = tf.constant([
[
[0.0, 0.0, 1.0, 1.0],
[0.1, 0.1, 0.9, 0.9]
],
[
[0.2, 0.2, 0.8, 0.8],
[0.0, 0.0, 0.5, 0.5]
]
])
scores = tf.constant([
[
[0.9, 0.1],
[0.8, 0.2]
],
[
[0.7, 0.6],
[0.4, 0.3]
]
])
res = tf.image.combined_non_max_suppression(
boxes,
scores,
max_output_size_per_class=2,
max_total_size=2
)
print(res[3])
Результат выполнения кода:
tf.Tensor([2 2], shape=(2,), dtype=int32)
Смотрите также
-
функцию
non_max_suppression,
которая выполняет подавление для одного класса -
функцию
draw_bounding_boxes,
которая рисует рамки на изображении -
функцию
crop_to_bounding_box,
которая обрезает изображение по рамке -
функцию
pad_to_bounding_box,
которая дополняет изображение до рамки