iOS_の画像__55_

try! Swiftで二次元映えを英語で語った話

はじめまして、神武です。

try! Swift Tokyo 2019 に参加&LT登壇しました。
LTでは『ポートレートモードを自作しよう』というタイトルで、二次元映えについて語りました。

このnoteでは、
・来年登壇にtry!したい方
・try! Swiftの雰囲気を知りたい方
・神武の登壇内容に興味を持ってくれた方

向けに

登壇した経緯とか試行錯誤の内容とか登壇した感想とか+心に残ったセッションの共有を記したいと思います。

try! Swiftとは

try! SwiftはSwift言語での開発における最新の応用事例について集まる国際カンファレンスです。32ヶ国900人が参加したそう、おっきい。参加者全員が1ラインで同じセッションを見ます。神武はセッションのある2日間参加させていただきました。

きっかけ

try! Swiftのチケット販売が始まったと耳にした時、開催日時に既に大切な予定が入っていたため、あーーー今年は参加を諦めるかーーーと悔しがりながらも心に決め、スルーしていました。CfP募集が始まっても特に動かず。

そんな中、CfP募集の締め切り前前日で行われた社内のiOS勉強会で、いつもお世話になっている@noppeさんと@Kuniwakuさんが、swift-syntaxをいじいじしながら、「応募しましょうよ!」と背中を押してくれた。もちろん二人は応募していて、その内容も教えてくれた。

予定はなんとかして、二人の発表を聞くために参加するか!そしてチケットも買ってなかったので、会社のCfPを出せばチケット渡すよ!という素晴らしい制度を利用するために応募するか!と、重たい腰をあげて締め切り前日に応募しました。

提出したCfPはこちら

ポートレートモードを自作しよう
最近のiPhoneはデュアルカメラやTrueDepthカメラの搭載により、深度情報を利用して背景をぼかし、被写体を際立たせた美しい写真を撮影することができます。このトークでは、「深度情報を持たない」画像から背景と被写体を分離してぼかすポートレートモードを、Swiftでゴリゴリ自作して、美しい写真を仕上げていく過程をお話しします。

つまり
二次元画像を映えさせる過程をお話するよ!
というCfP

絶対採択されないと思っていたが、まさかの採択
背中を押してくれた先輩方々も採択🎉
Slackの盛り上がりの流れ(一部切り取り)

⚠️注意⚠️
応募者の個人情報はすべてマスクして選考してくださっているそうです
運営さんのブログより

準備

さて、採択されれば最初は、スライドを作ると思うじゃないですか。
しかしですね、神武は去年登壇されて今年ニューヨークでも登壇された大先輩、@kenmazさんの「登壇駆動開発」を見習ってCfPを出していました。

アドベントカレンダーを書くときに軽く実装しただけで、CfPの内容の実装はまだ未着手。
まずはポートレートモードそのものについての理解を深めるために、論文を読み漁りました。

今回一番参考にした論文が去年のSIGGRAPHでGoogleから発表されたこちらの論文

pixel 2に利用されている(おそらくpixel 3にも利用されている)シングルカメラで被写界深度を合成する手法が載っています。我なりの簡単な要約がこちら

pixel 2のカメラで撮影した被写界深度の合成手法
1.
人や物体を認識してからセグメンテーション
2. Disparity(ほぼDepthと捉えて良い)をレンズで得た2つのピクセルの差から抽出
3. 1と2を合成、この時1の領域は均一のDepthとする、細かいDepthは再現せず5段階に分ける
4. 境界はleakしないようDepthを用いて重みを計算、小テク色々
5. 最後に自然な画像にするためノイズを乗せる

ふむふむなるほどなるほど、レンズで得た情報からDepthを計算して活用しまくるね…流石Google様…

しかーし!!!神武が実現したかったのは、
二次元画像を映えさせること
なぜこの欲求を持っているかは長くなるのでまた別で語るとして
二次元画像の特徴はDepthを持ってないこと

