iOSではじめるフォトグラメトリ #iOSDC

26.7K Views

September 03, 23

スライド概要

iOSDC 2023での発表スライドです。

プロポーザル: https://fortee.jp/iosdc-japan-2023/proposal/31781f59-2e99-48f0-ba0e-db04590c24c4

profile-image

フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

iOSではじめる フォトグラメトリ 堤 修一 @shu223 iOSDC 2023

2.

自己紹介 • 堤 修一 • @shu223 (GitHub, Qiita, Zenn, note, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):

3.

• 1年間研究開発部のマネージャーにチャレンジ • 12年間iOSだけやってきたエンジニアのキャリアチェンジ • 2023年6月からエンジニアに復帰 • マネージャーからエンジニアに戻ります • いまやってること • BLEを用いた名刺交換機能をプロダクト向けに実装中

4.

過去のiOSDC登壇動画もぜひ (おすすめ順) 1. 飛び道具ではないMetal(2017) 2. Depth in Depth(2018) 3. 海外カンファレンスに登壇する(2016) 4. 機械学習のブルーオーシャン Core ML(2020) 5. 今こそwatchOS(2019)

5.

アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編

6.

アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編

7.

写真から3Dモデルを生成する技術

8.

デモ

11.

フォトグラメトリの原理 オーバーラップするよう連続的に撮影

12.

重なり合う特徴から写真位置推定 → 点群生成 → メッシュ生成

13.

「3Dモデル?ゲーム制作用でしょ?」

14.

15.

ユースケース: 従来の写真の置き換え カメラでの撮影機能/画像表示機能を持つサービスすべてが ユースケース(となる可能性) • 商品写真 • レストランの店内写真 • ユーザーアイコン(c.f. Spatial Computing)

16.

話さないこと • APIの「使い方」は最小限に • 記事で補完 • プロ用の撮影機材を使った本格的なフォトグラメトリの話 • なるべくiOS/macOSの技術だけを使う • 既存アプリを使ったフォトグラメトリの話

17.

本日のゴール 改善の試行錯誤を通じて、本質的・汎用的な「フォトグラメト リの勘所」を理解する

18.

アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編

19.

Object Capture • Appleは3Dスキャンのことをこう呼んでいる • Image Capture API (撮影) + Reconstruction API(3D復 元)

20.

Image Capture API • iOS 17の新API • 素人でも簡単に高品質に撮影できる UI/UX

21.

Reconstruction API • フォトグラメトリにより写真から3D モデルを復元 • WWDC21でmacOS向けAPIとして登 場、WWDC23でiOSもサポート

22.

Object Capture APIを用いたフォトグラメトリの実装 let session = try PhotogrammetrySession(input: inputFolderUrl) try session.process(requests: [.modelFile(url: outputFile)]) • 最小実装はたったの2行! • PhotogrammetrySession の初期化 • process(requests:) メソッドを呼ぶ

23.

Reality Composer Pro • Object CaptureのReconstruction API をアプリ化したもの • Xcodeに同梱 • 画像フォルダをドラッグ&ドロップ → ボタンぽちでOK

24.

アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編

26.

• 「オブジェクト」ではなく「空間」 の3Dモデル化 • iPhoneで撮った動画を元にしている らしい(本来は高価なプロ用撮影機 材を使う) • 3DF Zephyr(Windowsのみ・有料) というソフトを使用しているらしい → Object Capture で同様のフォトグ ラメトリは可能か?

27.

フォトグラメトリ with Object Captureの課題 • 動画からの入力をサポートしていない • 「オブジェクト」キャプチャーと謳っており、「空間」は復 元できない可能性 • 3DF Zephry, Reality Capture, Metashapeといった著名な有料 ソフトと比較して界隈での利用実績がほぼない

28.

