Как преобразовать Tensor в массив numpy внутри функции карты, используя функцию tf.py_function - PullRequest
3 голосов
/ 24 февраля 2020

Я пытаюсь создать конвейер увеличения изображений для сети обнаружения объектов, где мои обучающие примеры дополняются, когда они go попадают в сеть. Изображения и ограничивающие прямоугольники должны быть дополнены, но стандартные методы tf.image не работают с данными ограничивающего прямоугольника.

Все простые библиотеки дополнения, которые работают с ограничивающими прямоугольниками, нуждаются в массивах numpy, но я не знаю, как конвертировать мои Tensors в numpy массивы внутри моей функции .map (). Даже когда я обертываю свою функцию дополнения в вызов tf.py_function, я все равно получаю ошибку AttributeError: 'Tensor' object has no attribute 'numpy', когда пытаюсь преобразовать свое изображение с помощью image = image.numpy().

, мой набор данных загружается через это:

def load_tfrecord_dataset(file_pattern, class_file, size=416):
    LINE_NUMBER = -1
    class_table = tf.lookup.StaticHashTable(tf.lookup.TextFileInitializer(
        class_file, tf.string, 0, tf.int64, LINE_NUMBER, delimiter="\n"), -1)

    files = tf.data.Dataset.list_files(file_pattern)
    dataset = files.flat_map(tf.data.TFRecordDataset)
    return dataset.map(lambda x: tf.py_function(parse_tfrecord(x, class_table, size), [x], tf.float32))
    # return dataset.map(lambda x: parse_tfrecord(x, class_table, size))

это вызывает мою функцию синтаксического анализа:

def parse_tfrecord(tfrecord, class_table, size):
    x = tf.io.parse_single_example(tfrecord, IMAGE_FEATURE_MAP)
    x_train = tf.image.decode_jpeg(x['image/encoded'], channels=3)
    x_train = tf.image.resize(x_train, (size, size))

    class_text = tf.sparse.to_dense(
        x['image/object/class/text'], default_value='')
    labels = tf.cast(class_table.lookup(class_text), tf.float32)

    y_train = tf.stack([tf.sparse.to_dense(x['image/object/bbox/xmin']),
                        tf.sparse.to_dense(x['image/object/bbox/ymin']),
                        tf.sparse.to_dense(x['image/object/bbox/xmax']),
                        tf.sparse.to_dense(x['image/object/bbox/ymax']),
                        labels], axis=1)

    x_train, y_train = tf.py_function(augment_images(x_train, y_train), [], tf.uint8)

    paddings = [[0, FLAGS.yolo_max_boxes - tf.shape(y_train)[0]], [0, 0]]
    y_train = tf.pad(y_train, paddings)

    return x_train, y_train

, которая вызывает мою функцию дополнения:

def augment_images(image, boxes):

    image = image.numpy()

    seq = iaa.Sequential([
        iaa.Fliplr(0.5),
        iaa.Flipud(0.5)
    ])

    image, label = seq(image=image, bounding_boxes=boxes)

    return image, label

Но независимо от того, какие части кода я обертываю в tf.py_function или где я пытаюсь преобразовать в массив numpy, я всегда получаю ту же ошибку.

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...