そこで、追加で論文を読み漁ったり、たまたま会社にあったiPhoneXS Maxと、たまたま家にあったpixel 3で沢山の写真を撮影したり見比べたりして、ポートレートモードで撮影した写真の様に二次元画像を映えさせるために、最低限必要な要件を3つにまとめました。それが発表した下記の3つです。

1. 被写体をセグメントすること
2. 境界の色漏れを防ぐこと
3. 手前か奥かの情報(DOF)を付与すること

これを全部ピュアSwiftでやりました!という話しができれば面白いのでは!と思い着手しました。

採択から翻訳用登壇資料提出まで、3週間。英語での発表練習も時間を要すると考えていたため、この3週間で実装は全部終わらせて、資料も一通り作り終えるスケジュールを立てました。

まず最初に着手したのは1. 被写体をセグメントすること
これは、アドベントカレンダーに書いたGrabCutを引き続き用いて行いたいと最初に考えました。

そして、この時はOpenCVを借りたけど、Swiftで自前実装できれば面白いぞ!!!と思い丸1日着手しました💪

上手く行きませんでした😇
多くのバグにハマり、1日で仕上げることはできませんでした。

切り替え

そこで、考えました。

今回の登壇は5分。ピュアSwiftでゴリゴリに実装して、コードを事細かく紹介するよりも、他の様々な手法を試した結果を並べて比較する方に時間を割いた方が、伝わりやすく、印象が残りやすく、あらかじめ設定していた神武の登壇目標である

1. ポートレートモードってこんな要素で成り立っているのかーーーすげーーー面白いーーーという印象を残す
2. DeNAのエンジニアすげーーーという印象を残す

を達成できるのではないかと考えました。

つまり、優先度を、ピュアSwift実装から、多くの手段を試して結果を紹介する方針に切り替えることにしたのです。

ということで、至急、Deep learning技術の調査に走りました。実際にiOSで動かしてみた物体検出&セグメンテーション手段は下記

・Yolo
・SegNet
・Mask-RCNN

結果として、どれも、現実世界のものは上手く動くんですけど、人間と認識されない神武の大好きな可愛いキャラクター達を識別させるためには、そのキャラクターごとに学習させる必要で、超大変でした。
神武はデレステのSSもぼかしたいし、FF14のSSもぼかしたいし、どうぶつの森のSSもぼかしたいので、作品ごとに学習とかやってられません。

といった話しを踏まえた上で、やはりGrabCutを選択する、という話しをしよう、と決めました。

試行錯誤

2. 境界の色漏れを防ぐことについても、Googleの論文にあるように、Gausian Blurのマスクごとに重みを変えていこうかと思いましたが、処理が重いのと、なんか、普通だな、と思って。ちょっと変わった手法を試してみたら上手くいったので採用したり

3. 手前か奥かの情報を付与することについても、5重GrabCutしたらGoogleの5段階分けぼかしみたいなことできるんじゃね???と思って試したけど、流石に手動5回やるのは面倒だったのと、画像加工アプリにあるようにぼかしのグラデーションを操作できるだけでも、全然印象変わるなーーーと思ったので、そっちを採用したり

実装のゴールは、神武が二次元画像を満足に映えさせることができるアプリに仕上げること、に設定して、試行錯誤を繰り返し、demo appのかたちにしました

おそらく他の人からすると、操作しづらいところもいっぱいあると思うんですが、実装時間が限られていたので、上記のボーダーを引きました。

ちなみに神武は日々このアプリで二次元画像を加工しています。満足です🤗

英語

登壇は、英語でチャレンジしました。なぜ日本人なのに、英語全く喋れないのに、英語で登壇したかったのかというと、先ほども登場したkenmazさんが去年英語で登壇していた姿が印象に残ってたからです!かっこいい!あれ!神武もやりたい!!!

まず、自分なりにスクリプトを用意します。

