Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード

2017-11-28

「iOS 11 Programming」を共著で執筆しました/本書のおすすめポイント

昨日、共著で執筆したiOSの技術書「iOS 11 Programming」の販売が開始されました!


iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する


私は ARKit と Metal の章の執筆を担当しました。


7月頭のクラウドファンディング成立を機に執筆を開始し、脱稿まで約4ヶ月。技術書の執筆期間としては長くはないですが、がんばりました。基本的に週末はほぼ執筆、有休は使い果たしましたし、どこかに出かけてもずっと執筆してました。


f:id:shu223:20171118154230j:image:w500

(こういう箱に入って届きます。装丁カッコイイです)


本記事では自分の担当章を中心に、「iOS 11 Programming」を紹介させていただきます。


第2章: ARKit

ARKitは、ちょっと試すだけなら超簡単です。APIはシンプルだし、Xcodeのテンプレートからサクッと動くものがつくれます。


しかしまた、ものすごく奥深くもあります。レンダリングはSceneKitやMetalと組み合わせられるので、これだけで3Dプログラミングのほぼあらゆるテクニックが使えるということになりますし、カメラからの生の入力データ`CVPixelBuffer`にもアクセスできるので、Core Image, Core ML, Vision, OpenCV, GPUImage, etc…と組み合わせて、シーケンシャルな画像を入力とするあらゆるテクニックを駆使できるということにもなります。ARKitが検出している特徴点データにもアクセスできます。


そんな手軽さも奥深さも兼ね備えるARKit、ネット上ではiOS 11の正式リリースを待たずして多くのデモが公開され、開発者の間だけではなく一般ユーザーの間でも話題になっていました。


f:id:shu223:20171128084826j:image:w600

(ARKitで巻尺のように実寸を測るデモ動画)


本章では、そういったARKitの「超簡単な導入」から始めて、最終的にはネットで話題になっていたようなアイデアを実装できるようになるところまでをカバーするように構成しました。

  • 2.1 はじめに
  • 2.2 ARKit入門その1 - 最小実装で体験してみる
  • 2.3 ARKit入門その2 - 水平面を検出する
  • 2.4 ARKit入門その3 - 検出した水平面に仮想オブジェクトを置く
  • 2.5 ARKit開発に必須の機能
  • 2.6 特徴点(Feature Points)を利用する
  • 2.7 AR空間におけるインタラクションを実現する
  • 2.8 アプリケーション実装例1: 現実空間の長さを測る
  • 2.9 アプリケーション実装例2: 空中に絵や文字を描く
  • 2.10 アプリケーション実装例3: Core ML + Vision + ARKit
  • 2.11 Metal + ARKit

最初の「ARKit入門」では、はじめの一歩として、最小実装でARKitを体験します。実にシンプルな実装で強力なAR機能が利用できることを実感していただけることでしょう。


その後は平面を検出する方法、その平面に仮想オブジェクトを設置する方法、そしてその仮想オブジェクトとインタラクションできるようにする方法…と、読み進めるにつれて「作りながら」引き出しが増えていき、最終的にはARKitを用いた巻尺(メジャー)や、空間に絵や文字を描くといったアプリケーションの実装ができるようになっています。


f:id:shu223:20171128085004j:image:w600

(本章で作成するサンプル)



ARKitのAPIはシンプルとはいえ、リファレンスだけから実装方法を汲み取るのは難しい部分もあります。またAppleのサンプルは動かして試してみたり、ちょっと改変してみたりして用いる分にはいいですが、実装内容は結構複雑で初心者には意図がわかりにくいものになっている面があります。

  • ARKitには興味があるけどなかなか手を動かせていない
  • 公式サンプルを動かしただけで止まっている
  • どこから始めていいかわからない

といった方には、本章は合っているかなと思います。



一部だけですが、PEASKの本書のページサンプルPDFを読めるので、気になった方はぜひ試し読みを。


第13章: Metal

