カメラとLiDARの自動キャリブレーション手法「CalibAnything」

はじめに

こんにちは!R&Dユニットでインターンをしていた小野です。 この記事では先日のインターンで調査したカメラとLiDARのキャリブレーションを自動でするCalibAnythingについて紹介します。

OPTiM Geo Scan Advanceについて

今回、私がインターン中に関わっていたサービスはOPTiM Geo Scan Advanceです。 Geo Scan Advanceは、iPhoneと外付けのLiDARを使って従来より高精度な3次元測量を行うサービスです。

このサービスの機能として、LiDARで得た色のない点群にカメラ画像を使って色をつけるというものがあります。この色付けを行うために、LiDARとカメラの位置合わせ(キャリブレーション)が必要です。それを自動で行う手法の1つがCalibAnythingです。

CalibAnythingについて

CalibAnythingは、SegmentAnythingというモデルを利用したセグメンテーションのクラスの一貫性の情報を利用するカメラとLiDARの自動キャリブレーションの手法です。 カメラ画像と反射強度付きの点群、カメラ内部パラメータ、変換行列の初期値を入力とし、キャリブレーションに適した変換行列を出力します。キャリブレーションの最適化のためのスコアは、反射強度、法線ベクトル、セグメンテーションのクラスの一貫性から評価しています。実際に実行するときは、カメラ画像をPythonスクリプトを使って前処理することでマスク画像を得て、その処理されたマスク画像とその他の入力をC++で書かれたCalibAnythingの実行ファイルへ渡します。

CalibAnythingの結果を色付き点群として表示する

CalibAnythingを実行して出力されるのは、LiDAR→カメラの変換行列と入力したカメラ画像に対して初期値で点群を重ね合わせた画像と、最終の適した値で重ね合わせた画像のみです。先行手法であるdirect_visual_lidar_calibrationはリポジトリの内部にviewerのプログラムがあったのですが、CalibAnythingには存在せず、結果を3次元的に確認できませんでした。そのため、新たにカメラ画像と点群、変換行列を入力として色付きの点群を出力できるOSSのソフトウェアを探しました。colorize-lidar-pointcloudを発見し、これを利用し可視化をして、評価しました。

CalibAnythingに複数の点群・画像のセットを入力する

CalibAnythingは複数の点群・画像のセットを入力することもできます。データの制約として

  • カメラとLiDARの相対位置が変わっていない(←それを求めたいので当然)
  • カメラの内部パラメータが変わっていない(←こっちは制約)

があります。 実行方法は1セットの時と同じです。このために、Geo Scan Advanceを使って新たにデータを作成して実行しました。実行時間は長くなりますが、1セットでは失敗するシーンでも複数セットを入力すると成功した例もあり、数セットで入力する価値もあるかもしれません。

評価

先行手法との比較

すでに社内で調査されていたdirect_visual_lidar_calibrationと比較しました。Geo Scan Advanceで撮影されたデータに対して、CalibAnythingは軸の方向だけを変換する固定の初期値を、direct_visual_lidar_calibrationは点群の反射強度を平面に投影した画像とグレースケールのカメラ画像との特徴マッチングを利用して得た初期値を与え実行します。 実行結果を、CalibAnythingは上で説明した色付き点群として可視化し、direct_visual_lidar_calibrationは内部のviewerで可視化し、それぞれ成功⭕️失敗❌大失敗❌❌の3段階で目視によって評価しました。結果としては、1セットを入力とするときは、direct_visual_lidar_calibrationの方が良かったです。

本当は、目視以外の定量的な評価指標で評価したいと思い関連する論文も読んでいたのですが、ground truthのあるデータセットもなく、そもそもこのタスクにおいてのground truthを決めることが難しいため、多くの論文が「目視で確認(例を図として載せる)+結果のばらつきを示す」ことによって手法の評価をしていました。 読んだ論文の中で唯一、Automatic Targetless Extrinsic Calibration of a 3D Lidar and Camera by Maximizing Mutual Informationは、複数のカメラのついた360°カメラを利用しており、カメラ間での変換行列は既知であるので、提案手法を使って求めたCamera2Cameraの変換行列と実際のCamera2Cameraの変換行列を比較して、評価していました。

結論

単純な結果では、direct_visual_lidar_calibrationの方が良いとなりましたが、direct_visual_lidar_calibrationは点群の反射強度を平面に投影した画像とグレースケールのカメラ画像との特徴マッチングを利用して得た初期値か手動マッチングによって適切な初期値を与える必要があるため、その手間・難易度が課題になります。最終的には、特徴マッチングの方法を変えたことによる精度評価などを踏まえて、結論を出すことになると思います。 その点、CalibAnythingは軸の方向だけを変換する固定の初期値を与えるだけでそこそこの精度で動かすことができ、また複数の点群・画像セットでも動かすこともできるので、使い方によっては、CalibAnythingを採用することもあり得ると思います。

まとめ

短いインターンの期間でしたが、Geo Scan Advanceの実データと実機に触れて、研究で提案された手法が実際に製品に使えるかということを考えながら調査できて非常に楽しかったです。 定量的な評価手法のない問題に向き合うのは難しかったですが、その中でもどうやって評価するかを考えていくのは非常に楽しかったです。今後も、3Dコンピュータビジョンについて勉強していこうと思います。

採用情報

この記事は AI エンジニアコースのインターンシップでの取り組み内容に関する記事でしたが、オプティムではこのように AI エンジニアコースに限らず定期的にインターンシップを実施しています。本記事執筆時点では募集期間ではありませんが、興味のある方はぜひインターンシップ特設ページをご覧ください。

また、オプティムではエンジニアの採用も行っています。