Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カメラ単体で物体の3次元 座標を扱う方法
Search
kenmatsu4
October 21, 2024
Technology
1
240
カメラ単体で物体の3次元 座標を扱う方法
スマホのカメラのみを用いて、イメージセンサーの大きさや焦点距離などのカメラパラメータからどのように計算するかの解説と、実際に顔画像を3次元空間上にプロットするやり方をご紹介します。
kenmatsu4
October 21, 2024
Tweet
Share
More Decks by kenmatsu4
See All by kenmatsu4
beta_distribution.pdf
kenmatsu4
0
39
BERT入門
kenmatsu4
0
96
数学カフェ 確率統計入門
kenmatsu4
0
47
全ての確率はコイン投げに通ず
kenmatsu4
0
80
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
kenmatsu4
0
61
Lux AI Season 2が始まったので Season 1を振り返る。
kenmatsu4
2
510
Other Decks in Technology
See All in Technology
OCI Network Firewall 概要
oracle4engineer
PRO
0
4.2k
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
180
The Rise of LLMOps
asei
7
1.7k
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
300
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
3.2k
オープンソースAIとは何か? --「オープンソースAIの定義 v1.0」詳細解説
shujisado
10
1.1k
心が動くエンジニアリング ── 私が夢中になる理由
16bitidol
0
100
The Role of Developer Relations in AI Product Success.
giftojabu1
0
140
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
CDCL による厳密解法を採用した MILP ソルバー
imai448
3
140
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
『Firebase Dynamic Links終了に備える』 FlutterアプリでのAdjust導入とDeeplink最適化
techiro
0
130
Featured
See All Featured
Being A Developer After 40
akosma
87
590k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
The Pragmatic Product Professional
lauravandoore
31
6.3k
What's in a price? How to price your products and services
michaelherold
243
12k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
900
Transcript
AI 2024.10.10 松井 健一 株式会社ディー・エヌ・エー 技術共有会 カメラ単体で物体の3次元 座標を扱う方法
自己紹介: 松井 健一 2 経歴 • 大手SIer ⇒ 大手通信キャリア ⇒
外資系コンサルティングファーム ⇒ DeNA(一時 GO/MoTに出向) • Kaggle Competition Master DeNA/GOでの業務 • AIドラレコDRIVE CHARTのAI機能精度改善、新機能開発、運用を担うデータサイエンス Gにてマネージャー • DeNAゲーム事業へのAI適用 書籍: 「アクセンチュアのプロフェッショナルが教える データ・アナリティクス実践講座」共著 「ワンランク上を目指す人のためのPython実践活用ガイド第7章Pythonではじめる統計学」 ★new! : 9/30出版「事例でわかるMLOps~機械学習の成果をスケールする処方箋~」8章 趣味: 音楽:高校生の頃からギターをやっていて、GO incでは軽音部部長をやっていました。 コロナ禍で新しいこと始めようと電子ドラムを購入してドラムも始めました。 海外旅行: 珍しいところだと新疆ウイグル自治区。東南アジア好き (ベトナム、カンボジア、ミャンマー、ラオス、バングラデシュ、 タイ、シンガポール) 子育て: 1歳10ヶ月の息子がかわいい。
AI 3 項目 00|今日やりたいこと 01|カメラパラメータの入手 02|3次元座標の計算方法
AI 4 00 今日やりたいこと
AI 動画で見る場合はこちら : https://www.youtube.com/watch?v=x1rqbsPj2Zg 00:今日やりたいこと:これをカメラだけでやる 5 動画がわかりやすいので 是非ご覧ください
AI 6 01 カメラパラメータの入手
AI カメラキャリブレーション or ネットで情報を仕入れて、カメラパラメータを知る • 何を? ◦ イメージセンサー情報 ▪ 大きさ
• 単位:物理 (例: 縦: 3.674mm , 横: 2.760mm) • 単位:ピクセル(例:縦: 2448px, 横: 3264px) ◦ カメラ情報 ▪ カメラパラメータ(後述) • レンズやカメラの設計に関わる数字。後ほど説明します。 • どうやって? ◦ 手法1: exif, opencvのキャリブレーションロジックを利用 ◦ 手法2: ネットで調べる(あれば。信頼性に問題があるかも) 01: カメラパラメータの入手 カメラの画像から3次元座標を復元するにはイメージセンサやカメラの情報が必要。それらがなん なのか、どうやって入手するのかを解説する。 7
AI イメージセンサ レンズ 対象の物体 アイコン : https://soco-st.com/13844 イメージ センサ ・写真として保存
・スクリーンに投影 イメージセンサーは、レンズを通して届いた光を各ピクセルで受け取り、それをデータ化する。 このデータは、写真として保存されたり、スマホのスクリーンに投影されたりする。 イメージセンサの大きさの測り方は 単位がいくつかあります • 単位:物理 (例: 縦: 3.674mm,横: 2.760mm) • 単位:ピクセル(例:縦: 2448px, 横: 3264px) 8
AI 物体 カメラパラメータ: 焦点距離 レンズ イメージ センサ 焦点距離はレンズとイメージセンサの間の距離のこと。測り方の単位に2種類あり、物理的な距離 (mm)と、pixel単位(px)がある。 焦点距離:
レンズとイメージセンサ との間の距離。 9
AI カメラパラメータ: 視野角(Field of view: FoV) 視野角とはカメラでカバーできる範囲を角度で示したもの。焦点距離とイメージセンサのパラメータ がわかると視野角がわかる。イメージセンサの大きさが同じ場合、焦点距離に依存して変化する。 レンズ イメージ
センサ 視野角(FoV): 焦点距離が短い方が広い レンズ イメージ センサ 視野角(FoV): 焦点距離が長い方が狭い 10
AI カメラパラメータ: pixel単位の焦点距離 pixelの世界 物理世界 イメージセンサ サイズ(mm) 縦: 3.674mm Google
Pixel 4aの例: 焦点距離(mm):2.51mm 視野⾓: 70.98 度 視野⾓: 70.98 度 イメージセンサ サイズ(px) 縦: 3264px 焦点距離(px):? mm単位のセンササイズ・焦点距離は、カメラキャリブレーション or ネットで情報を仕入れることがで きる。これをpixelで長さを測った時の焦点距離「pixec単位の焦点距離」が重要。下記の例は縦方向の 計算例。イメージセンサの各ピクセルが正方形ではない場合は縦横で若干スケールが異なる。 焦点距離(px)は左右の三角形が相似であることから算出できる。 ⇒ イメージセンサ(mm) : 焦点距離(mm) = イメージセンサ(px) : 焦点距離(px) ⇒ 3.67 : 2.51 = 3264 : x ⇒ x = (2.51 * 3264) / 3.674 ⇒ x = 2229.8px 視野角は 同じ 11
AI カメラパラメータ: 光学中心 イメージセンサ Google Pixel 4aの例: イメージセンサ サイズ(px) 縦:
3264px イメージセンサ サイズ(px) 横: 2448px 光学中⼼: (1224px, 1632px) 光学中心は至ってシンプル。イメージセンサーのpixel単位の長さにおいて中心の座標のこと。 12
AI カメラパラメータまとめ これで必要なカメラパラメータが揃った。次にそれらの入手方法について見ていく。今回はスマホの内 カメラを用いて顔を撮影するケースを扱う。 • イメージセンサー情報: ◦ 物理距離イメージセンサの大きさ ◦ pixel単位のイメージセンサの大きさ
• 焦点距離: ◦ 物理距離の焦点距離 ◦ pixel単位の焦点距離 • 視野角(Field of view: FoV) ◦ カメラでカバーできる範囲を角度で示したもの • 光学中心 ◦ pixel単位のイメージセンサの中心座標 13
AI カメラパラメータの入手方法1: インターネット検索 https://www.camerafv5.com/devices/manufacturers/google/pixel_4a_sunfish_1/ Camera FV-5などのサイトからカメラパラメータを入手する。掲載がない機種もある。公式情報ではな いので適切に注意しながら利用する。 内容が正しそうか、ちゃんと確認 して利用することをおすすめ。 掲載がないパラメータもある。
内カメラ(front)を選ぶ 14
AI カメラパラメータの入手方法2: exif https://www.camerafv5.com/devices/manufacturers/google/pixel_4a_sunfish_1/ プロンプト例: pythonを用いてスマホで撮影したカメラ画像か らexif情報として下記を抽出して。 * 焦点距離(ミリメートル) *
カメラメーカー * カメラモデル * レンズメーカー * レンズモデル * 画像の幅(ピクセル) * 画像の高さ(ピクセル) カメラの情報の一部は撮影画像に含まれるexifというメタデータに保存されている。pythonを用いて この情報を抽出する。 1. 下記のようなプロンプトでChatGPTでコードを出力し、実行する。 Google Pixel 4aのselfieカメラの結果例: 焦点距離 (ミリメートル): 2.51 mm カメラメーカー: Google カメラモデル: Pixel 4a レンズメーカー: Google レンズモデル: Pixel 4a front camera 2.51mm f/2.0 画像の幅 (ピクセル): 2448 画像の高さ (ピクセル): 3264 15
AI カメラパラメータの入手方法3: カメラキャリブレーション OpenCVなどのライブラリを用いて、スマホのカメラで撮影した映像と、チェッカーパターンというも のを利用してキャリブレーションを行いパラメータを算出する。 1. チェッカーパターンの入手 a. https://github.com/opencv/opencv/blob/4.x/doc/pattern.png などから入手
2. チェッカーパターンを印刷 a. 印刷して、ひとマスの大きさを測る。 b. 左記の例は2.9cm c. 硬い板などに貼り付ける。 iPadの裏に貼り付けた例 16 tips: 右図のチェッカーボードは 9 x 6のマス目のボー ドとして説明されているが、この数え方は交点で 数えているため。
AI カメラパラメータの入手方法3: カメラキャリブレーション OpenCVなどのライブラリを用いて、スマホのカメラで撮影した映像と、チェッカーパターンというも のを利用してキャリブレーションを行いパラメータを算出する。 3. 撮影する a. 10-20枚くらい、角度を変えながら撮ると良いらしい b.
カメラによるが、pixel 4aはdefaultで少しズームされ ているのでピンチアウトしてから撮影する 4. pythonのopencvでキャリブレーション実行 a. ChatGPTで実行コードを出力できる。 b. プロンプト例は下記。 [プロンプト例] pythonのopencvでチェッカーボードパターンからカメラの キャリブレーションをするコードを出力してください。 チェッカーボードの仕様(マス目の数やマス目の大きさ)を 指定できるようにしてください。 撮影 撮影した写真 17
AI カメラキャリブレーションの結果 実行すると下記のような結果が得られる。 pixel単位の焦点距離(水平方向) fx 2294.803759 pixel単位の焦点距離(垂直方向) fy 2288.653857 光学中心(水平方向)
cx 1218.585174 光学中心(垂直方向) cy 1657.477656 歪み係数 k1 0.006915852877 k2 0.2348103599 p1 0.003060278216 p2 0.0003550771906 k3 -0.749885668 k4 k5 k6 水平視野角 FOV_x_deg 56.14904273 垂直視野角 FOV_y_deg 70.98403862 平均再投影誤差 Mean_Reprojection_Error 0.2587866527 18
AI 19 02 3次元座標の計算方法
AI 投影方程式 OpenCV doc: http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html 必要な情報が集まったので、これらを利用してカメラ画像から3次元座標を推定していく。ピンホール カメラモデルとして3次元座点を透視投影変換を用いて画像平面に射影して計算する。 投影方程式 ↑の行列の各変数は カメラパラメータ(既知)
↑のX_real, Y_real, Z_realは3 次元上の座標(未知) ↑のuとvは、 画像上の2次元座標 (既知) sはスケーリングファクターであるが、通常Z_realを利用する。 Rは回転行列、tは並進ベクトルであるが、理解のためこれを省略(単位行列、0ベクトルとする) してみると下記の数式となる。(R、tは未知) 20 画像上にプロットした facelandmark
AI 投影方程式 イメージ センサ イメージ センサ(仮想) レンズの前側に反転させて 仮想的に置いたイメージセンサ fx:ピクセル単位の 焦点距離
fx:ピクセル単位の 焦点距離 cx: 光学中心 右目の座標 (X_real, Y_real, Z_reak) X_real: 3次元空間上の 左目のX軸方向の値 一旦、レンズ中心を 原点O(0, 0, 0)とする。 u_temp: 左目のX軸 方向の値 Z_real: 左目のZ軸 方向の値 理解のためにc_xを 省略すると オレンジ線 つまり、uは オレンジ線の傾きでfxだ け進んだ時の高さ! 一見この式が何を計算しているのかわからないが、図示してみるとZ軸方向に単位距離進んだ時のX軸 方向の変化量(つまり傾き)を求め、fxだけZ軸方向に進んだ時のX軸方向の距離を求めているだけ。 X軸方向の例: 21 オレンジ線 の傾き
AI 投影方程式 u_temp: 左目のX軸 方向の値 cx: 光学中心 実際はこの図で言うとイメージセンサの 上端がX軸の0地点なのでcxを用いて補正
する。 cx - u’ = u 0: 前ページで求めた式 左記より本当に必要な値は 左図より、矢印の向き が逆なのでu’として符 号を反転 u’: 左目のX軸 方向の値(下向き) ⇒ これで簡略版投影方程式と 一致することがわかった 前頁では原点をレンズとしていたが、X軸方向の原点はイメージセンサの原点であるため、光学中心を 用いて補正をする。この補正を行うとp20下部の簡略版投影方程式と一致することがわかる。 22
AI 23 方程式を解くために・・・ 2本の方程式に3つの変数があ りこのままでは解けない。 ① ② ③ ③ ③
③ データを追加して制約を増や して解けるようにする。 今取り組んでいる問題は、facelandmarkの3次元座標化であるが、 このfacelandmarkの3次元テンプレートを導入することで解決できる。 これで先に進めるはずだが、今手に入れた方程式は、2本の方程式に3つの変数がありこのままでは解 けない。
AI 24 face_templateの導入 … templateの出典: https://github.com/hysts/pytorch_mpiigaze_demo/blob/master/ptgaze/common/face_model_68.py#L27 68点のfacelandmarkモデルのテンプレートを導入。鼻が原点(0, 0, 0)で下向き。人間の顔の構造は個性 の違いはあれど大きく変わらないと言う仮定で共通のテンプレートとのマッチングを行う。
… ここが鼻の座標 動画URL: https://www.youtube.com/watch?v=E0__OnI7xXY
AI 25 cv2.solvePnPで解く ↑回転行列(未知) ↑の行列の各変数は カメラパラメータ (既知) ↑並進ベクト ル (未知)
前述の方程式ではX_real, Y_real, Z_realを未知としていたが、テンプレートを導入することで、これを 既知としつつ回転行列と並進ベクトルを導入し、テンプレートを回転と並行移動することで3次元上の座 標を決定する形で解を求める。 facelandmark テンプレート(既知) 画像上の2次元座標 (既知) スケーリングファクターは Z_realとする(既知) これを68点分の方程式として未知の変数について解く。回転行列と並進ベクトルは68点で共通。 (なので解くべき変数が減る) 最適化問題の定式化: これを最小二乗法で解く。解析的に解けないので最適化問題で解く。実際はcv2.solvePnPを使う。 N = 68, はベクトルの第3成 分(深度成分)を示す。 X, Y, Zを直接求めるのではなく、 回転と並行移動で求める方針に。
AI 26 cv2.solvePnPがやっていることのイメージ 回転と並行移動した facelandmark template (3次元) 2D画像座標 ② 回転と並行移動した
facelandmark template をイメージセンサー上に投 影したもの(2D) ① dlibで2次元上にプロットした 写真に基づいて検出した facelandmark(2D) この①と②の各点の距離を誤差とする。実際の 個々人のfacelandmarkとfacelandmark templateが一致することはないが、誤差を最小 化すれば良い位置にすることはできる。 facelandmarkを回転したり並行 移動したりしながら2D画像座標 に投影して誤差が一番少ないと ころを探す。 スマホ facelandmark templateを回転や並行移動して2D座標に投影する。2D座標上にある自分の写真から算 出したfacelandmark(2D)と投影されたものがなるべく近くなるように回転と並行移動を調整する問題と なっている。
AI 27 実験してみる 30cmの長さの菜箸をレンズ の前に置いて、鼻の位置を 決める 撮影できました dlibを使ってfacelandmark を付与します dlib
facelandmark detectorの使用例: https://cppx.hatenablog.com/entry/2017/12/25/231121 実際にやってみる。3D復元の精度をみたいので、鼻の位置を菜箸を使って測って決めて撮影した。
AI 28 3D復元の実装 https://github.com/hysts/pytorch_mpiigaze_demo/blob/master/ptgaze/common/face_model.py#L21-L48 色々解説してきたが、実装はライブラリを使えばポンと出る。どちらかと言うと前半のパラメータを正 しく理解して導入することと、このsolvePnPが何をやっているかの理解の方が難しい。 画像上の2次元座標(既知) facelandmarkテンプレートの3次 元座標(既知) 回転行列(未知)
並進ベクトル(未知) カメラパラメータ(既知) 並進ベクトルはレンズと鼻を結ぶベクトルに なるのでhead_positionという変数名になる
AI 結果! 29 動画で見る場合はこちら : https://www.youtube.com/watch?v=x1rqbsPj2Zg 並進ベクトルは菜箸の長さ 30cmとほぼ同じ28.5cm程度! なかなか精度が良い!
AI 30 ちなみに: カメラパラメータをちゃんとデバイスに合わせず、デフォルト値を使うと全くうまくいかない。 動画URL: https://www.youtube.com/watch?v=J5PCO__a5Lg
AI 31 EOF