y_yoshiyのブログ

プログラミング、趣味について日々思ったことを書いていきます

GDDによるwaifu2xとffmpegを使用したアニメ映像高画質化

初めて技術的なブログを書きます。よろしくお願いします。 

はじめに

最近一部の界隈でGDD :ごちうさ駆動開発(Gochiusa-Driven Development) が盛んに行われてきていますね。アニメ2期が決定し[1]、私のエンジニアリングの意欲が増したのもごちうさのおかげだと思ってます。また、機械学習の分野では、ハードウェアの性能向上や新技術の発達・ライブラリが充実してきて、5月19日には、イラスト等の圧縮画像を元画像に復元する"waifu2x" [2]が登場しました。waifu2xは、機械学習技術を用いて、画像圧縮時のノイズを除去し、高画質な画像を復元するツールです。このツールの入力は画像のみですが、動画を連番画像に変換することで低画質な動画を高品質な動画に復元できるのではないかと考え、スクリプトを書いてみました。

システム構成

waifu2xはCUDAによるGPU並列演算や深層学習ライブラリを用いるため、NVIDIAGPUが必要です。今回はAmazonが提供しているAWS (Amazon Web Service)のスポットインスタンスを試しに使ってみました。

  • Instance: g2.2xlarge
  • AMI-ID: ami-75f01931

ソフトウェア構成

  • 上記の共有マシンイメージにはffmpegが入っていないので、インストールします
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg

手順

  • waifu2xのディレクトリに移動
cd /home/ubuntu/waifu2x
vim gochiusa.sh
chmod +x gochiusa.sh
#!/bin/sh

if [ $# -ne 4 ]
then
  echo "Usage: ./gochiusa.sh imput output start_time(s) duration(s)"
  exit 1
fi
mkdir frameimage
rm -r -f frameimage/*
mkdir trans
rm -r -f trans/*

ffmpeg -i $1 -y -t $4 -ss $3 trimmovie.mp4
ffmpeg -i trimmovie.mp4 -vcodec mjpeg -qscale 1 -qmin 1 -qmax 1 frameimage/snap%09d.jpg
ffmpeg -i $1 -y -acodec copy -map 0:1 -t $4 -ss $3 trimsound.mp4

cnt=1
for filename in frameimage/*.jpg
do
printf "%d times...\n" $cnt
if [ $((cnt%5)) -eq 0 ]
then
  printf "please wait...\n"
  wait
fi
th waifu2x.lua -m noise_scale -noise_level 2 -i $filename -o "trans/trans"$(printf "%09d" $cnt)".jpg" &
cnt=$((cnt+1))
done

ffmpeg -y -f image2 -framerate 29.97 -start_number 1 -i trans/trans%09d.jpg -i trimsound.mp4 -vcodec libx264 -qscale:v 0 $2
  • 実行例
./gochiusa.sh input.mp4 output.mp4 0 60

引数は、入力動画ファイル名、出力動画ファイル名、開始時間(秒)、長さ(秒)です。フレームレートは決め打ち。
"th〜"の行がwaifu2xに画像を入力して高画質画像を保存するコマンドです。この辺りで画像5つ毎に処理を回しています。というのも、一枚の処理に約2.5秒、5つ毎の処理を同時に実行して約10秒なので少し効率が良いからです。あまり多くの画像を一度に処理しようとしたらエラーが出たので5つにしてあります。

実験

実際に画質があまり良くないアニメ映像を用いて、waifu2xで高画質になるか実験しました。
使用した動画は「ご注文はうさぎですか?1話」。
www.nicovideo.jp
まず、元動画のサムネイル。(比較のため2倍にしてある)
f:id:y_yoshiy:20150525003136p:plain
そして復元後のサムネイル。
f:id:y_yoshiy:20150525003205p:plain

まとめ

1秒30フレーム、画像5つで10秒として30分のアニメを復元するのにおよそ30時間かかるが、動画の画質向上はできました。ぜひ好きな動画で試してみてください。きっと心がぴょんぴょんします。
AWSの料金などや画質を考えるとBDを買ったほうがよいですね。。。

[1] ご注文はうさぎですか?公式サイト
http://www.gochiusa.com/news/hp0001/index02670000.html
[2] waifu2x
https://github.com/nagadomi/waifu2x