浮世絵風の動画をつくってみる【CycleGAN】

AI実装

CycleGANはGANをつかったアルゴリズムの一種で、画像Aと画像Bを大量に学習させ、その特徴を学習していく Image to image translation モデルです。つまり、風景画像(画像A)と浮世絵画像(画像B)を大量に学習することで、風景画像を入力すると浮世絵っぽい画像を出力することができます。

前の記事で浮世絵風の画像を生成を実装しました。今回はAIの画像変換スピードを活用して動画を浮世絵風へ変換してみようと思います。

こんなのができます↓

CycleGANで浮世絵風の画像生成は↓に詳しく説明しています。よかったら併せてご覧ください。

浮世絵風の動画変換手順は↓の感じです。順に説明していきます。

  • 事前学習済みデータの準備
  • 動画ファイルの準備
  • 動画ファイルを複数の静止画にする
  • 画像を浮世絵風へ変換
  • 変換した画像を再度動画化

事前学習済みデータの準備

前の記事と同じ環境で進めていきます。↓のソースコードをダウンロードしてください。

GitHub - junyanz/pytorch-CycleGAN-and-pix2pix: Image-to-Image Translation in PyTorch
Image-to-Image Translation in PyTorch. Contribute to junyanz/pytorch-CycleGAN-and-pix2pix development by creating an account on GitHub.

ソースコードをダウンロードしたら、まず浮世絵風画像を出力するモデルの事前学習済み重みデータをダウンロードしていきましょう。Linux環境で下記のコードを入力すると一発で変換してくれるので便利です。Windows10でLinuxを動かす場合はwsl2(Windows Subsystem for Linux 2)をインストールし、Ubuntu上で実行することができます。ここを参考に設定することができます。

Linax環境が整いましたらpytorch-CycleGAN-and-pix2pixディレクトリ下で↓のコードを実行してください。

bash ./scripts/download_cyclegan_model.sh style_ukiyoe
bash ./datasets/download_cyclegan_dataset.sh ukiyoe2photo

実行すると、checkpointsディレクトリ下へstyle_ukiyoe_pretrainedディレクトリが生成され、その中にlatest_net_G.pthというデータファイルがダウンロードされていると思います。確認できればOKです。

動画ファイルの準備

動画ファイルはお手持ちのモノを準備してください。.mp4、.MOVで変換できることを確認しています。iphoneで撮影したモノでも大丈夫です。

浮世絵風にした場合、風景画像がイイ感じで変換できるので、動画のフリー素材をダウンロードしてもいいと思います。今回は↓のサイトからダウンロードした動画を使っていきます。

Just a moment...
Just a moment...

動画ファイルを複数の静止画にする

動画ファイルは静止画をつなげたモノということは皆さんご存じだと思います。Pythonを使って処理していきます。まずは、用意した動画をpytorch-CycleGAN-and-pix2pixの”datasets”ディレクトリ下へ保存してください。

Jupyter Notebookを使っていきます。Jupyter Notebookの使い方はAnacondaをインストールすることで使えるようになります。この辺りはここを参考にしてください。

pytorch-CycleGAN-and-pix2pixディレクトリ下へ↓のipynbファイルをダウンロードしてください。

動画→静止画への変換については、movie2imageをJupyterNotebookで開いてください。面倒な方は↓のコードを実行するでもOKです。

import cv2
import os

movie_name = 'Mountain' #動画の名前
path ='./datasets/'+ movie_name
os.mkdir(path)

movie = path +'.mp4'

count = 0
cap = cv2.VideoCapture(movie)
 
while True:
    ret, frame = cap.read()
    if ret == True:
        count += 1
        cv2.imwrite(path +'/'+ movie_name + '_' + str("{0:05d}".format(count)) +'.jpg', frame)
    else:
        break
  • movie_name = ここに保存した”動画の名前”を入れてください。
  • 動画が.mp4の場合のコードです。mp4ファイルでない場合は、movie = path + ‘.mp4’を書き換えてください。(例movie = path + ‘.MOV’)

実行するとdatasetsの中に”動画の名前”のディレクトリが生成され、その中に大量の画像が出力されていると思います。出力されていればOKです。

画像を浮世絵風へ変換

動画より抽出した画像を浮世絵風へ変換していくのですが、やり方は前の記事で説明したモノと同じです。

必要なライブリは↓です。AnacondaPromptなどでインストールしてください。PyTorchはCUDAのバージョンに注意してください。この辺りが不安な方は前の記事で詳しく説明しているので参考にしてください。※CUDAがややこしい場合はCPU環境でも動作しますが、一旦↓をインストールしてください。

pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install dominate
pip install visdom

↓のコードを実行すると浮世絵風の画像が生成されます。

python test.py --dataroot datasets/動画の名前 --name style_ukiyoe_pretrained --model test --no_dropout --preprocess scale_width --load_size 640 --num_test 1000
#CPU環境で実行したい場合は↑の引数に --gpu_ids -1 を追記してください。

実行すると、resultディレクトリへstyle_ukiyoe_pretrained、ご自分で設定した名前のディレクトリが生成され、画像変換されていると思います。引数を簡単に説明すると↓です。

  • –dataroot datasets/動画の名前 :データの保存場所です。動画の名前をご自分で設定した名前へ変更してください。
  • –preprocess scale_width:256×256に切り抜かれるのを防ぎます。
  • –load_size 640:640pix幅になるように画像をリサイズします。お好みで変更してください。
  • –gpu_ids -1:CPUを使いたい場合は追記してください。GPUの場合は不要です。

変換した画像を再度動画化する

静止画→動画への変換については、上でダウンロードしたimage2movieをJupyterNotebookで開いてください。面倒な方は↓のコードをコピペでもOKです。

import cv2
import glob
import os

#↓ここを設定してください
movie_name = 'fish' #動画の名前
style_name = 'ukiyoe' #monet #vangogh
frame_size = 3  #FHD=0, 4K=1, iphone=2, small=3
frame_rate = 30.0  #FPS

path = './results/style_' + style_name + '_pretrained/test_latest/images'
images = glob.glob(path + '/*fake.png')
if frame_size == 0:
   #FHD動画
   width = 1920
   height = 1080
elif frame_size ==1:
   #4K動画
   width = 3840
   height = 2160
elif frame_size ==2:
   #iphone動画
   width = 1080
   height = 1920
else:
   #small
   width = 640
   height = 360

fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
video = cv2.VideoWriter(path + '/' + movie_name +'.mp4', fourcc, frame_rate, (width, height))
   
print("動画変換中...")

for i in range(len(images)):
    img = cv2.imread(images[i])
    img = cv2.resize(img,(width,height))
    video.write(img) 
       
video.release()
print("動画変換完了")
  • movie_name = ‘fish’ :動画の名前を設定してください
  • style_name = ‘ukiyoe’ #monet #vangogh:ここは変えなくてOKです。
  • frame_size = 3 #FHD=0, 4K=1, iphone=2, small=3:動画のサイズを選択できます。変換した画像のサイズに合わせると良いです。
  • frame_rate = 30.0 #FPS:もとの動画のFPSと合わせると良いです。

実行していただくと、 ./result/style_ukiyoe_pretrained/images/へ動画が出力されていると思います。

浮世絵の動画ギャラリー

いくつかつくったモノを掲載します。いろいろ試した結果、風景がいい感じで変換できますね。

AIを使うと面倒な画像処理をしなくてもつくれるので良いですね。面白いので是非やってみてください。

コメント

タイトルとURLをコピーしました