TFRecords для видео - PullRequest
       27

TFRecords для видео

1 голос
/ 04 апреля 2019

Я пытаюсь создать TFRecords из пользовательского набора видеоданных, и у меня возникают проблемы с полным пониманием того, как их настроить.

Чтобы подготовить свои данные к хранению, я написал сценарий, который для данного видеопотока выводит трехмерный куб формы [N_FRAMES, WIDTH, HEIGHT, CHANNEL]. После этого я создаю tfrecord следующим образом:

def _int64_feature(self, value):
  return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

def _bytes_feature(self, value):
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

def createDataRecord(self, file_name, locations, categories):
    writer = tf.python_io.TFRecordWriter(file_name)

    feature = {}

    for loc, category in zip(locations, categories):
        data = self.3DVideo(loc) # the final array of shape [N_FRAMES, WIDTH, HEIGHT, CHANNEL]

        feature['height'] = self._int64_feature(self.height)
        feature['width'] = self._int64_feature(self.width)
        feature['depth'] = self._int64_feature(self.depth)
        feature['data'] = self._bytes_feature(data.tostring())
        feature['category'] = self._int64_feature(category)

        example = tf.train.Example(features=tf.train.Features(feature=feature))
        writer.write(example.SerializeToString())

    writer.close()

Тогда моя текущая функция синтаксического анализатора выглядит следующим образом

def readDataRecord(self, record):
  filename_queue = tf.train.string_input_producer([record], num_epochs=1)

  reader = tf.TFRecordReader()
  _, serialized_example = reader.read(filename_queue)

  feature =
  {'height': tf.FixedLenFeature([], tf.int64),
    'width': tf.FixedLenFeature([], tf.int64),
    'depth': tf.FixedLenFeature([], tf.int64),
    'data': tf.FixedLenFeature([], tf.string),
    'category': tf.FixedLenFeature([], tf.int64),
  }

  example = tf.parse_single_example(serialized_example, features=feature)

  video3D_buffer = tf.reshape(example['data'], shape=[])
  video3D = tf.decode_raw(video3D_buffer, tf.uint8)

  label = tf.cast(example['category'], tf.int32)

  return video3D, label

С учетом сказанного, мои вопросы:

  1. Я знаю, что readDataRecord() не так, поскольку он работает с отдельными кадрами. Как именно заставить его вернуть отдельные трехмерные кубы формы [N_FRAMES, WIDTH, HEIGHT, CHANNEL] вместе с их соответствующей категорией?

  2. Это даже хорошая идея, чтобы просто сохранить весь 3D-куб?

Любая помощь или руководство будет принята с благодарностью:)

PS: Я рассмотрел другие методы, включая video2tfrecord , но большинство из них, похоже, сохраняют отдельные кадры для каждого видео, и я этого не хочу.

1 Ответ

0 голосов
/ 04 апреля 2019

Так вот, что я в итоге сделал, чтобы добиться этого без необходимости кодировать отдельные кадры.

В итоге я сгладил куб, а затем выписал его, как показано ниже:

def _cube_feature(self, value):
    return tf.train.Feature(float_list=tf.train.FloatList(value=value))

def createDataRecord(self, name, locations, categories):

    writer = tf.python_io.TFRecordWriter(name)

    feature = {}

    for loc, category in zip(locations, categories):
        data = self.3DVideo(loc)
        .............
        feature['data'] = self._cube_feature(data.flatten())
        feature['category'] = self._int64_feature(category)

        example = tf.train.Example(features=tf.train.Features(feature=feature))
        writer.write(example.SerializeToString())

    writer.close()

Получается парсер:

def readDataRecord(self, record):
    ..........
    feature = \
    {'height': tf.FixedLenFeature([], tf.int64),
     'width': tf.FixedLenFeature([], tf.int64),
     'depth': tf.FixedLenFeature([], tf.int64),
     'data': tf.FixedLenFeature((NUM_FRAMES, WIDTH, HEIGHT, CHANNEL), tf.float32),
     'category': tf.FixedLenFeature([], tf.int64),
    }

    example = tf.parse_single_example(serialized_example, features=feature)

    cube = tf.cast(example['data'], tf.uint8)
    label = tf.cast(example['category'], tf.int32)

    return cube, label
...