1.7K Views
February 28, 20
スライド概要
2020年1月30日(木)に、ヤフー大阪オフィスで「Mix Leap Study #57 - iOS & Android勉強会」を開催しました。
「PayPayフリマ」「Yahoo!天気」のAndroidアプリ、そして社内の研究開発から生まれたGPS不要の屋内ナビゲーション手法「SCAN」のiOSアプリを開発する3組のエンジニア・デザイナーが、その開発ノウハウを語りました。
イベントの詳細については、下記connpassページをご覧ください。
https://yahoo-osaka.connpass.com/event/159924/
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
Mix Leap Study #57 - iOS & Android勉強会 屋内ナビゲーション手法:SCAN ヤフー株式会社 鈴木 健司 Confidential 西 紗記子
SCANとは? Confidential
屋内位置測位技術の課題 GPSが届きにくい 屋内ではGPS電波が届きにくく 屋内で位置を特定させるには異なるアプローチが必要 Confidential 事業者側の準備コスト QR/地磁気/Wifiなど既存設備への追加や 専用の地図を用意する必要
SCANのアプローチ 1 設置されている構内図を Confidential 2 SCANで撮影すると 3 撮影画像に現在地を表示/追跡
SCANの特徴 Camera IMU スマホ単体で完結 専用の装置や地図が不要 現在地測位に用いるのはスマホ内蔵カメラとIMUだけ 既存設備をそのまま活用可能で導入コストが低い Confidential
Confidential
R&Dしたので SCANは世界最高峰の国際学会に採択されました コンピュータ科学分野の国際学会ACM(Association for Computing Machinery)が主催する MobileHCI 2019 DemosにてSCANは査読スコア満点で採択され、その研究内容に高い関心が寄せられています Confidential
Confidential
BEST DEMO - Peopleʼs Choice を受賞しました! Confidential
SCANのしくみ Confidential
全体の流れ - ユーザの操作時 - Confidential
屋内地図を撮影 Confidential
屋内地図を撮影 matching feature points reference user scanned 撮影画像と参照画像のマッチング Confidential
(Camera Calibration) 屋内地図を撮影 2枚の画像から回転/移動量を求め現在地XYを算出 target u user matching feature points reference user scanned 撮影画像と参照画像のマッチング Confidential a2 a1 reference θ u= ( cosθ -sinθ sinθ cosθ )a 2
(Camera Calibration) 屋内地図を撮影 2枚の画像から回転/移動量を求め現在地XYを算出 target u user a2 a1 reference θ u= ( cosθ -sinθ sinθ cosθ )a 2 matching feature points reference user scanned 撮影画像と参照画像のマッチング Confidential user scanned front-view 正面図に補正し現在地XYを画像上にマッピング
(Camera Calibration) 屋内地図を撮影 2枚の画像から回転/移動量を求め現在地XYを算出 target u user a2 a1 IMUで相対的移動量を取得し位置更新 reference IMU θ u= ( cosθ -sinθ sinθ cosθ )a 2 matching feature points reference user scanned 撮影画像と参照画像のマッチング Confidential user scanned front-view 正面図に補正し現在地XYを画像上にマッピング 3d axis
SCANの実装を少し詳しく Confidential
(Camera Calibration) 屋内地図を撮影 2枚の画像から回転/移動量を求め現在地XYを算出 target u user a2 a1 IMUで相対的移動量を取得し位置更新 reference 3d axis IMU θ u= ( cosθ -sinθ sinθ cosθ )a 2 matching feature points ←これ reference user scanned 撮影画像と参照画像のマッチング Confidential user scanned front-view 正面図に補正し現在地XYを画像上にマッピング
の前にちょっと 行列演算について Confidential
Confidential 参照:https://ja.wikipedia.org/wiki/レナ_(画像データ)
Confidential
問 Confidential 画像を右上100ピクセル移動しなさい
Confidential
Confidential
Confidential
Confidential
Confidential
問 Confidential 画像を原点から45度回転させなさい
Confidential
Confidential
Confidential
Confidential
45 Confidential
Confidential
Confidential
これを行列演算でやってみる Confidential
1 0 0 Confidential 0 1 0 0 0 1 参照:https://developer.apple.com/documentation/accelerate
1 0 0 0 1 0 0 0 1 複数の計算式を一行で出来る! Confidential 参照:https://developer.apple.com/documentation/accelerate
平行移動行列 !" 1 #" = 0 0 1 0 1 0 100 ! 100 # 1 1 " + 100 = & + 100 1 回転行列 45 cos " ! 180 #" = 45 sin 1 180 0 45 − sin 180 45 cos 180 0 0 ! # 0 1 1 45 45 cos * ∗ , − sin *∗0 180 180 = 45 45 sin * ∗ , + cos *∗0 180 180 1 回転と平行移動のアフィン変換行列 " ! 1 #" = 0 0 1 Confidential 0 1 0 45 cos 100 180 100 45 sin 1 180 0 45 − sin 180 45 cos 180 0 0 ! # 0 1 1 参照:https://developer.apple.com/documentation/accelerate
Swiftでどう書くの? Confidential
Confidential 参照:https://developer.apple.com/documentation/accelerate
1 0 0 0 1 0 100 100 1 simd_float3x3(simd_float3(1, 0, 100), simd_float3(0, 1, 100), simd_float3(0, 0, 1)) Confidential
" ! 1 " # = 0 0 1 0 1 0 100 ! 100 # 1 1 let p = simd_float3(x, y, 1) * simd_float3x3(simd_float3(1, 0, 100), simd_float3(0, 1, 100), simd_float3(0, 0, 1)) . Confidential
一般的な数学 " ! 1 " # = 0 0 1 0 1 0 100 ! 100 # 1 1 " + 100 = & + 100 1 simdではこう書かなくてはならない! ! 1 " = # 0 # 1 0 1 " ! Confidential 0 1 0 100 100 1 " + 100 = & + 100 1
Confidential
Confidential
Confidential
これをシェーダーでやってみる Confidential
forで1pxづつやる || 画素数多いと時間がかかる Confidential
Confidential forで1pxづつやる shaderで同時並列でやる || || 画素数多いと時間がかかる 処理が早い!
Confidential
Confidential
forで1pxづつやる ⏱ Confidential 0.241829秒 shaderで同時並列でやる
forで1pxづつやる ⏱ Confidential 0.241829秒 shaderで同時並列でやる ⏱ 0.000584秒
400倍 高速 forで1pxづつやる ⏱ Confidential 0.241829秒 shaderで同時並列でやる ⏱ 0.000584秒
※実際はこうなります。興味のある方は是非調べてみて下さい! Confidential
ここまで前提知識 Confidential
(Camera Calibration) 屋内地図を撮影 2枚の画像から回転/移動量を求め現在地XYを算出 target u user a2 a1 IMUで相対的移動量を取得し位置更新 reference 3d axis IMU θ u= ( cosθ -sinθ sinθ cosθ )a 2 matching feature points ←これ reference user scanned 撮影画像と参照画像の特徴量マッチング Confidential user scanned front-view 正面図に補正し現在地XYを画像上にマッピング
!" cos ) # " = sin ) 0 1 − sin ) cos ) 0 0 ! 0 # 1 1 行列を用いることで画像の変換が行えることを説明しました Confidential
ここに2枚の画像があります Confidential
? ? ? ? ? ? ? ? ? 左画像を右画像と完全に変換できる未知の行列が存在します! Confidential
どう求めるのか? Confidential
⚙ ℎ$$ ! = ℎ%$ ℎ&$ ℎ$% ℎ%% ℎ&% computer vision Computer Visionの技術を用いると未知の行列が得られます この未知の行列のことを「ホモグラフィー行列」と呼びます Confidential ℎ$& ℎ%& ℎ&&
ℎ$$ ! = ℎ%$ ℎ&$ ℎ$% ℎ%% ℎ&% ℎ$& ℎ%& ℎ&& 左の画像の任意のXYが、右の画像のどこかがHを用い計算できる Confidential
"# ! (H.inverse) 右の画像の任意のXYが左の画像のどこかがHの逆行列で計算できます Confidential
user scanned front-view すなわち、ユーザが撮った写真を正面図に変換できます! Confidential
ありがとうございました Confidential