スキマノート

AIメーカーなどのwebサービスを作っています。ここでは気になった技術、話題などをまとめたり、雑記を書いたりします。

画像・動画の解像度をあげてくれるAI「waifu2x-multi」を支える技術

この記事は個人開発サービスに用いられている技術 Advent Calendar 2018 の24日目です。


f:id:no2z1:20181230183149p:plain


こんにちは、2z(Twitter: @2zn01 )です。

普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。

昨年末に、画像・動画の解像度をあげてくれる「waifu2x-multi」というサービスを開発しました。

■waifu2x-multi
https://waifu2x.me/

  • Before

f:id:no2z1:20181230230655p:plain

    ↓

  • After

f:id:no2z1:20181230230722p:plain


www.youtube.com



この後に開発することになるAIメーカーはこの「waifu2x-multi」の開発を通して学んだことを活かして作っています。

難易度的には、「 waifu2x-multi > AIメーカー 」だと思っているので、AIメーカーを1か月ほどでリリースできたのはこの開発をしてたところが大きいです。

この記事では、この「waifu2x-multi」で使っている技術をまとめたいと思います。

作ったもの

waifu2xというサービス/OSS(オープンソースソフトウェア)はご存知でしょうか?
簡単にいえば、AI(人工知能)を使って小さな画像を綺麗に拡大するサービスです。

公式のwaifu2xは以下のURLでサービス提供されています。

waifu2x.udp.jp

また、GitHubでプログラムもオープンソースで公開されています。

github.com

私が作ったものは、「waifu2x」のOSS(オープンソースソフトウェア)へ以下の機能を追加した、公式とは別の派生サービスになります。

  1. 複数ファイルのアップロード・拡大機能
  2. 動画の拡大機能
  3. 専有サーバによる高速な拡大処理
  4. サイズ制限の緩和

こちらは以下のURLで公開しています。

■waifu2x-multi (上記1のみ対応)

waifu2x.me

■waifu2x-multi Pro (上記1~4のすべてに対応)

mng.waifu2x.me

画面/利用イメージ

www.youtube.com

・まとめて一括変換
・動画対応

なぜ開発したか?

・waifu2xの凄さに驚いた

「waifu2x」は2015年5月17年に公開され、瞬く間に話題になりました。
作者の方が以下のブログ記事にまとめていらっしゃいます。

■二次元画像を拡大したいと思ったことはありませんか?
http://ultraist.hatenablog.com/entry/2015/05/17/183436

画像を綺麗に拡大する精度の凄さに驚きました。

ちょうどディープラーニングが話題になり出した時期でもあり、私も興味を持ち、早速触ってみたのが開発のきっかけです!

・複数画像へ対応すればもっと便利!

「waifu2x」を触っているうちに、一つ一つの画像ごとにアップロードするのが大変と感じてました。

そこで、複数画像の拡大に対応すれば、もっと便利に使えるのではと考えました!

・技術的な興味で動画対応させてみたかった

「waifu2x」を使って動画拡大する試みをやっている方がいて、自分も挑戦してみたいと考えました。

ただ、その試みもLinuxのコンソール上でスクリプトをたたいて実行するものしかなかったため、web上でできるようにすれば、利用者のハードルも下がると思い、作りました!

システム構成

・waifu2x-multi

https://waifu2x.me/

<特徴>

  • GPUインスタンスは全ユーザで共有

waifu2x-multi-システム構成図.png

  • ユーザがアップロードした画像はひとつのGPUインスタンスで変換処理してレスポンスを返すため、複数のユーザが同時に利用した場合は、その分、変換待ちが発生してしまう

・waifu2x-multi Pro

https://mng.waifu2x.me/

<特徴>

  • ユーザごとに専有のGPUインスタンスを生成
  • 複数インスタンスを同時に立てることもでき、その場合は画像/動画を並列に処理できる

waifu2x-multi-Pro-システム構成図.png

  • ユーザがアップロードした画像/動画はフロントサーバによってAmazon EFSへ格納してタスク化
  • 裏側で控えているバックエンドサーバによって、専有のGPUインスタンス(waifu2xサーバ)を立ち上げ、画像/動画の変換処理をwaifu2xサーバへ投げかける
  • waifu2xサーバはタスクがすべて終わるまで、Amazon EFSに格納された画像/動画を変換処理していく
  • 変換処理がすべて終わったら、バックエンドサーバによってwaifu2xサーバのインスタンスを停止

動画変換の仕組み

