Help us understand the problem. What is going on with this article?

【プラモデル】AIの力で主砲発射!

今回は個人の趣味で書いています。
製造業では一切役立たない技術ですので、ご注意ください。

01.png

※本稿は【Zoom】Pythonデータ分析勉強会#13 その1の発表資料です。

男の子の憧れ

プラモデルって楽しいですよね。私も小学校の頃はよく作っていました。

そして、プラモデルを作る男の子はよく憧れます、それは...
「プラモデルの主砲からドンッ!と発射させたい」

ガンプラでいえば、ビームライフルやメガ粒子砲。
戦車でいえば、主砲。これらを発射させたいと思うわけです。

もちろん、BB弾などではなく、ビームや火球が出るようなエフェクトを
再現したいと熱烈に思います。

そこで、AIの力を借りてこれを実現してみました。

何をしたのか?

CycleGANを使って、プラモデルの写真から主砲を発射させました。

02.png

(元画像はこちら

プラモデルの写真を撮り、CycleGANで処理することにより、
主砲が発射されたような画像が生成されます。

CycleGAN

今回使ったCycleGANは、2年前に発表された少し古い手法ですが、集める画像の
構図に制約がないために非常に使いやすい手法です。

CycleGANの威力は、以下の動画を見れば一目瞭然だと思います。

(twitterより転載)

この動画では、使った手法は明記されておりませんが、CycleGANもしくは
その進化系の手法だと思われます。

CycleGANは、端的にいうと、パターンAとパターンBの画像を適当に集めて
学習させれば、A-B間を変換するジェネレーターが勝手に構築されます。

上記の動画でいうと、パターンAは「人の腕」、パターンBは「サイボーグの腕」
の画像を集めて学習されば「人の腕」→「サイボーグの腕」への変換ジェネレーターが
構築されます。詳しくは以下の記事を参考にしてください。
https://qiita.com/itok_msi/items/b6b615bc28b1a720afd7

データ

今回のチャレンジでいうと、パターンAは「プラモデルの写真」、パターンBは
「実弾を打つ戦車の写真」です。これらをCycleGANで学習させれば

「プラモデルの写真」→「実弾を打つプラモデルの写真」

への変換が可能になります。

こちらの記事によると、写真の構図は「拡大や縮小が混じったもの」や
「関係ないもの」が映ったものが良いらしいので、それらを意識して
以下の枚数を集めました。

枚数
プラモデルの写真 153
実弾を打つ戦車の写真 114

CycleGAN on TensorFlow

CycleGANは、著者からコードが公開されていますが、Colabで動かすことを
念頭に置き、今回はTensorFlowのチュートリアルのコードをいじって
学習させました。
https://www.tensorflow.org/beta/tutorials/generative/cyclegan

いじる部分は

def preprocess_image_train(image, label):
  image = random_jitter(image)
  image = normalize(image)
  return image

def preprocess_image_test(image, label):
  image = normalize(image)
  return image

train_horses = train_horses.map(
    preprocess_image_train, num_parallel_calls=AUTOTUNE).cache().shuffle(
    BUFFER_SIZE).batch(1)

train_zebras = train_zebras.map(
    preprocess_image_train, num_parallel_calls=AUTOTUNE).cache().shuffle(
    BUFFER_SIZE).batch(1)

test_horses = test_horses.map(
    preprocess_image_test, num_parallel_calls=AUTOTUNE).cache().shuffle(
    BUFFER_SIZE).batch(1)

test_zebras = test_zebras.map(
    preprocess_image_test, num_parallel_calls=AUTOTUNE).cache().shuffle(
    BUFFER_SIZE).batch(1)

の部分を以下のように変更しました。

from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive//My Drive/CycleGAN

import glob
import numpy as np

# プラモ
koma_dir = "puramo/*.jpg"
koma_labels = np.ones(153)
koma_filenames = glob.glob(koma_dir) # filenameのリスト取得 (CSVとかから読んでも良い)
train_horses = tf.data.Dataset.from_tensor_slices((koma_filenames, koma_labels))

# 実弾発射
gold_dir = "heat/*.jpg"
gold_labels = np.zeros(114)
gold_filenames = glob.glob(gold_dir) # filenameのリスト取得 (CSVとかから読んでも良い)
train_zebras = tf.data.Dataset.from_tensor_slices((gold_filenames, gold_labels))

# test
test_dir = "test/*.jpg"
test_labels = np.zeros(11)
test_filenames = glob.glob(test_dir) # filenameのリスト取得 (CSVとかから読んでも良い)
test_horses = tf.data.Dataset.from_tensor_slices((test_filenames, test_labels))

test_zebras = train_zebras

def preprocess_image_train(image, label):
  image = tf.image.decode_jpeg(tf.io.read_file(image))
  image = random_jitter(image)
  image = normalize(image)
  return image

def preprocess_image_test(image, label):
  image = tf.image.decode_jpeg(tf.io.read_file(image))
  image = test_jitter(image)
  image = normalize(image)
  return image

Googleドライブにマウントした後に、プラモデルの写真153枚と実弾を打つ
写真114枚、テスト画像11枚を読み込んでいます。

TensorFlowのデータ読み込みは以下の記事を参考にしました。
https://qiita.com/S-aiueo32/items/c7e86ef6c339dfb013ba

結果

著作権の関係で、元画像を掲載するのは避けますが、基本的に背景は
無地なものです。

01.png
02.png
03.png
03_.png
05.png
001.png

ちなみにEpochは70。Colabで約2時間あれば学習完了です。

冒頭でご紹介したPythonデータ分析勉強会では、元画像をお見する
予定です。

おまけ

ちなみに、TensorFlowのチュートリアルをColabで200エポック(46時間)回すと
以下のような画像が生成されます。
image.png
image.png
image.png
image.png
image.png

凄いですね!
Colabに余裕がある人はやってみては、いかがでしょうか。

このチュートリアル、Googleドライブにマウントすることで、ちゃんとcheckpointと
モデルを保存してくれます。そのため、Colabの12時間ルールを超えて学習させることが
可能です。

まとめ

  • CycleGANはデータ集めが非常に
  • TensorFlowのチュートリアルを使えば、誰でも気軽に使える。
  • スポーツの中継とかでも使える技術だと思う。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away