クラウドファンディング当初は「Metal 2」と題されており、iOS 11のMetalの新機能の紹介を中心とするような章タイトルでしたが、そもそもほとんどのiOSエンジニアがMetalのAPIを自分でたたいて何かを書いたことがないであろう中で新機能についても仕方がないのでは・・・と考え、がっつりMetalの基礎から書きました。

  • 13.1 はじめに
  • 13.2 Metalの概要
  • 13.3 Metalの基礎
  • 13.4 MetalKit
  • 13.5 Metal入門その1 - 画像を描画する
  • 13.6 Metal入門その2 - シェーダを利用する
  • 13.7 Metal入門その3 - シェーダでテクスチャを描画する
  • 13.8 ARKit+Metalその1 - マテリアルをMetalで描画する
  • 13.9 ARKit+Metalその2 - MetalによるARKitのカスタムレンダリング
  • 13.10 Metal 2
  • 13.11 Metalを動作させるためのハードウェア要件

正直なところMetal 2の機能紹介は多くはありません。なので、従来のMetalについて熟知し、iOS 11での変更点を中心に知りたい方には物足りないかもしれません。


しかし2017年11月現在、Metalについての日本語でのまとまった情報はこれが唯一かと思います。そして、OpenGLやDirectXでGPUに近いレイヤでのグラフィックスプログラミングに親しんで「いない」人達にはMetalはかなりとっつきにくいと思うのですが、そういう方達にとってのわかりやすさにおいては英語の情報ソース含めても随一なのではないかなと勝手に自負しております。


なぜなら、他のMetalについての書籍はそういう方面での経験が豊富な著者が書いている一方で、本書の場合、そのあたりにほとんど知見がなく、四苦八苦しながら勉強した僕が書いたからです(胸を張って言うことではないですが)。「グラフィックスプログラミングの達人による解説」ではありませんが、同じ目線で苦労した人による「わからないところがわかる」解説にはなってるのではないかなと。



具体的には「Metalの基礎」「入門その1〜その3」。ここは、新しい事項が一気にブワーッと出てこないように、かなり苦労して解説する内容を精査し、順序を考えました。ブリットコマンドエンコーダから解説するMetalの書籍(記事も含め)はあんまりないんじゃないかなと。普通はレンダーコマンドエンコーダから始めることが多いのですが、シェーダを使うと「初心者にとってのおまじない」が爆発的に増えるのです。


そして、それでも「新しい概念」はたくさん出てくるので、本書ではそのへんを「なにをやっているのか」「なぜこの手順が必要なのか」ということがわかるように解説して、納得感を得ながら前に進められるようにしています。


(本書の執筆の真っ最中、iOSDC 2017にてMetalについて「興味ない人向けに」解説したときの動画です。『まったくMetalさわったことないけどわかった』という感想を多くいただきました)





PEASKの本書のページのサンプルPDFは他の章は基本的に冒頭2ページの公開となっていますが、Metalの章は僕個人の希望で5ページ読めるようにしていただいてます。Metalが気になる方はぜひ試し読みしてみてください。


全体のPR

ここから本書全体の話。まず、各執筆陣の素晴らしさと、その担当章の組み合わせの妙については以前に書いた記事をご参照ください。


各章のご紹介は著者様ご自身での記事にお任せしつつ、ここで僕が声を大にして言いたいことは、


本書はiOS 12, 13, 14...が登場しても価値を持ち続ける


ということです。


なぜかというと、多くの章で、他の書籍には載っていない、あるいはググってもまとまった情報は見つかりづらい内容について解説しているからです。


  • 第1章 iOS 11 概要
  • 第2章 ARKit
  • 第3章 Core ML
  • 第4章 Swift 4の新機能とアップデート
  • 第5章 Xcode 9 の新機能
  • 第6章 Drag and Drop
  • 第7章 FilesとDocument Based Application
  • 第8章 レイアウト関連の新機能及び変更点
  • 第9章 Core NFC
  • 第10章 PDF Kit
  • 第11章 SiriKit
  • 第12章 HomeKit入門とiOS 11のアップデート
  • 第13章 Metal
  • 第14章 Audio関連アップデート

たとえばHomeKitの章。長らく謎に包まれていたHomeKit、対応デバイスもなかなか登場しなかった当然それについて書かれた書籍もありませんでした。そしてポツポツとデバイスが出揃ってきた今、満を持しての所さんによる56ページに及ぶ入門〜実践の解説!他の章に用がなくてもHomeKitに興味がある人はこの本はずっと「買い」です。


岸川さんによるSiriKitの章も、以前からあるフレームワークでありつつ「動作のしくみ」から解説されていますし、僕の書いたMetalの章も新機能だけじゃなくて基礎から解説しています。


Core ML、Core NFC、PDF Kit、MusicKit、ARKitといった新フレームワーク、Drag and Drop等の新機能も、まとまった解説は現時点では(そして恐らく当面の間)本書でしか得られないのは同様でしょう*1


