Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ko/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만 사용).

  • Hub에서 이미 BAIR 데이터세트를 사용할 수 있습니다. 그러나 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')