TensorFlow লাইট সঙ্গে শৈল্পিক শৈলী স্থানান্তর

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন TF হাব মডেল দেখুন

সম্প্রতি বাইরে আসতে গভীর লার্নিং সবচেয়ে উত্তেজনাপূর্ণ উন্নয়নের এক শৈল্পিক শৈলী হস্তান্তর , অথবা একটি নতুন চিত্র, একটি হিসাবে পরিচিত তৈরি করার ক্ষমতা অন্য গ্রন্থকার বা শিল্পীর অনুকরণে রচিত সাহিত্য বা শিল্প এক শৈল্পিক শৈলী প্রতিনিধিত্বমূলক এবং এক বিষয়বস্তু প্রতিনিধিত্বমূলক: দুটি ইনপুট ইমেজ উপর ভিত্তি করে।

শৈলী স্থানান্তর উদাহরণ

এই কৌশলটি ব্যবহার করে, আমরা বিভিন্ন শৈলীতে সুন্দর নতুন শিল্পকর্ম তৈরি করতে পারি।

শৈলী স্থানান্তর উদাহরণ

আপনি যদি TensorFlow Lite-এ নতুন হয়ে থাকেন এবং Android এর সাথে কাজ করেন, তাহলে আমরা আপনাকে শুরু করতে সাহায্য করতে পারে এমন নিম্নলিখিত উদাহরণের অ্যাপ্লিকেশনগুলি অন্বেষণ করার পরামর্শ দিই৷

অ্যান্ড্রয়েড উদাহরণ আইওএস উদাহরণ

আপনি Android বা iOS চেয়ে একটি প্ল্যাটফর্ম অন্যান্য ব্যবহার করছেন, অথবা আপনি ইতিমধ্যে এর সাথে পরিচিত থাকেন TensorFlow লাইট API গুলি , আপনি কীভাবে একটি প্রাক প্রশিক্ষিত TensorFlow লাইট সন্তুষ্ট এবং শৈলী ইমেজ কোনো জুড়ি উপর শৈলী হস্তান্তর আবেদন করতে এই টিউটোরিয়াল অনুসরণ করতে পারেন মডেল. আপনি আপনার নিজের মোবাইল অ্যাপ্লিকেশনে শৈলী স্থানান্তর যোগ করতে মডেলটি ব্যবহার করতে পারেন।

মডেল ওপেন sourced হয় GitHub । আপনি বিভিন্ন পরামিতি সহ মডেলকে পুনরায় প্রশিক্ষণ দিতে পারেন (যেমন আউটপুট চিত্রটিকে বিষয়বস্তুর চিত্রের মতো দেখতে সামগ্রী স্তরের ওজন বাড়ান)।

মডেল আর্কিটেকচার বুঝুন

মডেল আর্কিটেকচার

এই শৈল্পিক শৈলী স্থানান্তর মডেল দুটি সাবমডেল নিয়ে গঠিত:

  1. স্টাইল Prediciton মডেল: একটি MobilenetV2 ভিত্তিক নিউরাল নেটওয়ার্ক 100 মাত্রা শৈলী বোতলের ভেক্টর একটি ইনপুট ধরন ইমেজ লাগে।
  2. স্টাইল ট্রান্সফর্ম মডেল: একটি স্নায়ুর নেটওয়ার্ক একটি কন্টেন্ট চিত্রে একটি শৈলী বোতলের ভেক্টর প্রয়োগ নেয় এবং একটি stylized ইমেজ তৈরি করে।

যদি আপনার অ্যাপটিকে শুধুমাত্র একটি নির্দিষ্ট সেটের শৈলীর ছবি সমর্থন করতে হয়, তাহলে আপনি তাদের স্টাইল বটলনেক ভেক্টর আগে থেকেই গণনা করতে পারেন এবং আপনার অ্যাপের বাইনারি থেকে স্টাইল প্রেডিকশন মডেলটি বাদ দিতে পারেন।

সেটআপ

আমদানি নির্ভরতা।

import tensorflow as tf
print(tf.__version__)
2.6.0
import IPython.display as display