しかも、著書やカンファレンスでの講演に定評のある著者陣による執筆です。たまーに見かける、APIリファレンスを翻訳しただけのような、あるいはさわりをちょろっと解説しただけみたいな章はひとつもありません。それぞれが興味深く読めて、ちゃんと頭に入ってきて、実際の現場で役立つように各著者によって噛み砕かれ、再構成されています。


ひさびさに出た「非入門者向け」の「iOS SDK解説書」*2にして、かなりの良書では、と思います。



謝辞

ARKit、Metalの章ともに、同僚登本さんにチェックしていただきました。というかそもそも(ARKitで大いに必要となる)3Dプログラミングの基礎は彼から教えてもらいました。またMetalの章は後藤氏にもチェックしていただきました。Metalのレビューをお願いできる人はなかなかいないので非常に助かりました。改めてお礼を申し上げます。


また非常に精密な校正をしてくださった加藤さん、このお話をくれて、完成まで導いてくれたPEAKSの永野さん、共著者のみなさま、クラウドファンディングで購入してくださったみなさま、アーリーアクセスでコメントいただいたみなさま、どうもありがとうございました!


そして本書について知らなかったけどちょっと気になってきた、というみなさま。本書はPEAKSのサイトで購入可能です:


iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する


何卒よろしくお願いいたします。


*1:世界的に有名な某iOSチュートリアルサイトが発行しているiOS 11本を実際に購入してARKitの章を見てみましたが、結構さわりだけな印象だったので、英語/日本語という違いを抜きにしてもこちらの方がいいのでは、と個人的には思っています

*2:言語の解説書ではなく、という意味

2017-10-30

iOSDC2017で「飛び道具ではないMetal」という話をしました #iOSDC

9月15日〜17日の3日間にわたって開催された iOSDC Japan 2017 にて、「飛び道具ではないMetal」と題して登壇させていただきました。


発表資料はこちら・・・と普段ならここでスライドを貼るところですが、その前に、「あーMetalね。関係ないや」と思われた方。今回はむしろそういう方向けです。MetalのAPIを直接たたくことはなくても、UIKitの下回りでもMetalが使われていて、間接的に誰もがMetalの恩恵を受けています。今日はお祭りなので、そんなMetalにちょっと目を向けてみませんか・・・と、そういう内容です。「Metalをさわったことない人が、Metalについてわかった気になれる」というところをゴールとして設定して発表を構成しました。(そういう切り口でもないと、誰も興味がない話になってしまうので。。)




CfPに書いた内容はこちら。

WWDC17でもMetalのセッション会場は閑古鳥が鳴いてました。Metalって3Dゲームとかカメラアプリとかのトリッキーなエフェクト用でしょ、うちには関係ないなぁ・・・と思われている方も多いかもしれません。しかし、UIKitの下回りもMetalですし、色んな所で実はMetalは暗躍しています。そんなMetalにもっと多くの開発者に興味を持ってもらうため、非ゲーム・非カメラアプリ開発者にも関係しそうな切り口からMetalやGPUについて紹介してみたいと思います。


以上、前置きが長くなりましたが発表資料はこちらです。




今日公開されたばかりの動画がこちら。たった15分の短い発表なので、ぜひ見てみてください。



当日の様子・いただいた感想

絶対みんなこっち見に行くだろーっていうセッションが裏にあり、コアなMetalユーザがパラパラと来るだけだったらどうしよう・・・と思ってたのですが、ありがたいことに多くの方に来ていただけました。




こういう反響をいただきました。







あとNextstep.fmというPodcastで、sonson氏が『Metal書いたことなかったけど、「こういう感じなんや―」っていうのがわかってよかった』と言ってくれてました。



多くの方に期待した感じで伝わったようで良かったです。


お知らせ1: Metalについて書いた本が出ます!

ARKitの章とMetalの章を担当しました。


Metalの章は、新機能というよりどちらかというとゼロから入門するところに力を入れて書いています。また別記事で詳しく書きたいと思います。今日か明日にでもクラウドファンディングで購入された方々にはβリリースされて、近いうちに一般販売開始とのことです。


お知らせ2: try! Swift 2018に登壇します!

本日発表になりましたが、ついに念願かなって来年のtry! Swiftに登壇させていただくことになりました。