waifu2x-multi-Pro-動画変換の仕組み.png

  • ユーザからアップロードされた動画ファイルはwaifu2xサーバ上で、ffmpegを使って「各コマごとの画像」と「音声」へ分割
  • 各コマごとに分割された画像はすべてwaifu2xサーバで拡大処理
  • すべてのコマ画像を拡大後、ffmpegを使って「変換後の各コマ画像」と「音声」を結合して動画を生成

インスタンスの設定で起動数を指定できるようにしており、複数インスタンスを立ち上げた場合には、上記の画像の各コマの拡大は複数インスタンスで並行して処理されます。

使用している技術

Linux

クラウドのホスティングは、Amazon Web Services(以下、AWS)を使用しており、Amazon EC2でサーバを立てています。
サーバのOSはLinuxでAmazon Linux 2を使っています。

aws.amazon.com

Apache

フロントエンドのwebサーバはApacheを使っています。

Welcome! - The Apache HTTP Server Project

Nginx

バックエンドのwebサーバはNginxを使っています。

https://nginx.org/

MySQL

Amazon RDSを使ってMySQLを立てています。

MySQL

aws.amazon.com

Amazon EFS

有料版ではマルチインスタンスで動くので、複数のインスタンスでデータを共有できるようにAWSのAmazon EFSというネットワークファイルシステムを使っています。

aws.amazon.com

データが残り続けるとヤバイことになるので、1か月を経過したらデータは削除するようにしています。

PHP

フロントサーバ側のプログラムはPHPを使って実装しました。
フレームワークはZend Frameworkを使用しています。

PHP: Hypertext Preprocessor

framework.zend.com

LuaJIT

バックエンドサーバ側のプログラムはLuaJITを使って実装しました。
僕もそんなに詳しくわけではなく、TorchがLuaJITで動くので、それで使っているだけです。

The LuaJIT Project

Torch

学技術計算の為の、機械学習ライブラリです。

torch.ch

waifu2x

waifu2xのプログラム、学習済みモデルはGitHub上でオープンソースで公開されています。

github.com

ffmpeg

動画と音声、画像の変換に使用しています。

  • 動画 → 音声、コマごとの画像
  • 音声 + コマごとの画像 → 動画

FFmpeg

jQuery

クライアント側のJavaScriptは、jQueryを使って実装しました。

jquery.com

Stripe

有料版の課金の仕組みはStripeを使っています。
JavaScirptとPHPの短いコードで導入できるので、簡単でした。

stripe.com

Paypal

海外の人からクレジットカードが使えないからPaypalも使えるようにしてよ!とお問い合わせがあったので、Paypalからの課金にも対応しました。
これも実装の手間はそんなになく、Stripeと同じくくらい簡単に導入できました。

www.paypal.com

また、日本の方からはクレジットカードの情報を入れたくないので、Paypal対応してという声もありました。

ちなみにStripeとPaypalの使用比率は半々ぐらいです。
ただし、Paypalの使用率が高いのは海外の方が多いですね。

最後に

今回、waifu2x-multiで使っている技術についてご紹介しました。

ちなみにAWSのインスタンスを起動から停止まで管理するプログラムを書いたのはこのときが初めてです。
リリースする前のデバッグ時には、インスタンスの制御に失敗してインスタンスが起動しっぱなしになってしまったこともあり、開発には色々と苦労しました。

でも、そのときのノウハウがAIメーカーに活かされ、AIメーカーではインスタンスの管理に悩まされることはほとんどありませんでした。

サービスを開発したときには、そのときに得られたノウハウ、ソースコードが自分の資産となります。 サービスの開発スピードは、どれだけサービス作りの経験を積んできたかに尽きるかと思っています。自分の中でこうやれば作れるなというイメージができたら、こっちのもんです。

最初はそのイメージが現実と乖離してリリースまで大変な目にあうこともあるかもしれませんが、やればやったほど、あ!これはあのときのこれを使えばいけるなぁ~!とかイメージがどんどん具体化していきます。

また、それはソースコードの資産が貯まっているのもあいまって、指数関数的に開発スピードが速くなる可能性もあります。 (これはもちろん、資産として使えるようにプログラムを書いていることが前提にはなりますが、、)

なので、皆さんもどんどん自分のサービス作りをやっていきしましょう!


この記事に少しでも興味をもって頂けましたら、本ブログの読者登録やTwitter: @2zn01をフォローして頂くと更新の励みになります!

よろしくお願いします!