Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/en-snapshot/hub/tutorials/tweening_conv3d.ipynb
25118 views
Kernel: Python 3

Licensed under the Apache License, Version 2.0 (the "License");

# Copyright 2019 The TensorFlow Hub Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ==============================================================================

Video Inbetweening using 3D Convolutions

Yunpeng Li, Dominik Roblek, and Marco Tagliasacchi. From Here to There: Video Inbetweening Using Direct 3D Convolutions, 2019.

https://arxiv.org/abs/1905.10240

Current Hub characteristics:

  • has models for BAIR Robot pushing videos and KTH action video dataset (though this colab uses only BAIR)

  • BAIR dataset already available in Hub. However, KTH videos need to be supplied by the users themselves.

  • only evaluation (video generation) for now

  • batch size and frame size are hard-coded

Setup

Since tfds.load('bair_robot_pushing_small', split='test') would download a 30GB archive that also contains the training data, we download a separated archive that only contains the 190MB test data. The used dataset has been published by this paper and is licensed as Creative Commons BY 4.0.

import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import seaborn as sns import tensorflow_hub as hub import tensorflow_datasets as tfds from tensorflow_datasets.core import SplitGenerator from tensorflow_datasets.video.bair_robot_pushing import BairRobotPushingSmall import tempfile import pathlib TEST_DIR = pathlib.Path(tempfile.mkdtemp()) / "bair_robot_pushing_small/softmotion30_44k/test/"
# Download the test split to $TEST_DIR !mkdir -p $TEST_DIR !wget -nv https://storage.googleapis.com/download.tensorflow.org/data/bair_test_traj_0_to_255.tfrecords -O $TEST_DIR/traj_0_to_255.tfrecords
# Since the dataset builder expects the train and test split to be downloaded, # patch it so it only expects the test data to be available builder = BairRobotPushingSmall() test_generator = SplitGenerator(name='test', gen_kwargs={"filedir": str(TEST_DIR)}) builder._split_generators = lambda _: [test_generator] builder.download_and_prepare()

BAIR: Demo based on numpy array inputs

# @title Load some example data (BAIR). batch_size = 16 # If unable to download the dataset automatically due to "not enough disk space", please download manually to Google Drive and # load using tf.data.TFRecordDataset. ds = builder.as_dataset(split="test") test_videos = ds.batch(batch_size) first_batch = next(iter(test_videos)) input_frames = first_batch['image_aux1'][:, ::15] input_frames = tf.cast(input_frames, tf.float32)
# @title Visualize loaded videos start and end frames. print('Test videos shape [batch_size, start/end frame, height, width, num_channels]: ', input_frames.shape) sns.set_style('white') plt.figure(figsize=(4, 2*batch_size)) for i in range(batch_size)[:4]: plt.subplot(batch_size, 2, 1 + 2*i) plt.imshow(input_frames[i, 0] / 255.0) plt.title('Video {}: First frame'.format(i)) plt.axis('off') plt.subplot(batch_size, 2, 2 + 2*i) plt.imshow(input_frames[i, 1] / 255.0) plt.title('Video {}: Last frame'.format(i)) plt.axis('off')

Load Hub Module

hub_handle = 'https://tfhub.dev/google/tweening_conv3d_bair/1' module = hub.load(hub_handle).signatures['default']

Generate and show the videos

filled_frames = module(input_frames)['default'] / 255.0
# Show sequences of generated video frames. # Concatenate start/end frames and the generated filled frames for the new videos. generated_videos = np.concatenate([input_frames[:, :1] / 255.0, filled_frames, input_frames[:, 1:] / 255.0], axis=1) for video_id in range(4): fig = plt.figure(figsize=(10 * 2, 2)) for frame_id in range(1, 16): ax = fig.add_axes([frame_id * 1 / 16., 0, (frame_id + 1) * 1 / 16., 1], xmargin=0, ymargin=0) ax.imshow(generated_videos[video_id, frame_id]) ax.axis('off')