f:id:shu223:20171030085505p:image:w600


あと4ヶ月、ネタを推敲して臨みます!


2017-08-30

コロラド州デンバーで開催されたiOSカンファレンス「360|iDev 2017」に登壇した話 #360iDev

今月の8月13日〜16日にかけて、アメリカ合衆国コロラド州デンバーにて開催された「360|iDev 2017」にて登壇してきました。


Shuichi Tsutsumi

(発表中の様子)


トークのタイトルは "Deep Learning on iOS" で、スライドはこちら。



持ち時間が45分もあったので、スライドの内容プラス、トークの序盤・終盤でライブデモを2つ(配布されているモデルを使用した一般物体認識/自分で学習させたモデルを使用したロゴ認識)実施しました。



360 iDev カンファレンスについて

raywenderlich.com の毎年の恒例記事 "Top 10 iOS Conferences" に3年連続でエントリーしている、歴史と由緒あるカンファレンスです。



参加人数は今年は250人程度とのこと。



開催場所のコロラド州デンバーは、カリフォルニアから東に行った、アメリカのちょうど真ん中あたりにあります。


f:id:shu223:20170831034407j:image:w400


登壇の経緯

相変わらず招待されたとかではなくて、4月に出したCfPが採択されての登壇でした。今年の3月にtry! Swift TokyoのLTで話した内容 *1 の完全版をどこかでやりたくて、応募しました。



ちなみに今年のCfPはいまのところ4つのカンファレンスに応募して、3勝1敗(通った: try! Swift, 360iDev, iOSDC, 落ちた: UIKonf)です。


カンファレンスの様子

スピーカーは飛行機代が出るのと、会期中のホテルはカンファレンスが用意してくれます。


開催前日の夜はスピーカーディナー。


360iDev Speaker Dinner

(写ってないように見えますが、写ってます。。)


スピーカーディナーは今までちょっと苦手意識があったのですが、今回はAltConfのオーガナイザーやってて僕のことを覚えててくれた人や、日本語勉強してて僕のブログを読んでくれている(!)人、ベルリンのカンファレンスで同じくスピーカーだった人とかもいて、今回は非常に楽しめました。



会場はホテル内にあり、最大4トラックが同時進行します。


360iDev_20170814_8536

(ゲストスピーカー用の一番広い会場)



SlackにはポケモンGOチャンネルやNintendo Switchでマリオカートやるチャンネルとかもありました。


f:id:shu223:20170830194636j:image:w400

(会場から届くとこにフリーザーが出たのでみんなで狩るの図 )



ランチのシステムがユニークで、カンファレンスでもらえるバウチャー持って、フードトラックが集まる公園まで行って、自分で好きなのを注文して食べる、という形式。


f:id:shu223:20170830194757j:image:w600


観光にもなるし、会場の外の空気を吸えるので非常にいい仕組みだと思いました。



こちらはスポンサーブースでももらった、Firebaseのハンドスピナー、ホットソース、ウッドステッカー。


f:id:shu223:20170830195001j:image:w400


ハンドスピナーは(置いて回すときは)回転中もロゴが見えるし、色で個性も出しやすいので企業やサービスのグッズとしては結構いいのではないでしょうか。



僕の出番は2日目のランチ前。


f:id:shu223:20170830195157j:image:w400

(いよいよ次…)



出る直前はソワソワしましたが、話し始めたら緊張は忘れて、練習時よりもうまくしゃべれたと思います。

Shuichi Tsutsumi


Shuichi Tsutsumi


デモもうまくいったし(バックアッププランもたくさん用意しておいた)、終わった後「良かったよ」と声もかけてもらえました。


ただ正直な所、今回のトークの「内容」については100%最高と思える所まで持っていけたとは思ってなくて、悔やまれる部分もあります。そこらへんは結局のところ自分の準備不足、努力不足に帰結するので、今後精進します。(詳しくは後述)



まぁそんなわけでちょっと発表内容については勝手に凹んだりしてたのですが、かの世界的に有名なiOSチュートリアルサイト "raywenderlich.com" の『360|iDev 2017 Conference Highlights』(360iDevのハイライト)という記事で、なんと僕のセッションが紹介されてました。


f:id:shu223:20170830204903j:image:w400


"Can't miss"(必見!)と書いてあったので、嬉しかったです。


準備段階での悩み