次に、会社の英語サポート制度を利用させていただき、ネイティブにめちゃ修正してもらいます🤔

さらに、神武の右隣の席の海外に長く在住していたAndroidエンジニアさんに、めちゃくちゃ修正してもらいます🤔🤔

さらにさらに、神武の左隣の席のTOEICほぼ満点のリードエンジニアさんに、めちゃくちゃくちゃ修正してもらいます🤔🤔🤔

さらにさらにさらに、向かいの島にいる東大の博士を持ち海外研究発表を繰り返し行ってきたデータサイエンティストさんに、めちゃくちゃくちゃくちゃ修正してもらいました🤔🤔🤔🤔

こうして掘られて埋めて完成した✨スクリプト✨
日本語だと4分半で収まる内容だったのに、英語で話すと6分超えたので内容を削る作業もしました。

発音も両隣の人に、1時間のMTを2回取って聞いてもらって、鍛えてもらいました。

前々日には、違うチームの何も知らないネイティブのエンジニアさんに聞いてもらって、

🙆‍♀️ < もう全然通じるしとても面白いから、もっと自信持って話そう!

と言ってもらえて、とても勇気になりました。
協力してくださった皆さんには感謝してもしたりませぬ。

発表を終えて

発表中に暖かい拍手を沢山もらえたり👏

登壇後、神武の次に登壇していたIBMの方が、超素晴らしかったと3回くらい握手してくれたり🤝

すれ違う海外の人が、「ワンダフルーーー」とか「グレイトーーー!!!」とか、わざわざ声かけてくれたり🎉

中国の方に「一緒に写真撮らせていただけませんか?」と何故か2ショットを求められたり🤔

日本のおなじみのみんなにも「良き✨」と言ってもらえたり

1番良かったセッションが神武のセッションと言っていた人がいたと人伝に聞いたり😱

後日丁重にメッセージをいただけたりして✉️

嬉しかったですーーー!聞いてくださりほんまありがとうございまする!!!
登壇に関するツイートまとめ(まとめ感謝🙏)

多くの海外の人から良き声かけてもらった経験は英語勉強の大きな活力になりました。頑張るぞおおお💪

長くなってしまったので、この辺りで切り上げ!!!

心に残ったセッション

まだ復習しきれていないので、全セッションを聞いた中で心に残ったセッションを少し共有したいと思います。

PixarのようなグラフィックをSwiftで実現する
あああーーー!ピュアSwiftだあああ!!!最高!!!ってなりました。
しかも映える。//TODO: 動かしてみる

Siri ShortcutsとNSUserActivityによるエンゲージメント推進
いかにSiri Shortcutsを自分のAppで活用するのが簡単か、神武の好きな作ってみよう!系の登壇で、楽しかった。
Siriは音声認識部分しか活用したことがないので、実装してみる。

魔法の法則
Apple様の登壇。神武は登壇の内容だけではなく、話者の喋り方や話しの流れに着目して、自分が活かせるところは盗んで生かすぞ!!!という意気込みで全登壇を見ているのだが、3つの法則ごとに身近で具体的な例え、日本人にわかるものを入り交ぜつつ余裕を持った音程で喋る姿が、神様っぽかった

賢者のString
こちらもApple様の登壇。Swiftの文字列はどのような点に注意して作られているか、どのように進化したか、そしてあなたの手でどう進化するか、丁寧に語られていました。自分の手でStringにcommitしたくなるような登壇でした

Swiftでソーシャルネットワークをつくろう
Server-side Swiftの活用について、kituraを使ったスムーズなDemoがとても印象的でした。みんな、Server-side Swiftって言ってるけど、実際プロダクトに使えんの???というところにも踏み込んでいます。自分はハッカソンが好きなので、そういう場でまずは活用してみたいなと思いました。

最後に

楽しかったです!
運営のみなさま開催ほんまにありがとうございました🙏

この記事が気に入ったらサポートをしてみませんか?