2019.07.23

アップルの最先端モバイルAR技術(ARKit3)の新機能ヒューマン・オクルージョンを試してみた

Pocket

はじめに

こにちは、次世代システム研究室のBMKです。
今年の6月頃にアップルの開発者向けイベント(WWDC2019)でアップルの最先端モバイルAR技術(ARKit3)の新機能が発表されました。当日に大変注目された新機能の一つ「ヒューマン・オクルージョン」を試して書きます。

ヒューマン・オクルージョンとは

AR空間で人間の存在を認識し、仮想コンテンツを人間の背後に レンダリング(表示)することを可能にすることを指します。
従来のAR技術のデフォルトは仮想コンテンツがカメラ画像の上にレンダリングされます。以下の写真のように仮想蓄音機が人間の前にレンダリングされ、人間の背後にレンダリングできないことをAR技術にてオクルージョン問題と呼びます。


左)テーブルの上に仮想蓄音機をレンダリングします。
右)オクルージョン問題発生:仮想蓄音機がいつも人間の前にレンダリングされてしまいます。

機械学習の活用 – ヒューマン・セグメンテージョン

ARKit3は上記の問題を解決するために、機械学習を活用して、各カメラ画像フレームに存在した人々を認識し、それらの人々を表すピクセルだけを取り出し別のバッファ(レイヤー)を作成します。これをヒューマン・セグメンテーションと呼びます。このレイヤーを他のレイヤー(カメラ画像、仮想コンテンツ等)の上にレンダリングしたら、人々がカメラに最も近いことを見えるし、仮想コンテンツを隠すことができます。


右)オクルージョン問題の解決:仮想蓄音機を人間の背後にレンダリングできました。

機械学習(特に深層学習)を用いて写真内ヒューマン・セグメンテーションの研究が盛んで行われて、アップルの方は昨年発表したiOS12からポートレートモードでキャプチャされた写真にヒューマン・セグメンテーションを実施して、写真の背景の置き換えなどのクリエイティブな視覚効果を簡単にできるようになりました。 iOS13は、さらにデバイス上の機械学習を利用して、より高精度のヒューマン・セグメンテーション及び部分的セグメンテーション(髪の毛の部分のみ、肌の部分のみ等のセグ件テーションなど)ができるようになりました。


右)機械学習を用いて写真内にヒューマン・セグメンテーションの実施

ご参照:

https://developer.apple.com/videos/play/wwdc2019/260/

人間と人間の間に仮想コンテンツをレンダリングしたい場合

上記のヒューマン・セグメンテーションだけを使うと仮想コンテンツが写真に存在している全ての人々の背後にレンダリングされ、人間と人間の間に仮想コンテンツをレンダリングすることができなくなります。

本課題を解決するために、ARKit3はもう一つのバッファ(奥行き推定バッファ)を提供します。カメラ写真内セグメント化された人々がさらにカメラに関してどれだけ離れているかを推定し、推定したデータを保存します。ARKit3は機械学習(ディープラーニング)も活用し本推定を行いました。仮想コンテンツをレンダリングする時これらの推定した奥行きデータを参照しレンダリングを行いました。A12チップのニューラルエンジンの力のおかげで本処理はフレーム毎にリアルタイムに行うことができるようになりました。

サポートするiOSバージョン、機種

ヒューマン・オクルージョンなどの今回のARKit3の新機能はiOS13(現在ベータ版)が求めています。また、ヒューマン・セグメンテーション、深度推定等を行うのにニューラルエンジンをサポートするA12チップセット及びTrueDepthカメラを搭載する最新のiOSデバイス(iPhoneXS, iPhoneXSMax, iPhoneXR, iPadPro 2019)が必要となります。

デモ



 

デモの開発環境

  • Xcode バージョン11.0 ベータ版
  • iOS 13.0 ベータ版
  • iPhoneXS
  • Swift 5.1

重要なプロパティと設定

今回のAKit3のARConfigurationにはFrameSemantics(フレームセマンティクス)という新しいプロパティがあります。
フレームセマンティクスは ARKit が現在のARフレームから以下の情報を抽出する時に使います。
  • 2Dボディ検出 (bodyDetection)
  • ヒューマン・オクルージョン(personSegmentation)
  • 推定される奥行き情報を含んだヒューマンオクルージョン (personSegmentationWithDepth)
以下の関数を実行して端末がフレームセマンティクス(FrameSemantics)をサポートしているかどうかを確認することができます。
class func supportsFrameSemantics(ARConfiguration.FrameSemantics) -> Bool
ヒューマン・オクルージョンの実施には二つの選択肢があります。
一つ目はpersonSegmentationです。これは奥行き情報推定無しでヒューマン・セグメンテーションだけを使用します。仮想コンテンツをシーン内の人々の全員の背後にレンダリングしたい場合は最適です。
let configuration = ARWorldTrackingConfiguration() 
configuration.frameSemantics = .personSegmentation
session.run(configuration)
もう一つの選択肢は奥行き推定付きヒューマン・セグメンテーションです。仮想コンテンツを人々が後ろか前にレンダリングしたい場合、この選択肢は最適です。
let configuration = ARWorldTrackingConfiguration() 
configuration.frameSemantics = .personSegmentationWithDepth
session.run(configuration)
viewDidLoadでは、水平面を探してシーンに追加するアンカーエンティティを作成します。
次に、非同期モデルのloadModelAsyncを使用してモデル(仮想蓄音機)のURLを取得してロードします。エンティティをアンカーの子として追加し、シーン内のアンカーのところにモデルをレンダリングします。
override func viewDidLoad() {
        super.viewDidLoad()
        
        do {
            //let vase = try ModelEntity.load(named: "vase")
            let vase = try ModelEntity.load(named: "gramophone")
            // Place model on a horizontal plane.
            let anchor = AnchorEntity(plane: .horizontal, minimumBounds: [0.15, 0.15])
            arView.scene.anchors.append(anchor)
            
            vase.scale = [1, 1, 1] * 0.006
            anchor.children.append(vase)
        } catch {
            fatalError("Failed to load asset.")
        }
    }

簡単なタップでオクルージョンのオンとオフを切り替えるトグルを実装し、デバイスがフレームセマンティクスをサポートしているかどうかを常にチェックし、現在の設定されたヒューマン・セグメンテーションの実施状態をオンかオフにするかの切り替えを判断します。
fileprivate func togglePeopleOcclusion() {
        guard let config = arView.session.configuration as? ARWorldTrackingConfiguration,
            ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) else {
                fatalError("People occlusion is not supported on this device.")
        }

        switch config.frameSemantics {
        case [.personSegmentationWithDepth]:
            config.frameSemantics.remove(.personSegmentationWithDepth)
            messageLabel.displayMessage("People occlusion off", duration: 1.0)
        default:
            config.frameSemantics.insert(.personSegmentationWithDepth)
            messageLabel.displayMessage("People occlusion on", duration: 1.0)
        }

        arView.session.run(config)
    }

まとめ

今回、アップルの最先端モバイルAR技術(ARKit3)が提供している新機能(ヒューマン・オクルージョン)を調べて纏めました。ヒューマン・オクルージョンの問題を解決できることでAR体験はより一つの上のランクに登ってきました。今回に発表されたARKit3の新機能を活用すれば、ARゲームを始め、色々な実用性が高いアプリの誕生を期待できます。

最後に

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。