今回は悩みまくりました。CfPを出した時点では、WWDC17開催前で、つまりCore MLの発表前で、Metal Performance Shaders の CNN API (MPSCNN) 使って実際にiOSデバイス上でGPU AcceleratedでCNN走らせてる人って当時はあまりいなくて、情報もものすごく少なかったので、まだ価値があったわけですよ。


それが、Core MLが発表されて、MPSCNNのレイヤーを直接たたく意味はあまりなくなってしまった。敷居がグッと下がって、注目度がバーンと上がって、プレイヤーもドッと増えて。


Core ML使うとiOS側の実装云々よりもほとんど機械学習側での知見と努力がモノを言うのだけど、Courseraのコースやっただけの自分はまだ人様に講釈するようなレベルではないし。。


悩みに悩んで、

  • MPSCNNであればiOS 10でも使える
  • BNNSとの使い分け
  • Core ML+Visionはどこをどう簡単にしたか
  • デモ

という話で構成しました。こういう切り口としては、わかりやすく、かつ理解と興味がつながっていくようにうまく説明できたと思います。



ただ、try! SwiftでのLT含め、そもそもの僕がこの分野でプライベートの時間を使って勉強したり勉強会やカンファレンスで登壇したりしてきたのは、「いろいろと革新的で面白いことができそう」というワクワク感からで、ここをほとんど「実践」できないまま登壇して、結果的に自分のトーク内容にもその「ワクワク感」があまりこめられなかったなと。理想的には、もっと色々な実案件をやったり大量のデモをつくってみたりして、そういうのを紹介しつつ、どう、おもしろそうでしょう、というところから話を展開したかった。WWDCの発表で大幅に当初の思惑が狂ったとはいえ、既存の知見をこねくりまわしてどう発表に落とし込むかに準備時間の大半を使ってしまったなと反省しています。


その後のデンバー滞在/リモートワーク

生まれて初めてのデンバー行きで、「この広いアメリカ、同じ場所をもう一度訪れるチャンスはそうそうないかもしれない」と思い、滞在を1週間ほど延長して、リモートワークしてました。これが最高に良かったのですが、facebookに日々色々と書いてたのでここでは割愛します。


f:id:shu223:20170830202708j:image:w400

(皆既日食中のデンバー)


おわりに

360iDev登壇、デンバーの旅、反省点も含め、非常に良い経験になりました。これもあって執筆が遅れていたのですが、今必死で巻き返しております・・・!



*1:LTは5分だったので、具体的なことはほとんど何も説明できなかった

2017-07-25

Core ML vs MPSCNN vs BNNS #fincwwdc

昨日FiNCさんのオフィスで開催された「WWDC2017振り返り勉強会」で『Core ML vs MPSCNN vs BNNS』というタイトルでLTしてきました。



iOS 11で追加されたCore MLが非常に注目を集めていますが、「既存の機械学習フレームワークを使って学習させたモデル(のパラメータ)をiOS側に持ってきて推論を実行する」ということ自体はiOS 10からあって、そこに不便さがあったので広まらず、Core MLでやっと使われるようになった、という側面はもちろんありつつも、いややはりそれでも単にそういうことがiOS 10できるようになったということ自体が知られていなかっただけなのではと。




確かに自分も Metal Performance Shaders のCNN APIを用いた機能を実装しようとしたときに、情報があまりに少なく、何ができて何ができないのか、どうやるのかがよくわからなかった、ということがありました。


で、そのへんをシンプルに説明したら、もっと興味をもつ人も出てくるんじゃないかなと思い、実装手順を3ステップで解説してみました。


  • Step 1: モデルをつくる

f:id:shu223:20170725070344j:image:w600


  • Step 2: ネットワークを実装する

f:id:shu223:20170725070345p:image:w600

f:id:shu223:20170725070347p:image:w600


  • Step 3: 推論の実行処理を書く

f:id:shu223:20170725070346p:image:w600



意外と簡単そう/使えそうではないでしょうか?



ところが・・・


f:id:shu223:20170725070348p:image:w600


f:id:shu223:20170725070349p:image:w600


っていうつらさがあり、他にも色々と面倒な点があり、やっぱりCore ML & Visionのおかげで各段に便利になった、という話でした。



最後にAccelerateフレームワークのBNNSの使いどころについてWWDC17のMetal Labで聞いた話が出てきます。


f:id:shu223:20170725073011p:image:w600



(登壇の様子 by yucovin さん)


なぜこの話をしたのか

