try! Swift Tokyo 2018 でLT登壇しました&学習済みCoreMLモデルを公開しました
2018/3/1〜3/2に開催された try! Swift Tokyo 2018 に参加&LT登壇してきました。LTではCoreML + 超解像について話しました。
色々感想を・・と、その前にお知らせです。
学習済みモデルを公開しました
発表中では「学習済みモデルについては大人の事情で公開できませんでした」と話しましたが、つい先程以下のレポジトリで公開しました。
発表では業務で使っている画像データを学習させていたのですが、今回公開したモデルは二次使用フリーの漫画「ブラックジャックによろしく」の全13巻分の画像データを使って学習させたものです(訓練:検証=6:4くらい)。 ある程度の精度は出てるので、実際にどんな雰囲気なのか確認できると思います。
git clone git@github.com:kenmaz/SRCNNKit.git
cd SRCNNKit
git submodule init
git submodule update
open SRCNN-ios/SRCNN-ios.xcodeproj/
みたいな感じでXcodeを開いてRunすれば実際にデモを試すことができます。 こんな感じ。
ブラックジャックによろしく 佐藤秀峰 Give My Regards to Black Jack SHUHO SATO
発表について
今回の発表は、ディープラーニングを使って低解像画像から高解像画像を生成する技術である「超解像」を、CoreMLを使ってiOSデバイス上で動かす、という内容でした。
今回の発表のためにデモアプリを実装しましたが、これが割りと性能が良く、最初に見たときは自分でもかなり感動したことを覚えています。
とりあえず発表内容はさておき、このデモさえ見せれば、それなりに盛り上がるんじゃないかな・・と思っていましたが、期待どおりデモを行ったときに会場から「お〜」という声が上がったので、ホッとしました。また、今回のデモで使ったコードをオープンソースとして公開することを発表したときも、会場の反応は非常に良かったです。
今回のような大規模な会場での登壇は何度か経験がありましたが、今回の発表がいままでで一番ウケたような気がします。頑張って準備しておいてよかったー!
try! Swift Tokyo 2018 参加レポート - Technology of DeNA より
ということで、ここから前後日談をだらだらと書きます。
前後日談
2018/1/16 CfP提出
社内slackで人事チームから「LTのCfP出したら採択結果に関わらず try! Swift の参加費出すよー」というアナウンスがあったので、せっかくならなんか話したいな、と思い色々ネタを考え始めました(別にCfP出さなくても金は部署から出してもらえるんですが)。
ちょうどその時読んでいた 「Chainerで作る コンテンツ自動生成AIプログラミング入門 」 という本で、超解像の仕組みと実装について知り、気になっているところでした。