import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = (12,12)
mpl.rcParams['axes.grid'] = False

import numpy as np
import time
import functools

বিষয়বস্তু এবং শৈলীর ছবি এবং পূর্ব-প্রশিক্ষিত টেনসরফ্লো লাইট মডেল ডাউনলোড করুন।

content_path = tf.keras.utils.get_file('belfry.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/belfry-2611573_1280.jpg')
style_path = tf.keras.utils.get_file('style23.jpg','https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/style23.jpg')

style_predict_path = tf.keras.utils.get_file('style_predict.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/prediction/1?lite-format=tflite')
style_transform_path = tf.keras.utils.get_file('style_transform.tflite', 'https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/transfer/1?lite-format=tflite')
Downloading data from https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/belfry-2611573_1280.jpg
458752/458481 [==============================] - 0s 0us/step
466944/458481 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/khanhlvg-public.appspot.com/arbitrary-style-transfer/style23.jpg
114688/108525 [===============================] - 0s 0us/step
122880/108525 [=================================] - 0s 0us/step
Downloading data from https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/prediction/1?lite-format=tflite
2834432/2828838 [==============================] - 0s 0us/step
2842624/2828838 [==============================] - 0s 0us/step
Downloading data from https://tfhub.dev/google/lite-model/magenta/arbitrary-image-stylization-v1-256/int8/transfer/1?lite-format=tflite
286720/284398 [==============================] - 0s 0us/step
294912/284398 [===============================] - 0s 0us/step

ইনপুটগুলি প্রাক-প্রক্রিয়া করুন

  • কন্টেন্ট ইমেজ এবং শৈলী ইমেজ অবশ্যই RGB ইমেজ হতে হবে যার পিক্সেল মান [0..1] এর মধ্যে ফ্লোট 32 সংখ্যা।
  • শৈলী চিত্রের আকার অবশ্যই হতে হবে (1, 256, 256, 3)। আমরা ছবিটি কেন্দ্রীয়ভাবে ক্রপ করি এবং এর আকার পরিবর্তন করি।
  • বিষয়বস্তুর চিত্র অবশ্যই হতে হবে (1, 384, 384, 3)। আমরা ছবিটি কেন্দ্রীয়ভাবে ক্রপ করি এবং এর আকার পরিবর্তন করি।
# Function to load an image from a file, and add a batch dimension.
def load_img(path_to_img):
  img = tf.io.read_file(path_to_img)
  img = tf.io.decode_image(img, channels=3)
  img = tf.image.convert_image_dtype(img, tf.float32)
  img = img[tf.newaxis, :]

  return img

# Function to pre-process by resizing an central cropping it.
def preprocess_image(image, target_dim):
  # Resize the image so that the shorter dimension becomes 256px.
  shape = tf.cast(tf.shape(image)[1:-1], tf.float32)
  short_dim = min(shape)
  scale = target_dim / short_dim
  new_shape = tf.cast(shape * scale, tf.int32)
  image = tf.image.resize(image, new_shape)

  # Central crop the image.
  image = tf.image.resize_with_crop_or_pad(image, target_dim, target_dim)

  return image

# Load the input images.
content_image = load_img(content_path)
style_image = load_img(style_path)

# Preprocess the input images.
preprocessed_content_image = preprocess_image(content_image, 384)
preprocessed_style_image = preprocess_image(style_image, 256)

print('Style Image Shape:', preprocessed_style_image.shape)
print('Content Image Shape:', preprocessed_content_image.shape)
Style Image Shape: (1, 256, 256, 3)
Content Image Shape: (1, 384, 384, 3)

ইনপুটগুলি কল্পনা করুন

def imshow(image, title=None):
  if len(image.shape) > 3:
    image = tf.squeeze(image, axis=0)

  plt.imshow(image)
  if title:
    plt.title(title)

plt.subplot(1, 2, 1)
imshow(preprocessed_content_image, 'Content Image')

plt.subplot(1, 2, 2)
imshow(preprocessed_style_image, 'Style Image')

png

TensorFlow Lite দিয়ে স্টাইল ট্রান্সফার চালান

শৈলী ভবিষ্যদ্বাণী