上の説明だけを読むとまるでMPSCNNの普及活動をしている人みたいですが、動機はそこではなくて、来月登壇する アメリカのiOSカンファレンス で、"Deep Learning on iOS" というタイトルで発表することが決まっていて、


f:id:shu223:20170725070350p:image:w600


で、これってWWDC17開催前にCfPを出して通ったやつなので、応募当時はMPSCNNの話をするつもりだったのに、Core MLが出てしまって事情が変わってしまった、どうしよう、という。。


じゃあCore MLの話をすればいいじゃん、と思うかもしれません。その通りかもしれません。でも僕自身がまだあまり試せてないのと、Core MLの場合はiOS側が便利になりすぎてむしろ機械学習フレームワーク側(Kerasとか)がメインになるけどそっちは初心者とすらいえないレベルだし、ってことでMPSCNNの方に解説を寄せよう、という試行錯誤の中で「こんな切り口はどうだろう」と考えたのが昨日の発表なのでした。


実際に話してみて、正直なところコレジャナイ感はちょっとありました。もうちょっとワクワクする感じにならないか、実例とかデモとかを増やす感じでブラッシュアップしてみようと思ってます。(来月のカンファレンスは発表時間が45分もあるので、個々の解説ももうちょっと丁寧にやる予定)


おわりに

WWDCには参加したものの、そのままアメリカにいたのでこういう振り返り勉強会に参加できず(※例年勉強会発表ドリブンで新APIを勉強していた)、あっちではこういうLTで気軽に登壇できる勉強会もあまりないので、1ヶ月後というわりとWWDC勉強会としては珍しいタイミングで開催された本イベントは大変ありがたかったです。


LTですが非常に中身の濃い発表が多く、勉強になりました。懇親会で出てくる料理もさすがFiNCさん、ヘルシーで美味しいものばかりでした。どうもありがとうございました!


追記:BNNSについていただいたコメント

Facebookでsonsonさんからコメントいただきました。


f:id:shu223:20170725124035p:image:w400


BNNSとMPSCNNの使い分けは,難しいけど,電力と計算スピードのバランスかなぁと思います.


あと,GPUのメモリとCPUのメモリ間の転送に時間がかかるので,オーバーヘッドをカバーできるくらい,データや計算量大きくないと,GPUは意味ないでしょう.

BNNSは,SIMDなので,これも当然CPUのコンテキストスイッチのためのオーバーヘッド(ノーマルモードとSIMDモードの切り替え)があるのですが,GPUほどではないので,小さいネットワークだとGPUよりBNNSの方が速いというのはありそうです.


まぁ,なんで,電力と速度の限界に挑戦する場合は,ベンチマークとって極限を目指そうって感じですかねw


なるほど、単に「CNNの計算はGPUが向いてるでしょ」とか「Appleの人も言ってた」とかってだけでBNNSのことは忘れようとか言ってちゃいけないですね。確かにGPU↔CPU間の転送速度のボトルネックとGPUによる高速化がどれぐらい見込まれるかのバランスによる、というのは非常に納得です。また「SIMDモードへの切り替えのオーバーヘッド」(はあるがGPUとの転送ほどではない)というあたりもまったく考慮できてなかったところです。


CPU、GPUの負荷がそれぞれどれぐらいか、というのはXcodeで簡単に見れますが、GPU↔CPU間の転送状況を見る方法もあるのでしょうか?GPUまわりの計測・デバッグ手法はもうちょっと勉強したいところです。


ちなみにsonsonさんは例の(私も参加させていただく)クラウドファンディング本で「Core ML」のパートを担当されます。


7/28まで買えるみたいなのでまだの方はぜひご検討を!


2017-06-07

【iOS 11】ARKitについてWWDCのラボで聞いてきたことのメモ

iOS 11から追加された、AR機能を実装するためのフレームワーク「ARKit」についてWWDCのラボ(Appleのデベロッパに直接質問できるコーナー)で聞いたことのメモです。注目のフレームワークなので行列ができてましたが、丁寧に色々と教えてくれたので、忘れないうちに書いておこうと思います。


f:id:shu223:20170608032933j:image:w600

(WWDCセッションスライドより)


既存実装とどう共存させるか?

先日の記事にも書いたのですが、今働いている会社のアプリ「Fyuse」はスマホで3D的な写真を撮るアプリで、その撮影を補助するために、撮影対象の周囲に3Dの「ARガイド」を表示するという機能をAVFoundation+Metal+SceneKit+独自の画像処理ライブラリ(トラッキング等)で実装しました。


