1.はじめに
今回ご紹介するのは、アニメ画をスケッチ画に変換する Anime2Sketch という技術です。
*これに関連する論文は、2021.4に提出されました。
2.Anime2Sketchとは?
フリーハンドスケッチを写真へ変換するフレームワークとして下記の AODA があります。このフレームワークは、変換しようとするフリーハンドスケッチがトレーニングデータにない場合でも、クラスラベルを使用してリアルな写真を合成することができます。
Anime2Sketch は、このフレームワークの一部を利用して、アニメ画をスケッチ画に変換します。早速、コードを動かしてみましょう。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# githubからコードを取得 ! git clone https://github.com/cedro3/Anime2Sketch.git %cd Anime2Sketch # weights フォルダー削除 import os import shutil if os.path.isdir('weights'): shutil.rmtree('weights') # 学習済みパラメータとサンプル動画のダウンロード import gdown gdown.download('https://drive.google.com/u/1/uc?id=1wIC4VXRBRgFaPzL2v8RURCCAYu2J7zsH', 'weights.zip', quiet=False) gdown.download('https://drive.google.com/u/1/uc?id=1mTszJ5AcYW15x-AFsxdRZw-ARzypwYDK', 'movie.zip', quiet=False) ! unzip weights.zip ! unzip movie.zip |
サンプルビデオからアニメ画を切り出して images フォルダーに保存し、それをスケッチ画に変換したものを out フォルダーに保存します。自分のビデオを使用する場合は、PCから ./movie フォルダーにドラッグ&ドロップでアップロードし、16行目の def video_2_images(video_file= './movie/***.mp4'
を修正して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import os import shutil import cv2 # imagesフォルダーリセット if os.path.isdir('images'): shutil.rmtree('images') os.makedirs('images', exist_ok=True) # outフォルダーリセット if os.path.isdir('out'): shutil.rmtree('out') os.makedirs('out', exist_ok=True) # ビデオから静止画を切り出す関数 def video_2_images(video_file= './movie/movie03.mp4', image_dir='./images/', image_file='%s.png'): # Initial setting i = 0 interval = 3 length = 300 # リミッター cap = cv2.VideoCapture(video_file) while(cap.isOpened()): flag, frame = cap.read() if flag == False: break if i == length*interval: break if i % interval == 0: cv2.imwrite(image_dir+image_file % str(int(i/interval)).zfill(6), frame) i += 1 cap.release() # アニメ動画からアニメ画を作成 video_2_images() # アニメ画をスケッチ画に変換 ! python3 test.py --dataroot images --load_size 512 --output_dir out |
images フォルダーのアニメ画と out フォルダーのスケッチ画をmp4に変換し、この2つを連結して、再生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# output1.mp4 〜 output3.mp4 をリセット import os if os.path.exists('./output1.mp4'): os.remove('./output1.mp4') if os.path.exists('./output2.mp4'): os.remove('./output2.mp4') if os.path.exists('./output3.mp4'): os.remove('./output3.mp4') # アニメ画を動画に変換 ! ffmpeg -r 10 -i images/%6d.png\ -vcodec libx264 -pix_fmt yuv420p output1.mp4 # スケッチ画を動画に変換 ! ffmpeg -r 10 -i out/%6d.png\ -vcodec libx264 -pix_fmt yuv420p output2.mp4 # アニメ動画とスケッチ動画を連結 ! ffmpeg -i output1.mp4 -i output2.mp4 -filter_complex "hstack" output3.mp4 |
1 2 3 4 5 6 7 8 9 10 |
# mp4動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('./output3.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="100%" height="100%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
このサンプル動画以外にも、./movie にサンプルがありますので、そちらの方も試してみて下さい。
では、また。
(オリジナルgithub)https://github.com/Mukosame/Anime2Sketch
(twitterへの投稿)