python读取视频帧_python – TensorFlow – 从TFRecords文件中读取视频帧

TLDR;我的问题是如何从TFRecords加载压缩视频帧.

我正在建立一个数据管道,用于在大型视频数据集上训练深度学习模型(Kinetics).为此我使用TensorFlow,更具体地说是tf.data.Dataset和TFRecordDataset结构.由于数据集包含大约30万个10秒的视频,因此需要处理大量数据.在训练期间,我想从视频中随机采样64个连续帧,因此快速随机采样非常重要.为实现这一目标,培训期间可能存在许多数据加载方案:

>视频样本.使用ffmpeg或OpenCV和示例帧加载视频.在视频中寻找是不太理想的,并且解码视频流比解码JPG要慢得多.

> JPG图片.通过将所有视频帧提取为JPG来预处理数据集.这会生成大量文件,由于随机访问可能不会很快.

>数据容器.将数据集预处理为TFRecords或HDF5文件.需要更多工作才能准备好管道,但最有可能是这些选项中最快的.

我决定使用选项(3)并使用TFRecord文件来存储数据集的预处理版本.但是,这也不像看起来那么简单,例如:

>压缩.将视频帧存储为TFRecords中的未压缩字节数据将需要大量磁盘空间.因此,我提取所有视频帧,应用JPG压缩并将压缩字节存储为TFRecords.

>视频数据.我们正在处理视频,因此TFRecords文件中的每个示例都会非常大并且包含几个视频帧(对于10秒的视频,通常为250-300,具体取决于帧速率).

我编写了以下代码来预处理视频数据集,并将视频帧写为TFRecord文件(每个大小约为5GB):

def _int64_feature(value):

"""Wrapper for inserting int64 features into Example proto."""

if not isinstance(value, list):

value = [value]

return tf.train.Feature(int64_list=tf.train.Int64List(value=value))

def _bytes_feature(value):

"""Wrapper for inserting bytes features into Example proto."""

return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

with tf.python_io.TFRecordWriter(output_file) as writer:

# Read and resize all video frames, np.uint8 of size [N,H,W,3]

frames = ...

features = {}

features['num_frames'] = _int64_feature(frames.shape[0])

features['height'] = _int64_feature(frames.shape[1])

features['width'] = _int64_feature(frames.shape[2])

features['channels'] = _int64_feature(frames.shape[3])

features['class_label'] = _int64_feature(example['class_id'])

features['class_text'] = _bytes_feature(tf.compat.as_bytes(example['class_label']))

features['filename'] = _bytes_feature(tf.compat.as_bytes(example['video_id']))

# Compress the frames using JPG and store in as bytes in:

# 'frames/000001', 'frames/000002', ...

for i in range(len(frames)):

ret, buffer = cv2.imencode(".jpg", frames[i])

features["frames/{:04d}".format(i)] = _bytes_feature(tf.compat.as_bytes(buffer.tobytes()))

tfrecord_example = tf.train.Example(features=tf.train.Features(feature=features))

writer.write(tfrecord_example.SerializeToString())

这很好用;数据集很好地写为TFRecord文件,帧为压缩JPG字节.我的问题是,如何在训练期间读取TFRecord文件,从视频中随机采样64帧并解码JPG图像.

filenames = tf.placeholder(tf.string, shape=[None])

dataset = tf.data.TFRecordDataset(filenames)

dataset = dataset.map(...) # Parse the record into tensors.

dataset = dataset.repeat() # Repeat the input indefinitely.

dataset = dataset.batch(32)

iterator = dataset.make_initializable_iterator()

training_filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]

sess.run(iterator.initializer, feed_dict={filenames: training_filenames})

关于如何使用图像执行此操作有很多示例,这非常简单.但是,对于帧的视频和随机采样,我被卡住了. tf.train.Features对象将帧存储为帧/ 00001,帧/ 000002等.我的第一个问题是如何在dataset.map()函数内随机采样一组连续帧?考虑因为JPG压缩每个帧具有可变数量的字节,并且需要使用tf.image.decode_jpeg进行解码.

任何帮助如何最好地设置从TFRecord文件读取视频采样将不胜感激!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值