動画からのフォトグラメトリ Object Capture APIもReality Composer Proも動画を入力とする ことはできない → 動画のフレーム画像を抽出するアプリを書いた let generator = AVAssetImageGenerator(asset: asset) generator.generateCGImagesAsynchronously(forTimes: times) { requestedTime, cgImage, actualTime, result, error in ...

29.

撮影した動画 • iPhone片手持ちで撮影 • 通常モード • 広角(0.5)

30.

フレーム抽出結果 • 一定時間間隔で抽出

31.

フォトグラメトリ実行

33.

テクスチャが汚い

34.

問題: 抽出したフレームがブレブレ • テクスチャの品質が下がる • メッシュ品質にも影響がでる

35.

ブレの少ないフレームを選んで抽出する ラプラシアンフィルタを用いたブレ度合いの判定 1. MPSImageLaplacian でラプラシアンフィルタを画像に適 用し、エッジ部分のコントラストを強調 2. MPSImageStatisticsMeanAndVariance で画像の分散 を計算 • ブレている画像は2の値が低くなる 2 これを考慮し、単純なしきい値処理でなく、前後フレームの値と比較して採用不採用を決定するロジックにした。

36.

ブレ度合い判定結果 分散値: 80(低い)

37.

ブレ度合い判定結果 分散値: 365(高い)

38.

ブレ検出はうまくいってそう

39.

フォトグラメトリ実行

40.

結果(デモ)

41.

テクスチャも(やや)きれいになった メッシュの復元度も改善

42.

元動画の改善

43.

iPhoneでフォトグラメトリ用の動画を撮るコツ • 横向き • 広角 • アクションモード • 明るさの制限が厳しい

44.

撮影した動画 • iPhone片手持ち撮影 • 広角 • 横向き • アクションモードON

45.

フォトグラメトリ実行

46.

結果(デモ)

48.

• ❌ ⭕ 壁や地面の再現度はかなり良い • 「空」にメッシュが生成され、テ クスチャが貼られている

49.

「空」の問題 空の部分にメッシュが作られないよう、 除外したい

50.

フォトグラメトリとマスク 3D復元処理に使用しないピクセルを 「マスク画像」を与えることで指定でき る

51.

Core MLを利用して「空マスク」を生成 セグメンテーション結果 から空マスクを生成 3 3 モデルは DANet を利用。(モデル選定の詳細: Core ML セグメンテーションモデルの比較 )

52.

PhotogrammetrySession にマスクを渡す実装 1/2 PhotogrammetrySample を利用する // PhotogrammetrySampleの初期化 let pixelBuffer = createPixelBuffer(from: inputImage) var sample = PhotogrammetrySample(id: index, image: pixelBuffer) // マスク画像をobjectMaskプロパティにセット let maskPixelBuffer = createMaskPixelBuffer(from: maskImage) sample.objectMask = maskPixelBuffer

53.

PhotogrammetrySession にマスクを渡す実装 2/2 PhotogrammetrySample を利用する // PhotogrammetrySamples から PhotogrammetrySession を初期化 session = try PhotogrammetrySession(input: samples, configuration: configuration)

54.

マスク画像のフォーマット • 元画像と同じ幅・高さ • ピクセルフォーマットは kCVPixelFormatType_OneComponent8

55.

フォトグラメトリ結果(デモ)

56.

空部分の不要なメッシュは除去できた

57.

アプリケーションへの組み込み • 3Dモデルの中を歩くようなアニメーション(SceneKit)

58.

さらに改善できるポイント • 空マスク生成においてセグメンテー ション後にmatting処理 4 • フレーム抽出においてカメラの移動 量を考慮する • Geometryの指定 4 画像は https://twitter.com/nobelchoco/status/1137308632914255874 より。

59.

その他検証したこと(Q&Aで話しましょう) • Object Captureは画像枚数をどこまで減らせるか • Object Captureで撮影される画像に含まれる情報(関連記 事) • Object Captureフォトグラメトリではどの情報を何に使うか (関連記事) • Metashapeを使ったフォトグラメトリ • Metashape vs Object Capture

60.

(おまけ)visionOSへの組み込み • USDZをRealityKit Content Packageに入れて Model3D ビューで表示するだけ!

61.

まとめ • 3Dモデルのユースケースは無限大 • 写真の代替になり得る • Object Captureを用いたフォトグラメトリの基礎と実践 • 「オブジェクト」のキャプチャー性能は高い • 「空間」も実はそこそこいける • ブレ度合いの判定/撮影のコツ/空マスク

62.

ご清聴ありがとうございました!