最新AI論文をキャッチアップ

【PETRv2】カメラ画像だけで物体の3次元位置を推定

【PETRv2】カメラ画像だけで物体の3次元位置を推定

Object Detection

3つの要点
✔️ 自動運転で重要となる3次元物体認識、鳥瞰図上のSegmentation, 車線認識をカメラ画像のみで行う手法
✔️ 3次元物体認識のみを行う先行研究PETRを時系列情報の活用 & マルチタスク学習で拡張
✔️ 位置埋め込みに3次元情報+時系列情報を付加するトランスフォーマーベースの手法

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images
written by Yingfei LiuJunjie YanFan JiaShuailin LiAqi GaoTiancai WangXiangyu ZhangJian Sun
(Submitted on 2 Jun 2022 (v1), last revised 14 Nov 2022 (this version, v3))
Comments: Adding 3D lane detection results on OpenLane Dataset

Subjects: Computer Vision and Pattern Recognition (cs.CV)

code:  

本記事で使用している画像は論文中のもの,紹介スライドのもの,またはそれを参考に作成したものを使用しております. 

はじめに

本論文で紹介されているPETR v2と言うのは名前からわかるようにPETR (Position Embedding TRansformer) という手法を拡張した手法です。PETRは複数カメラの画像だけを使って物体の3次元位置を推定するタスクを解く手法です。ただし、教師あり学習を行うため3次元上での物体位置の真値が必要であり、学習データセットを作成するためには、画像と合わせてLiDAR点群を取得し、その点群に対してアノテーションを行なっておくことが必要となります。PETR v2では複数カメラの画像を複数時間フレーム分用いることによって時系列情報を考慮することができるよう拡張され、さらに3次元物体認識だけでなく、鳥瞰図画像のsegmentation(鳥瞰図上の各画素を走行可能領域、車線、車などに分類)、3次元車線検出を同時にこなすことができるよう拡張された手法です。

本記事ではまずPETRの概要を説明し、その後にPETR v2の概要、そしてPETRからの変化点の詳細を説明していこうと思います。

PETR (Position Embedding TRansformer)

PETRはTransformerベースの3D物体検出手法です。処理の大まかな流れとしては、まず複数のカメラで取得した各画像からResNet-50などの一般的なbackbone networkを使ってそれぞれ特徴量を計算し、それに対してカメラの位置関係から計算される3Dの位置埋め込みを足し合わせることにより3D特徴量を作成します。そして、その値をTransformerのkey, valueとして利用して、空間上の3次元点から計算されるobject queryと共にTransformerに入れることでqueryを更新し、更新されたqueryごとにクラスラベルやBBoxのパラメータを計算していきます。

では次に、3D位置埋め込みの計算、Transformerによるquery更新、Loss計算部分それぞれについて説明していきます。

1. 3D位置埋め込みの計算 

各画像から計算された特徴量の次元を C x Hf x Wfと仮定します。
まずCamera Frustum Spaceと呼ばれるカメラのFOV空間から、以下の図のようなD x Hf x Wf 個のgrid点を考えます。Dは奥行き方向のgrid点の数を表しています。
Camera Frustum Space

このgrid点を各カメラの姿勢から計算される行列を用いて、カメラ座標系から世界座標系に変換します。これらの点をMLPに入れることにより3D位置埋め込みを得ます。そして、画像特徴量に1x1 convを適用して次元を変更したものと、この3D位置埋め込みを足し合わせることによって、3D位置を考慮した画像特徴量を得ることができます。

2. Transformerによるobject queryのupdate

まずTransformerへ入力するobject queryをどう計算するかについて説明します。PETRではまず3D空間中にanchor point(学習可能パラメータ)をランダムにいくつか設定します。このanchor pointの数が検出可能な物体の最大数になります。これらの点の座標をそれぞれMLPに入れることによってobject queryを計算します。

そして、この値をquery、先ほど計算した3D位置を考慮した画像特徴量をkey, valueとしてTransformer Decoderに入力することによって、各queryの値を更新します。

3. Loss計算

 Transformerから得られたqueryをそれぞれクラスラベル推定とBoundingBox推定ネットワークに入力します。クラスラベル推定結果についてはfocal lossを用い、BBoxについてはobject queryを作成する際の元になったanchor pointからのオフセットを推定し、Hungarianアルゴリズムを用いてlossを計算します。

Hungarianアルゴリズムを使ったloss計算はTransformerを活用した2D物体検出手法DETRや、それを3D化したDETR3Dなどでも使われています。従来のAnchor boxを使った物体検出手法と異なり、あるqueryから生成されたBBoxは実際の物体(=Ground Truth)のうちのどれと対応するのかがわからないため、queryと実際の物体の組み合わせそれぞれについてコスト関数を計算し、Hungarianアルゴリズムによって最適な組み合わせを計算します。最適な組み合わせが分かれば、後は通常と同様にL1 lossを使ってBBoxのパラメータのlossを計算します。

以上がPETRの概要になります。

PETR v2

下の図がPETR v2の処理の流れを表しています。PETRからの大きな変化点としては、1) 入力として現在時刻の観測だけでなく、過去の観測も使うようになったこと、2) 物体検出だけでなく、鳥瞰図上でのsegmentationと車線推定を行うようになったことです。
CはConcat処理です。AはAlignを表し、1つ前の時刻の車両位置やLiDAR位置を基準とした座標系で計算された3D位置埋め込みを現在の位置を基準とした座標系に変換する処理を指しています。

Overview of PETRv2

それではここからPETRからの変化点の詳細について1つずつ説明していきます。

1.時系列データを活用した3D位置埋め込み計算

