Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ja/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. # ==============================================================================

3D 畳み込みを使用した動画のインビトウィーニング

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

https://arxiv.org/abs/1905.10240

現在の Hub の特徴:

  • BAIR ロボットによる動画のプッシュと KTH アクション動画データセットのモデルがあります(この Colab では BAIR のみを使用)。

  • BAIR データセットはすでに Hub に提供されていますが、KTH 動画はユーザーが提供する必要があります。

  • 現在のところ、評価のみ(動画生成)です。

  • バッチサイズとフレームサイズはハードコードされています。

セットアップ

tfds.load('bair_robot_pushing_small', split='test') は、トレーニングデータも含む 30GB のアーカイブをダウンロードするため、190MB のテストデータのみを含む別のアーカイブをダウンロードします。使用されたデータセットはこの論文で公開されており、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: Numpy 配列の入力に基づく実演

# @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')

Hub モジュールの読み込み

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

動画の生成と表示

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')