انتقال سبک هنری با TensorFlow Lite

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت مدل TF Hub را ببینید

یکی از مهمترین و تحولات هیجان انگیز در یادگیری عمیق به بیرون آمدن به تازگی است انتقال هنری سبک ، و یا توانایی برای ایجاد یک تصویر جدید، شناخته شده به عنوان یک اقتباس یکی به نمایندگی از سبک هنری و یکی به نمایندگی از مطالب و محتوا: بر اساس دو تصاویر ورودی.

نمونه انتقال سبک

با استفاده از این تکنیک، می‌توانیم آثار هنری جدید و زیبا در طیف وسیعی از سبک‌ها تولید کنیم.

نمونه انتقال سبک

اگر با TensorFlow Lite تازه کار هستید و با Android کار می کنید، توصیه می کنیم نمونه برنامه های زیر را بررسی کنید که می توانند به شما در شروع کار کمک کنند.

به عنوان مثال آندروید در iOS مثال

اگر شما با استفاده از یک پلت فرم های دیگر از آندروید یا IOS، و یا شما در حال حاضر با آشنا بازگشت به محتوا | API های TensorFlow ، شما می توانید این آموزش را دنبال کنید تا یاد بگیرند که چگونه به درخواست انتقال سبک بر روی هر جفت از محتوا و سبک تصویر با TensorFlow به مطلب، پیش آموزش دیده مدل. می توانید از این مدل برای اضافه کردن سبک به برنامه های تلفن همراه خود استفاده کنید.

مدل منبع باز است گیتهاب . می توانید مدل را با پارامترهای مختلف دوباره آموزش دهید (مثلاً وزن لایه های محتوا را افزایش دهید تا تصویر خروجی بیشتر شبیه تصویر محتوا باشد).

معماری مدل را درک کنید

معماری مدل

این مدل Artistic Style Transfer از دو مدل فرعی تشکیل شده است:

  1. سبک Prediciton مدل: A MobilenetV2 مبتنی بر شبکه های عصبی که طول می کشد یک تصویر سبک ورودی به 100 بعدی بردار سبک تنگنا.
  2. سبک تبدیل مدل: یک شبکه عصبی که طول می کشد اعمال یک بردار سبک تنگنا به یک تصویر محتوا و ایجاد یک تصویر تلطیف.

اگر برنامه شما فقط نیاز به پشتیبانی از مجموعه ثابتی از تصاویر سبک دارد، می توانید بردارهای تنگنای سبک آنها را از قبل محاسبه کنید و مدل پیش بینی سبک را از باینری برنامه خود حذف کنید.

برپایی

وابستگی های وارداتی

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

مطالب و تصاویر سبک و مدل های از پیش آموزش دیده TensorFlow Lite را دانلود کنید.

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 با مقادیر پیکسلی float32 بین [0..1] باشد.
  • اندازه تصویر سبک باید (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

معیارهای عملکرد

تعداد معیار عملکرد با ابزار تولید در اینجا شرح داده .

نام مدل سایز مدل دستگاه NNAPI CPU پردازنده گرافیکی
مدل پیش‌بینی سبک (int8) 2.8 مگابایت پیکسل 3 (اندروید 10) 142 میلی‌ثانیه 14 میلی‌ثانیه
پیکسل 4 (اندروید 10) 5.2 میلی‌ثانیه 6.7 میلی‌ثانیه
iPhone XS (iOS 12.4.1) 10.7 میلی‌ثانیه
مدل تبدیل سبک (int8) 0.2 مگابایت پیکسل 3 (اندروید 10) 540 میلی‌ثانیه
پیکسل 4 (اندروید 10) 405 میلی‌ثانیه
iPhone XS (iOS 12.4.1) 251 میلی‌ثانیه
مدل پیش‌بینی سبک (float16) 4.7 مگابایت پیکسل 3 (اندروید 10) 86 میلی‌ثانیه 28 میلی‌ثانیه 9.1 میلی‌ثانیه
پیکسل 4 (اندروید 10) 32 میلی‌ثانیه 12 میلی‌ثانیه 10 میلی‌ثانیه
مدل انتقال سبک (float16) 0.4 مگابایت پیکسل 3 (اندروید 10) 1095 میلی‌ثانیه 545 میلی‌ثانیه 42 میلی‌ثانیه
پیکسل 4 (اندروید 10) 603 میلی‌ثانیه 377 میلی‌ثانیه 42 میلی‌ثانیه

* 4 نخ استفاده شده است.
** 2 رشته در آیفون برای بهترین عملکرد.