# Function to run style prediction on preprocessed style image.
def run_style_predict(preprocessed_style_image):
  # Load the model.
  interpreter = tf.lite.Interpreter(model_path=style_predict_path)

  # Set model input.
  interpreter.allocate_tensors()
  input_details = interpreter.get_input_details()
  interpreter.set_tensor(input_details[0]["index"], preprocessed_style_image)

  # Calculate style bottleneck.
  interpreter.invoke()
  style_bottleneck = interpreter.tensor(
      interpreter.get_output_details()[0]["index"]
      )()

  return style_bottleneck

# Calculate style bottleneck for the preprocessed style image.
style_bottleneck = run_style_predict(preprocessed_style_image)
print('Style Bottleneck Shape:', style_bottleneck.shape)
Style Bottleneck Shape: (1, 1, 1, 100)

শৈলী রূপান্তর

# Run style transform on preprocessed style image
def run_style_transform(style_bottleneck, preprocessed_content_image):
  # Load the model.
  interpreter = tf.lite.Interpreter(model_path=style_transform_path)

  # Set model input.
  input_details = interpreter.get_input_details()
  interpreter.allocate_tensors()

  # Set model inputs.
  interpreter.set_tensor(input_details[0]["index"], preprocessed_content_image)
  interpreter.set_tensor(input_details[1]["index"], style_bottleneck)
  interpreter.invoke()

  # Transform content image.
  stylized_image = interpreter.tensor(
      interpreter.get_output_details()[0]["index"]
      )()

  return stylized_image

# Stylize the content image using the style bottleneck.
stylized_image = run_style_transform(style_bottleneck, preprocessed_content_image)

# Visualize the output.
imshow(stylized_image, 'Stylized Image')

png

শৈলী মিশ্রন

আমরা কন্টেন্ট ইমেজের স্টাইলকে স্টাইলাইজড আউটপুটে ব্লেন্ড করতে পারি, যার ফলে আউটপুটকে কন্টেন্ট ইমেজের মতো দেখায়।

# Calculate style bottleneck of the content image.
style_bottleneck_content = run_style_predict(
    preprocess_image(content_image, 256)
    )
# Define content blending ratio between [0..1].
# 0.0: 0% style extracts from content image.
# 1.0: 100% style extracted from content image.
content_blending_ratio = 0.5

# Blend the style bottleneck of style image and content image
style_bottleneck_blended = content_blending_ratio * style_bottleneck_content \
                           + (1 - content_blending_ratio) * style_bottleneck

# Stylize the content image using the style bottleneck.
stylized_image_blended = run_style_transform(style_bottleneck_blended,
                                             preprocessed_content_image)

# Visualize the output.
imshow(stylized_image_blended, 'Blended Stylized Image')

png

কর্মক্ষমতা মানদণ্ড

পারফরমেন্স বেঞ্চমার্ক সংখ্যার টুল দিয়ে তৈরি হয় এখানে বর্ণিত

ণশড মডেলের আকার যন্ত্র এনএনএপিআই সিপিইউ জিপিইউ
শৈলী পূর্বাভাস মডেল (int8) 2.8 Mb Pixel 3 (Android 10) 142ms 14ms
Pixel 4 (Android 10) 5.2 মি 6.7ms
iPhone XS (iOS 12.4.1) 10.7 মি
শৈলী রূপান্তর মডেল (int8) 0.2 Mb Pixel 3 (Android 10) 540ms
Pixel 4 (Android 10) 405ms
iPhone XS (iOS 12.4.1) 251ms
শৈলী পূর্বাভাস মডেল (float16) 4.7 Mb Pixel 3 (Android 10) 86ms 28ms 9.1ms
Pixel 4 (Android 10) 32ms 12ms 10ms
শৈলী স্থানান্তর মডেল (float16) 0.4 Mb Pixel 3 (Android 10) 1095ms 545ms 42ms
Pixel 4 (Android 10) 603ms 377ms 42ms

* 4টি থ্রেড ব্যবহার করা হয়েছে।
** সেরা পারফরম্যান্সের জন্য আইফোনে 2টি থ্রেড।