Chainerで作る コンテンツ自動生成AIプログラミング入門
- 作者: 坂本俊之
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2017/12/14
- メディア: Kindle版
- この商品を含むブログを見る
この時点ではまだ1行もコードを書いたり実験をしていたわけではないのですが、これだったらKerasとCoreMLでサクッと行けそうだな、とぼんやり考えつつ、見切り発車でCfPを提出しました。まあSwiftに直接関係する内容でもないし落選するだろ、採択されたとしてもまあどうにかなるやろー、と楽観視していましたが・・
2018/1/29 採択通知と混乱
なんと採択通知が来ました。この時点では軽く論文を読んだりはしてましたが、その他はまったく何の準備もできてません。発表までわずか1ヶ月。ケツに火がつきました。ここから帰宅後やチームの20%ルールを使って、発表の準備をシコシコとやっていました(ちなみに実験用のEC2 GPUインスタンス代は部署の金で使わせてもらった)。
話の流れとしては、
- 仕事で扱っているマンガの画像データを使って超解像モデルを訓練
- アプリに組み込む
- 実用的な結果が出た
- ワーイ
というものを最初は想定していました。
既存実装としてはどんなものがあるかな、とググてみたところいきなり発見したのが、発表でも紹介した waifu2x-ios。
なんだもう実例あるじゃん、と発表の意義が薄れかけたましたが、実際に動かしてみると、有名なwaifu2xのiOS移植版というだけあって、さすがにかなりきれいに超解像化されてます。ただ、マンガのセリフ部分が潰れてしまうことに気づいたので、じゃあ発表内容は「自前データを使って学習させてwaifu2x-iosをマンガに最適化してみたよ」的な流れにしようかなー、と方向転換しました。
となるとまずやることは、waifu2x-iosに組み込める学習済みモデルを用意することです。waifu2x-iosはどうやらwaifu2xのCaffe実装である、waifu2x-caffe で生成したモデルをcoremltoolsで変換したものを組み込んでいるようです。そこで waifu2x-caffe の実行環境をまずは整えてみるか、と調べてみるとwaifu2x-caffeはWindows環境で動作するように作られているらしく、いきなりつまづきました。Windows機持ってないし。。
もうちょい調べてみるとwaifu2x-caffeをubuntu上で動かすようにカスタムした waifu2x-caffe for Ubuntu を発見したので、これだー!と思いAWSでGPUインスタンスを借りて環境構築を始めたのですが・・・うまく環境を構築できない。ある程度深追いはしてみたんですが、どうも駄目感が漂ってきました。てことでこれは断念
そうだ、本家waifu2xで作ったモデルをなんとかCoreMLモデルに変換する方法があるのでは、、と思い、本家waifu2xの実行環境を構築してみたところ、これはかなり簡単に成功しました。よしよし、と思いましたが、ここでまた問題が。本家waifu2xは lua + Torch7 で書かれてます。当然どっちも触るのは初めてです。luaとTorchで学習させたモデルを、さらにどうやってCoreMLモデルに変換するか・・。そのパスは公式には用意されていないので、また色々ぐぐったところ、lua + Torch7 -> pyTorch ➔ CoreML を実現する torch2coreml を発見したものの・・やはりうまく動かず。
この時点で日時は 2/5。ああやばいな1ヶ月切っちゃった、、ってことでwaifu2x路線は捨て、ぜんぶイチから書く方針にまた進路変更を決定
2018/2/6 方向性固まる
イチから、ってことで改めて論文をしっかり読む。
http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html
読んでみるとやっていることは非常にシンプル。こんなので本当にいい結果がでるのかな・・と思いつつも、久しぶりの Python + Keras で論文に忠実になんとなくコードを書いて走らせてみると・・たしかにちゃんと超解像できてる。。さらにKerasで書いてるのでCoreMLモデルへの変換も全くスムーズに成功し、しかも割りと速い。
そもそも何故ここまでwaifu2xに乗っかる路線で行こうかと思っていたかというと、waifu2xのコードをみるとかなりいろいろ細かいことをやっているので「なるほど、論文通りに実装してもきっと精度でないんだろうな・・」などと勝手に思い込んでいたからです。実際にやってみると拍子抜けするくらいにちゃんと動く。
ここでようやく方向性が固まりました。
try! Swiftの運営チームから2/15に一旦発表資料を提出してくれと言われていたのでスライドをまとめつつも、検証を進める。
2018/2/16 技術検証
で、検証はすんなり進んだのですが、ここでさらに厄介なことが。自前でKerasで書いたコードはちゃんと動くんですが、どうもなんか生成される画像がちょっと暗い。暗いだけなら生成後に適当に決め打ちで調整してやればいいっちゃいいんですが、論文ではそんなこと言及されてなかったし。。ってことで、ここから地道なデバッグ作業がはじまり、いろいろ試して(本業が逼迫しつつも)10日後くらいにようやくまともなモデルが出来上がり。
(暗くなる問題については、実はまだきっちりとは原因の分析ができておらず、整理が着いたらQiitaにでも書くかも)
ここからは技術的にハマるところは特になく、さらにgpuマシンで学習を進めてみたり、iOS側の実装をしたりして過ごす。
2018/2/25 OSS化
このあたりで権利周りのことが気にかかってくる。スライド中で使うマンガのコマ画像などの権利関係を社内調整しつつ、このへんでむくむくと今回のコードをオープンソース化したいなぁ、、と思い始める。どう考えても急すぎるんですが、社内の関連部署の方々の協力を得て、だいぶゴタゴタしつつも、なんとか公開できる見込みが立つ。ほんとすいません。。その節はもう感謝しかありません。。。
あとは発表練習。妻に聞いてもらって辛辣なダメ出しをもらいつつも、夜な夜なブツブツ呟く日々を過ごす。
2018/3/1 初日とスピーカーディナー
ついに当日。自分の出番は2日目なので1日目はわりと余裕。自社ブースに顔出したり、セッションを聞いたりと楽しく過ごす。 ここで皆さんの発表を見ていて気づいたことが。まず、多くのスピーカーのスライド資料が、英語であるということ。海外からの参加者が多いとは聞いていたが、実際に会場の1/4くらいは海外の方であることがわかり、焦る。一方自分のスライド資料は完全日本語。ってことで、会場でセッションを聞きつつも、いそいで自分の資料を英語化する。
よっしゃこれで準備OKってことで、1日目終了後にはtry! Swiftのスピーカーとスポンサーだけが参加するパーティがあるってことで、ヨロヨロと新宿パセラに向かう。そこで飯を食いつつ、堤さんとCoreMLの話をしたり、いろんな人と話をしていると、kitasukeさんやk_katsumiさんに「いやこんだけ海外の人きてるんだし、発表も英語ですべきでしょうー」とアドバイスを受ける。英語で話すという発想はまったくなかったですが、たしかにこんだけ海外の人がいるからな・・・と感化され、こうしちゃおれん、ということでパーティ会場からそそくさと退散し、さっそく帰りの電車内でiPhoneのメモアプリを使ってトーク内容を英語化する作業を始める。そして帰宅して英語での発表練習を繰り返す。せっかくなら誰かに英語のチェックをしてほしかったが、もう間に合わないのでそこはぶっつけ本番で。
たしか英語でプレゼンするのは、かれこれ10年以上前に部署内向け研究成果発表会での1回きりだった気がする。今回のように大勢の人の前で英語でしゃべったことは一度もなかったが、なぜかその時は意外といけるんじゃないかなーという自信があり、まあ5分だしどんなにトチっても問題なかろう・・・ってことでやはり2:00くらいまで練習して寝る。
(ちなみにこの件で発表当日、主催のd_dateさんに通訳の関係でめっちゃご迷惑をおかけすることになったのであった。すいませんすいませんすいません)
2018/3/2 発表当日
当日は機材のテストのため、6:30起床、8:30に会場入り。睡眠不足ではあるが、緊張と発表のワクワク感でそれほど眠さは感じず。あっという間に自分の発表の出番が来る。5分のトークは一瞬で終わったけど会場の反応もよく、ほっと一安心。ステージから降りて自分の席に戻ると、まわりの海外の方々からハイタッチされたり、よかったよ的な言葉をかけられたりして嬉しかった。
ここから先は燃え尽き状態になり、自社ブースで弁当を食いながらしばしぼーっとする。二日目が終わりアフターパーティーに参加。現職・前職時代の同僚がたくさん来ており、色々話す。知らない人ともわりと話す。
そんな感じで私の怒涛のtry Swiftは終了。。。(あその一週間後アフタートークにも1日だけ参加したのであった)
try! Swift全体について
前回 try! Swift に参加したのは第1回のとき(しかも1日だけ)でしたが、今回は2日間全て参加し、登壇以外にも、会社のブースの手伝いがあったりと、かなり参加している感がありました。
半年前のiOSDCでの登壇のときは発表時間も長く緊張と準備で他の人のトークはほとんど聞けませんでしたが、今回は割りと余裕がありガッツリ色んな人のトークを聞けました。
印象に残ってるのは以下
Event driven networking for Swift
- Appleエンジニアによるトーク。豪華だ
- 7年前くらいに仕事でブロッキングなソケットベースのサーバー書いてたことあったけど、ノンブロッキングなやつに挑戦できずじまいでどんどんサーバーの仕事から離れていって今日に至る。
- ってことでswift-nioで再挑戦するぞ(まだ触ってない)
ASTメタプログラミング
iOSでCharlesを導入する
- お世話になっております!
- これからもお世話になります。LOVE
UIImageView vs Metal
- わかりやすいMetalの話
- 誰かwebpデコーダーをMetalで書いてくれないかなー(チラチラ
以上、だらだらとすいません。
皆さんお疲れ様でしたー。
そして運営チームの皆様貴重な場を設けていただきありがとうございました。
また頑張ります。