f:id:shu223:20170606094825g:image


ARKitを使うとなると、要iOS 11以上、要A9以上のプロセッサという条件を満たす必要があるわけですが、当然2017年現在では多くのアプリはこれよりもっと広いiOSバージョン、iOSデバイスをサポートしたいはずです。


で、まず聞いたのは、そういう既存実装とARKitを共存させるのに、

if <# iOS 11以上 #> && <# A9以上 #> {
    // ARKitを使う実装
} else if <# 既存実装を使う条件 #> {
    // 既存実装
} else {
    // それ以外
}

みたいなのを避ける方法があったりしませんか?と。



回答:ない。ARKitを使うにはiOS 11以上、A9以上が必要だ。



・・・はい。そりゃそうですね。変な質問してすみません。でもせっかく来たので食い下がって聞いてみました。


「他のAR利用アプリもiOS 10以下はまだ切れないと思うけどみんなどうしてるの?たとえばポケモンGoとか」



回答:知らない。



・・・はい。そりゃそうですよね。(もし知ってても言えないですしね)



既存実装と比較したARKitのアドバンテージは何だと思うか?

質問が悪かったので、「じゃあ既に実装が済んでいて、ARKitを使うとなると既存実装にプラスしてバージョンわけが必要というデメリットがありつつ、それでもARKitを使う理由はあるのか」という観点から、我々の既存実装と比較したARKitを使うメリットについて聞いてみました。



→ 回答:

  • Appleの純正フレームワークは公開APIよりもっと下のレイヤーを利用した実装ができるので、サードパーティ製の実装よりもハードウェアに最適化されている。よってバッテリー消費量や処理速度の面で優れていると考えられる
  • ユーザーがタップしなくても、ARのセッションを開始した時点でシーンの解析が完了している(これは厳密には我々の用途にとってはアドバンテージではないが、「違い」ではある)
  • デバイスの姿勢も考慮してキーポイントを抽出してるので、デバイスを動かすと云々(すみません、実はこのへんちょっとよくわかりませんでした)

結局のところ、ARのシーンとしてはどういうものが検出できるのか

我々の要件としては、水平面に何かを置きたいわけじゃなくて、対象オブジェクトを囲むように3Dノードを表示したいわけです。


f:id:shu223:20170606094825g:image


ところがARKitは検出した床やテーブル等の水平面に何かを置く実装しか見当たらないので、「こういうのってARKitでできるの?」ということを聞いてみました。



で、回答としては、今のところ「水平方向」(horizontal)の「平面」(plane)しか検出しないそうです。


`ARPlaneAnchor.Alignment` というenumがありますが、実はまだ `horizontal` という要素ひとつしかなくて、`vertical` というのはまだありません。つまり壁のような「垂直方向の平面」を検出したり、我々のアプリのように人間や銅像や動物といった任意のオブジェクトを検出したり、そういうことは現状ではサポートしてないようです。


なので、ポケモンGoのようにキャラクターの3Dモデルを表示するタイプのARにはいいですが、我々のアプリのような用途や、実世界のものに合わせて何か情報を表示したり、みたいなタイプのARにも現状では向いてなさそうです。



どういう水平方向の平面が認識されるかについても教えてくれたのですが、ある程度の大きさが必要で、たとえばイスの座面は十分な広さがあるので水平面として検出されるが、背もたれの上(伝わりますかね?)みたいな狭いものは水平面としては検出されないと。



ただもう一つ提案として言ってくれたのは、検出したキーポイントはAPIから取れるので、それらを使って自分で垂直方向の面なり何なりを再構成することならできる、と言ってました。これはありかもしれません。


深度情報は使用しているのか?

たとえばiPhone 7 PlusのようにDepth(デプス/深度)を取れるようなデバイスの場合、それを使ってより精度良く検出するような処理を内部でやってたりするのか?ということを聞きました。



回答:使ってない



普通のカメラだけで精度良く動くようなアルゴリズムになっていて、デバイスによる処理の差異はないそうです。


おわりに

結論としては、我々の用途には今のところは合ってなさそうです。が、今後のアプリ開発の可能性を広げてくれる非常におもしろいフレームワークであることには代わりはないので、プライベートでは引き続き触っていこうと思っています。


2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |