Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

カメラ単体で物体の3次元 座標を扱う方法

kenmatsu4
October 21, 2024

カメラ単体で物体の3次元 座標を扱う方法

スマホのカメラのみを用いて、イメージセンサーの大きさや焦点距離などのカメラパラメータからどのように計算するかの解説と、実際に顔画像を3次元空間上にプロットするやり方をご紹介します。

kenmatsu4

October 21, 2024
Tweet

More Decks by kenmatsu4

Other Decks in Technology

Transcript

  1. 自己紹介: 松井 健一 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ヶ月の息子がかわいい。
  2. AI カメラキャリブレーション or ネットで情報を仕入れて、カメラパラメータを知る • 何を? ◦ イメージセンサー情報 ▪ 大きさ

    • 単位:物理 (例: 縦: 3.674mm , 横: 2.760mm) • 単位:ピクセル(例:縦: 2448px, 横: 3264px) ◦ カメラ情報 ▪ カメラパラメータ(後述) • レンズやカメラの設計に関わる数字。後ほど説明します。 • どうやって? ◦ 手法1: exif, opencvのキャリブレーションロジックを利用 ◦ 手法2: ネットで調べる(あれば。信頼性に問題があるかも) 01: カメラパラメータの入手 カメラの画像から3次元座標を復元するにはイメージセンサやカメラの情報が必要。それらがなん なのか、どうやって入手するのかを解説する。 7
  3. AI イメージセンサ レンズ 対象の物体 アイコン : https://soco-st.com/13844 イメージ センサ ・写真として保存

    ・スクリーンに投影 イメージセンサーは、レンズを通して届いた光を各ピクセルで受け取り、それをデータ化する。 このデータは、写真として保存されたり、スマホのスクリーンに投影されたりする。 イメージセンサの大きさの測り方は 単位がいくつかあります • 単位:物理 (例: 縦: 3.674mm,横: 2.760mm) • 単位:ピクセル(例:縦: 2448px, 横: 3264px) 8
  4. 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
  5. AI カメラパラメータ: 光学中心 イメージセンサ Google Pixel 4aの例: イメージセンサ サイズ(px) 縦:

    3264px イメージセンサ サイズ(px) 横: 2448px 光学中⼼: (1224px, 1632px) 光学中心は至ってシンプル。イメージセンサーのpixel単位の長さにおいて中心の座標のこと。 12
  6. AI カメラパラメータまとめ これで必要なカメラパラメータが揃った。次にそれらの入手方法について見ていく。今回はスマホの内 カメラを用いて顔を撮影するケースを扱う。 • イメージセンサー情報: ◦ 物理距離イメージセンサの大きさ ◦ pixel単位のイメージセンサの大きさ

    • 焦点距離: ◦ 物理距離の焦点距離 ◦ pixel単位の焦点距離 • 視野角(Field of view: FoV) ◦ カメラでカバーできる範囲を角度で示したもの • 光学中心 ◦ pixel単位のイメージセンサの中心座標 13
  7. 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
  8. 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のマス目のボー ドとして説明されているが、この数え方は交点で 数えているため。
  9. AI カメラパラメータの入手方法3: カメラキャリブレーション OpenCVなどのライブラリを用いて、スマホのカメラで撮影した映像と、チェッカーパターンというも のを利用してキャリブレーションを行いパラメータを算出する。 3. 撮影する a. 10-20枚くらい、角度を変えながら撮ると良いらしい b.

    カメラによるが、pixel 4aはdefaultで少しズームされ ているのでピンチアウトしてから撮影する 4. pythonのopencvでキャリブレーション実行 a. ChatGPTで実行コードを出力できる。 b. プロンプト例は下記。 [プロンプト例] pythonのopencvでチェッカーボードパターンからカメラの キャリブレーションをするコードを出力してください。 チェッカーボードの仕様(マス目の数やマス目の大きさ)を 指定できるようにしてください。 撮影 撮影した写真 17
  10. 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
  11. 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
  12. 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 オレンジ線 の傾き
  13. AI 投影方程式 u_temp: 左目のX軸     方向の値 cx: 光学中心 実際はこの図で言うとイメージセンサの 上端がX軸の0地点なのでcxを用いて補正

    する。 cx - u’ = u 0: 前ページで求めた式 左記より本当に必要な値は 左図より、矢印の向き が逆なのでu’として符 号を反転 u’: 左目のX軸   方向の値(下向き) ⇒ これで簡略版投影方程式と 一致することがわかった 前頁では原点をレンズとしていたが、X軸方向の原点はイメージセンサの原点であるため、光学中心を 用いて補正をする。この補正を行うとp20下部の簡略版投影方程式と一致することがわかる。 22
  14. AI 23 方程式を解くために・・・ 2本の方程式に3つの変数があ りこのままでは解けない。 ① ② ③ ③ ③

    ③ データを追加して制約を増や して解けるようにする。 今取り組んでいる問題は、facelandmarkの3次元座標化であるが、 このfacelandmarkの3次元テンプレートを導入することで解決できる。 これで先に進めるはずだが、今手に入れた方程式は、2本の方程式に3つの変数がありこのままでは解 けない。
  15. 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を直接求めるのではなく、 回転と並行移動で求める方針に。
  16. 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)と投影されたものがなるべく近くなるように回転と並行移動を調整する問題と なっている。
  17. AI 27 実験してみる 30cmの長さの菜箸をレンズ の前に置いて、鼻の位置を 決める 撮影できました dlibを使ってfacelandmark を付与します dlib

    facelandmark detectorの使用例: https://cppx.hatenablog.com/entry/2017/12/25/231121 実際にやってみる。3D復元の精度をみたいので、鼻の位置を菜箸を使って測って決めて撮影した。