tf.raw_ops.StatelessSampleDistortedBoundingBox
Детерминированно создаёт случайным образом искажённую ограничивающую рамку для изображения.
tf.raw_ops.StatelessSampleDistortedBoundingBox(
image_size,
bounding_boxes,
min_object_covered,
seed,
aspect_ratio_range=[0.75, 1.33],
area_range=[0.05, 1],
max_attempts=100,
use_image_if_no_bounding_boxes=False,
name=None
)
Аннотации ограничивающих рамок часто предоставляются вместе с эталонными метками в задачах распознавания изображений или локализации объектов. Распространённый метод обучения такой системы — случайное искажение изображения с сохранением его содержимого, то есть аугментация данных. Этот оператор при одинаковом seed детерминированно возвращает случайное расположение объекта, то есть ограничивающую рамку, с учётом image_size, bounding_boxes и набора ограничений.
Результатом этого оператора является одна ограничивающая рамка, которую можно использовать для кадрирования исходного изображения. Результат возвращается в виде 3 тензоров: begin, size и bboxes. Первые 2 тензора можно напрямую передать в tf.slice, чтобы кадрировать изображение. Последний можно передать в tf.image.draw_bounding_boxes, чтобы визуализировать ограничивающую рамку.
Ограничивающие рамки передаются и возвращаются как [y_min, x_min, y_max, x_max]. Координаты ограничивающей рамки представлены числами с плавающей запятой в [0.0, 1.0] относительно ширины и высоты исходного изображения.
Гарантируется, что результат этого оператора будет одинаковым при одинаковом seed и не будет зависеть от количества вызовов функции или настроек глобального начального значения (например, tf.random.set_seed).
Пример использования:
image = np.array([[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]])
bbox = tf.constant(
[0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4])
seed = (1, 2)
# Generate a single distorted bounding box.
bbox_begin, bbox_size, bbox_draw = (
tf.image.stateless_sample_distorted_bounding_box(
tf.shape(image), bounding_boxes=bbox, seed=seed))
# Employ the bounding box to distort the image.
tf.slice(image, bbox_begin, bbox_size)
<tf.Tensor: shape=(2, 2, 1), dtype=int64, numpy=
array([[[1],
[2]],
[[4],
[5]]])>
# Draw the bounding box in an image summary.
colors = np.array([[1.0, 0.0, 0.0], [0.0, 0.0, 1.0]])
tf.image.draw_bounding_boxes(
tf.expand_dims(tf.cast(image, tf.float32),0), bbox_draw, colors)
<tf.Tensor: shape=(1, 3, 3, 1), dtype=float32, numpy=
array([[[[1.],
[1.],
[3.]],
[[1.],
[1.],
[6.]],
[[7.],
[8.],
[9.]]]], dtype=float32)>Обратите внимание: если данные об ограничивающих рамках отсутствуют, при установке use_image_if_no_bounding_boxes = true будет считаться, что имеется одна неявная ограничивающая рамка, охватывающая всё изображение. Если use_image_if_no_bounding_boxes равно false и ограничивающие рамки не заданы, возникает ошибка.
| Аргументы | |
|---|---|
image_size | Tensor. Допустимые типы: uint8, int8, int16, int32, int64. Одномерный, содержит [height, width, channels]. |
bounding_boxes | Tensor типа float32. Трёхмерный тензор формы [batch, N, 4], описывающий N ограничивающих рамок, связанных с изображением. |
min_object_covered | Tensor типа float32. Обрезанная область изображения должна содержать не менее этой доли любой из заданных ограничивающих рамок. Значение этого параметра должно быть неотрицательным. Если значение равно 0, обрезанная область не обязана пересекаться ни с одной из заданных ограничивающих рамок. |
seed | Tensor. Допустимые типы: int32, int64. Одномерный тензор формы [2]. Начальное значение для генератора случайных чисел. Тип данных должен быть int32 или int64. (При использовании XLA допускается только int32.) |
aspect_ratio_range | Необязательный список floats. По умолчанию — [0.75, 1.33]. Коэффициент соотношения сторон обрезанной области изображения (ширина / высота) должен находиться в этом диапазоне. |
area_range | Необязательный список floats. По умолчанию — [0.05, 1]. Доля исходного изображения, содержащаяся в обрезанной области, должна находиться в этом диапазоне. |
max_attempts | Необязательный int. По умолчанию — 100. Количество попыток создать область изображения, удовлетворяющую указанным ограничениям. После max_attempts неудачных попыток возвращается всё изображение. |
use_image_if_no_bounding_boxes | Необязательный bool. По умолчанию — False. Определяет поведение, если ограничивающие рамки не заданы. Если значение равно true, предполагается наличие неявной ограничивающей рамки, охватывающей весь входной объект. Если значение равно false, возникает ошибка. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
Кортеж из объектов Tensor (begin, size, bboxes). | |
begin | Tensor. Имеет тот же тип, что и image_size. |
size | Tensor. Имеет тот же тип, что и image_size. |
bboxes | Tensor типа float32. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/raw_ops/StatelessSampleDistortedBoundingBox