41.5K Views
September 03, 23
スライド概要
iOSDC 2023での発表スライドです。
プロポーザル: https://fortee.jp/iosdc-japan-2023/proposal/31781f59-2e99-48f0-ba0e-db04590c24c4
フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰
iOSではじめる フォトグラメトリ 堤 修一 @shu223 iOSDC 2023
自己紹介 • 堤 修一 • @shu223 (GitHub, Qiita, Zenn, note, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):
• 1年間研究開発部のマネージャーにチャレンジ • 12年間iOSだけやってきたエンジニアのキャリアチェンジ • 2023年6月からエンジニアに復帰 • マネージャーからエンジニアに戻ります • いまやってること • BLEを用いた名刺交換機能をプロダクト向けに実装中
過去のiOSDC登壇動画もぜひ (おすすめ順) 1. 飛び道具ではないMetal(2017) 2. Depth in Depth(2018) 3. 海外カンファレンスに登壇する(2016) 4. 機械学習のブルーオーシャン Core ML(2020) 5. 今こそwatchOS(2019)
アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編
アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編
写真から3Dモデルを生成する技術
デモ
フォトグラメトリの原理 オーバーラップするよう連続的に撮影
重なり合う特徴から写真位置推定 → 点群生成 → メッシュ生成
「3Dモデル?ゲーム制作用でしょ?」
✋
ユースケース: 従来の写真の置き換え カメラでの撮影機能/画像表示機能を持つサービスすべてが ユースケース(となる可能性) • 商品写真 • レストランの店内写真 • ユーザーアイコン(c.f. Spatial Computing)
話さないこと • APIの「使い方」は最小限に • 記事で補完 • プロ用の撮影機材を使った本格的なフォトグラメトリの話 • なるべくiOS/macOSの技術だけを使う • 既存アプリを使ったフォトグラメトリの話
本日のゴール 改善の試行錯誤を通じて、本質的・汎用的な「フォトグラメト リの勘所」を理解する
アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編
Object Capture • Appleは3Dスキャンのことをこう呼んでいる • Image Capture API (撮影) + Reconstruction API(3D復 元)
Image Capture API • iOS 17の新API • 素人でも簡単に高品質に撮影できる UI/UX
Reconstruction API • フォトグラメトリにより写真から3D モデルを復元 • WWDC21でmacOS向けAPIとして登 場、WWDC23でiOSもサポート
Object Capture APIを用いたフォトグラメトリの実装 let session = try PhotogrammetrySession(input: inputFolderUrl) try session.process(requests: [.modelFile(url: outputFile)]) • 最小実装はたったの2行! • PhotogrammetrySession の初期化 • process(requests:) メソッドを呼ぶ
Reality Composer Pro • Object CaptureのReconstruction API をアプリ化したもの • Xcodeに同梱 • 画像フォルダをドラッグ&ドロップ → ボタンぽちでOK
アジェンダ • フォトグラメトリとは • フォトグラメトリの実装 • フォトグラメトリ実践編
• 「オブジェクト」ではなく「空間」 の3Dモデル化 • iPhoneで撮った動画を元にしている らしい(本来は高価なプロ用撮影機 材を使う) • 3DF Zephyr(Windowsのみ・有料) というソフトを使用しているらしい → Object Capture で同様のフォトグ ラメトリは可能か?
フォトグラメトリ with Object Captureの課題 • 動画からの入力をサポートしていない • 「オブジェクト」キャプチャーと謳っており、「空間」は復 元できない可能性 • 3DF Zephry, Reality Capture, Metashapeといった著名な有料 ソフトと比較して界隈での利用実績がほぼない
動画からのフォトグラメトリ Object Capture APIもReality Composer Proも動画を入力とする ことはできない → 動画のフレーム画像を抽出するアプリを書いた let generator = AVAssetImageGenerator(asset: asset) generator.generateCGImagesAsynchronously(forTimes: times) { requestedTime, cgImage, actualTime, result, error in ...
撮影した動画 • iPhone片手持ちで撮影 • 通常モード • 広角(0.5)
フレーム抽出結果 • 一定時間間隔で抽出
フォトグラメトリ実行
テクスチャが汚い
問題: 抽出したフレームがブレブレ • テクスチャの品質が下がる • メッシュ品質にも影響がでる
ブレの少ないフレームを選んで抽出する ラプラシアンフィルタを用いたブレ度合いの判定 1. MPSImageLaplacian でラプラシアンフィルタを画像に適 用し、エッジ部分のコントラストを強調 2. MPSImageStatisticsMeanAndVariance で画像の分散 を計算 • ブレている画像は2の値が低くなる 2 これを考慮し、単純なしきい値処理でなく、前後フレームの値と比較して採用不採用を決定するロジックにした。
ブレ度合い判定結果 分散値: 80(低い)
ブレ度合い判定結果 分散値: 365(高い)
ブレ検出はうまくいってそう
フォトグラメトリ実行
結果(デモ)
テクスチャも(やや)きれいになった メッシュの復元度も改善
元動画の改善
iPhoneでフォトグラメトリ用の動画を撮るコツ • 横向き • 広角 • アクションモード • 明るさの制限が厳しい
撮影した動画 • iPhone片手持ち撮影 • 広角 • 横向き • アクションモードON
フォトグラメトリ実行
結果(デモ)
• ❌ ⭕ 壁や地面の再現度はかなり良い • 「空」にメッシュが生成され、テ クスチャが貼られている
「空」の問題 空の部分にメッシュが作られないよう、 除外したい
フォトグラメトリとマスク 3D復元処理に使用しないピクセルを 「マスク画像」を与えることで指定でき る
Core MLを利用して「空マスク」を生成 セグメンテーション結果 から空マスクを生成 3 3 モデルは DANet を利用。(モデル選定の詳細: Core ML セグメンテーションモデルの比較 )
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
PhotogrammetrySession にマスクを渡す実装 2/2 PhotogrammetrySample を利用する // PhotogrammetrySamples から PhotogrammetrySession を初期化 session = try PhotogrammetrySession(input: samples, configuration: configuration)
マスク画像のフォーマット • 元画像と同じ幅・高さ • ピクセルフォーマットは kCVPixelFormatType_OneComponent8
フォトグラメトリ結果(デモ)
空部分の不要なメッシュは除去できた
アプリケーションへの組み込み • 3Dモデルの中を歩くようなアニメーション(SceneKit)
さらに改善できるポイント • 空マスク生成においてセグメンテー ション後にmatting処理 4 • フレーム抽出においてカメラの移動 量を考慮する • Geometryの指定 4 画像は https://twitter.com/nobelchoco/status/1137308632914255874 より。
その他検証したこと(Q&Aで話しましょう) • Object Captureは画像枚数をどこまで減らせるか • Object Captureで撮影される画像に含まれる情報(関連記 事) • Object Captureフォトグラメトリではどの情報を何に使うか (関連記事) • Metashapeを使ったフォトグラメトリ • Metashape vs Object Capture
(おまけ)visionOSへの組み込み • USDZをRealityKit Content Packageに入れて Model3D ビューで表示するだけ!
まとめ • 3Dモデルのユースケースは無限大 • 写真の代替になり得る • Object Captureを用いたフォトグラメトリの基礎と実践 • 「オブジェクト」のキャプチャー性能は高い • 「空間」も実はそこそこいける • ブレ度合いの判定/撮影のコツ/空マスク
ご清聴ありがとうございました!