この記事は個人開発サービスに用いられている技術 Advent Calendar 2018 の24日目です。
こんにちは、2z(Twitter: @2zn01 )です。
普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。
昨年末に、画像・動画の解像度をあげてくれる「waifu2x-multi」というサービスを開発しました。
■waifu2x-multi
https://waifu2x.me/
- Before
↓
- After
※今さらリリース報告です!
— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) 2018年8月26日
画像をきれいに拡大する「waifu2x」というサービス/OSSがあります!
一つ一つの画像を指定して変換するのが面倒なので、複数画像のアップロードに対応し、一括で変換できるサービスを作りました!!
(2016年2月に)
ぜひ使ってみてください!https://t.co/REOo3XOEgV pic.twitter.com/yTUh63Nvmw
※今さらリリース報告の第2弾です!
— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) 2018年8月26日
画像をきれいに拡大する「waifu2x」ですが、動画対応させてリリースしました!!
(2018年2月ぐらいに)
動画のコマごとに拡大するため、めっちゃ時間かかりますが、このプレビューではGPUサーバを10台同時に立てて並列処理させてます!https://t.co/cCDWUcaS2X pic.twitter.com/mSID2DjUE4
この後に開発することになるAIメーカーはこの「waifu2x-multi」の開発を通して学んだことを活かして作っています。
難易度的には、「 waifu2x-multi > AIメーカー 」だと思っているので、AIメーカーを1か月ほどでリリースできたのはこの開発をしてたところが大きいです。
この記事では、この「waifu2x-multi」で使っている技術をまとめたいと思います。
作ったもの
waifu2xというサービス/OSS(オープンソースソフトウェア)はご存知でしょうか?
簡単にいえば、AI(人工知能)を使って小さな画像を綺麗に拡大するサービスです。
公式のwaifu2xは以下のURLでサービス提供されています。
また、GitHubでプログラムもオープンソースで公開されています。
私が作ったものは、「waifu2x」のOSS(オープンソースソフトウェア)へ以下の機能を追加した、公式とは別の派生サービスになります。
- 複数ファイルのアップロード・拡大機能
- 動画の拡大機能
- 専有サーバによる高速な拡大処理
- サイズ制限の緩和
こちらは以下のURLで公開しています。
■waifu2x-multi (上記1のみ対応)
■waifu2x-multi Pro (上記1~4のすべてに対応)
画面/利用イメージ
・まとめて一括変換
※今さらリリース報告です!
— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) 2018年8月26日
画像をきれいに拡大する「waifu2x」というサービス/OSSがあります!
一つ一つの画像を指定して変換するのが面倒なので、複数画像のアップロードに対応し、一括で変換できるサービスを作りました!!
(2016年2月に)
ぜひ使ってみてください!https://t.co/REOo3XOEgV pic.twitter.com/yTUh63Nvmw
・動画対応
※今さらリリース報告の第2弾です!
— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) 2018年8月26日
画像をきれいに拡大する「waifu2x」ですが、動画対応させてリリースしました!!
(2018年2月ぐらいに)
動画のコマごとに拡大するため、めっちゃ時間かかりますが、このプレビューではGPUサーバを10台同時に立てて並列処理させてます!https://t.co/cCDWUcaS2X pic.twitter.com/mSID2DjUE4
なぜ開発したか?
・waifu2xの凄さに驚いた
「waifu2x」は2015年5月17年に公開され、瞬く間に話題になりました。
作者の方が以下のブログ記事にまとめていらっしゃいます。
■二次元画像を拡大したいと思ったことはありませんか?
http://ultraist.hatenablog.com/entry/2015/05/17/183436
画像を綺麗に拡大する精度の凄さに驚きました。
ちょうどディープラーニングが話題になり出した時期でもあり、私も興味を持ち、早速触ってみたのが開発のきっかけです!
・複数画像へ対応すればもっと便利!
「waifu2x」を触っているうちに、一つ一つの画像ごとにアップロードするのが大変と感じてました。
そこで、複数画像の拡大に対応すれば、もっと便利に使えるのではと考えました!
・技術的な興味で動画対応させてみたかった
「waifu2x」を使って動画拡大する試みをやっている方がいて、自分も挑戦してみたいと考えました。
ただ、その試みもLinuxのコンソール上でスクリプトをたたいて実行するものしかなかったため、web上でできるようにすれば、利用者のハードルも下がると思い、作りました!
システム構成
・waifu2x-multi
<特徴>
- GPUインスタンスは全ユーザで共有
- ユーザがアップロードした画像はひとつのGPUインスタンスで変換処理してレスポンスを返すため、複数のユーザが同時に利用した場合は、その分、変換待ちが発生してしまう
・waifu2x-multi Pro
<特徴>
- ユーザごとに専有のGPUインスタンスを生成
- 複数インスタンスを同時に立てることもでき、その場合は画像/動画を並列に処理できる
- ユーザがアップロードした画像/動画はフロントサーバによってAmazon EFSへ格納してタスク化
- 裏側で控えているバックエンドサーバによって、専有のGPUインスタンス(waifu2xサーバ)を立ち上げ、画像/動画の変換処理をwaifu2xサーバへ投げかける
- waifu2xサーバはタスクがすべて終わるまで、Amazon EFSに格納された画像/動画を変換処理していく
- 変換処理がすべて終わったら、バックエンドサーバによってwaifu2xサーバのインスタンスを停止
動画変換の仕組み
- ユーザからアップロードされた動画ファイルはwaifu2xサーバ上で、ffmpegを使って「各コマごとの画像」と「音声」へ分割
- 各コマごとに分割された画像はすべてwaifu2xサーバで拡大処理
- すべてのコマ画像を拡大後、ffmpegを使って「変換後の各コマ画像」と「音声」を結合して動画を生成
インスタンスの設定で起動数を指定できるようにしており、複数インスタンスを立ち上げた場合には、上記の画像の各コマの拡大は複数インスタンスで並行して処理されます。
使用している技術
Linux
クラウドのホスティングは、Amazon Web Services(以下、AWS)を使用しており、Amazon EC2でサーバを立てています。
サーバのOSはLinuxでAmazon Linux 2を使っています。
Apache
フロントエンドのwebサーバはApacheを使っています。
Welcome! - The Apache HTTP Server Project
Nginx
バックエンドのwebサーバはNginxを使っています。
MySQL
Amazon RDSを使ってMySQLを立てています。
Amazon EFS
有料版ではマルチインスタンスで動くので、複数のインスタンスでデータを共有できるようにAWSのAmazon EFSというネットワークファイルシステムを使っています。
データが残り続けるとヤバイことになるので、1か月を経過したらデータは削除するようにしています。
PHP
フロントサーバ側のプログラムはPHPを使って実装しました。
フレームワークはZend Frameworkを使用しています。
LuaJIT
バックエンドサーバ側のプログラムはLuaJITを使って実装しました。
僕もそんなに詳しくわけではなく、TorchがLuaJITで動くので、それで使っているだけです。
Torch
学技術計算の為の、機械学習ライブラリです。
waifu2x
waifu2xのプログラム、学習済みモデルはGitHub上でオープンソースで公開されています。
ffmpeg
動画と音声、画像の変換に使用しています。
- 動画 → 音声、コマごとの画像
- 音声 + コマごとの画像 → 動画
jQuery
クライアント側のJavaScriptは、jQueryを使って実装しました。
Stripe
有料版の課金の仕組みはStripeを使っています。
JavaScirptとPHPの短いコードで導入できるので、簡単でした。
Paypal
海外の人からクレジットカードが使えないからPaypalも使えるようにしてよ!とお問い合わせがあったので、Paypalからの課金にも対応しました。
これも実装の手間はそんなになく、Stripeと同じくくらい簡単に導入できました。
また、日本の方からはクレジットカードの情報を入れたくないので、Paypal対応してという声もありました。
ちなみにStripeとPaypalの使用比率は半々ぐらいです。
ただし、Paypalの使用率が高いのは海外の方が多いですね。
最後に
今回、waifu2x-multiで使っている技術についてご紹介しました。
ちなみにAWSのインスタンスを起動から停止まで管理するプログラムを書いたのはこのときが初めてです。
リリースする前のデバッグ時には、インスタンスの制御に失敗してインスタンスが起動しっぱなしになってしまったこともあり、開発には色々と苦労しました。
でも、そのときのノウハウがAIメーカーに活かされ、AIメーカーではインスタンスの管理に悩まされることはほとんどありませんでした。
サービスを開発したときには、そのときに得られたノウハウ、ソースコードが自分の資産となります。 サービスの開発スピードは、どれだけサービス作りの経験を積んできたかに尽きるかと思っています。自分の中でこうやれば作れるなというイメージができたら、こっちのもんです。
最初はそのイメージが現実と乖離してリリースまで大変な目にあうこともあるかもしれませんが、やればやったほど、あ!これはあのときのこれを使えばいけるなぁ~!とかイメージがどんどん具体化していきます。
また、それはソースコードの資産が貯まっているのもあいまって、指数関数的に開発スピードが速くなる可能性もあります。 (これはもちろん、資産として使えるようにプログラムを書いていることが前提にはなりますが、、)
なので、皆さんもどんどん自分のサービス作りをやっていきしましょう!
この記事に少しでも興味をもって頂けましたら、本ブログの読者登録やTwitter: @2zn01をフォローして頂くと更新の励みになります!
よろしくお願いします!