PETRと同じように3D位置埋め込みはCamera Frustum Spaceと呼ばれるカメラのFOV空間上のgrid点を変換することによって計算します。PETRの場合は1つの時間フレームの観測のみを用いていたため、各カメラごとの座標系上のgrid点を、現在の車両位置やLiDAR位置を基準とする座標系に移し、その座標値をMLPに入れていました。PETRv2では過去の時間フレームの観測も用いますが、車両の移動により現在と過去とで異なる位置に車両がいる場合があり、それを反映させるために過去の時刻のgrid点を現在の時刻での位置を基準とした座標系に変換する処理が必要となります。

また、PETRでは3D位置埋め込みは画像特徴量とは無関係に計算されていましたが、画像特徴量は3D位置埋め込みの計算に役立つと考えられるため、以下の式により3D位置埋め込みに画像特徴量を反映させるようにしました。

Calculation of 3DPE

ここで左辺が画像特徴量を考慮した3D位置埋め込み、ξ(F)は画像特徴量を入力とするMLPの出力に対してSigmoid関数を適用したもの、Pは時刻tでの位置を基準とする座標系上でのgrid点の座標値、ψはそれを変換するMLPで、ψで得られた3D位置埋め込みに要素ごとに画像特徴量を使ってsoftmaskを掛けているイメージです。

2. マルチタスク

PETR v2ではPETRと同様に3D物体検出を行いますが、それに加えて鳥瞰図(BEV)上でのsegmentationと3D車線検出を同時に行います。これらのタスクは物体検出と同様にTransformerを使ってqueryを更新し、それを各タスクごとのheadに入力して行います。

BEV segmentation: まず鳥瞰図をいくつかの区間=patchに分割します。下の図では2x2の4pixelを1つのpatchとしています。そのpatch内の点を1つanchor pointとして、物体検出と同様にMLPに入れてqueryを計算します。このqueryを物体検出と同じTransformerに入力して更新し、このqueryを元の鳥瞰図上に戻し、アップサンプリングして、最後に鳥瞰図の各pixelのクラスを推定し、focal lossを用いて学習します。評価実験では、クラスとしてはDriveable area, Lane, Vehicleを用いており、鳥瞰図のサイズは200pixel x 200pixel, patchの数(=query数)は25x25=625個としています。

BEV segmentation

3D車線検出:物体検出で使う3D anchor pointの代わりにanchor laneというanchor pointの順序付き集合を用意します。このanchor laneは以下の図のようにy軸(=車両の進行方向)と並行になるように設定します。

3D Lane detection

このanchor lineの各点をMLPにより変換してqueryを計算し、それをTransformerに入力します。Transformerの出力を使って、車線のクラス、anchor pointからのx軸、z軸方向のオフセット(つまりy座標はanchor pointと同一)、そしてその点が見えているかどうかを推定します。車線のクラスと点が見えているかどうかはfocal lossを使用し、anchor pointからのオフセットについてはL1 lossを使用します。

評価試験においては、各anchor lineを構成する点の数は10個で、y座標は[5, 10, 15, 20, 30, 40, 50, 60, 80, 100]、queryの数は100(つまり恐らくanchor lineの数は10)としています。

anchor lineの設定方法から考えると、交差点のように自分の進行方向と直行する方向の車線を検出することは想定していないようです。 

評価

3D物体検出と鳥瞰図segmentationタスクについてはnuscenesデータセットを用いて評価し、車線検出についてはOpenLaneデータセットを用いて評価を行っています。

まず以下の表は3D物体検出の精度を比較した結果になります。PETRとBEVFormerの間に線が引かれており、それより上は1時刻の観測のみを使った手法、下は複数時間フレームの観測を使った手法になっています。mAAEを除いて全ての指標で複数時間フレームの手法が大きく上回っており、その有効性がわかります。PETRv2について見てみると、入力のサイズが大きいほど性能が高く、BackboneもRes-50よりもRes-101の方が性能が高くなっており、どちらも妥当な結果となっています。BEVDet4Dは指標によってはPETRv2を上回ることもありますが、その原因については論文中で特に触れられていません。

Result of Object Detection 

下の表は鳥瞰図Segmentationtについての結果を示しています。PETRv2*は外部学習データを使った場合の結果を表しています。同じ学習データを使っているBEVFormerとPETRv2を比較するとLaneについてはPETRv2が上回っていますが、DriveはPETRv2が良く、VehicleはBEBFormerが良いという結果になっています。

BEV segmentation

下の表は車線検出についての結果を示しています。PETRv2-{V,E}はbackboneとしてVoVNetV2とEfficientNetを使った場合の結果を表しており、V*はanchor pointsの数を100から400に増やした場合の結果を表しています。

Result of Lane detection

マルチタスク学習を謳っているにも関わらず、タスクごとに異なる設定の結果を載せており違和感がありますが、これは恐らくどのタスクに対してもSOTAとなるような設定が存在しなかったため、各タスクごとにベストなものを出しているのだと思われます。

まとめ

本記事では複数のカメラ画像のみからTransformerを使って3D物体検出、鳥瞰図segmentation、車線検出を行う手法を紹介しました。この分野は2021年にテスラが技術を発表して(論文は公開されていない)一気に注目を浴びて、現在どんどん進化している分野ですので今、後とも動向を追っていきたいと思います。

  • メルマガ登録(ver
  • ライター
  • エンジニア_大募集!!

記事の内容等について改善箇所などございましたら、
お問い合わせフォームよりAI-SCHOLAR編集部の方にご連絡を頂けますと幸いです。
どうぞよろしくお願いします。

お問い合わせする