自動運転におけるBEVとSLAMをわかりやすく解説するには?

著者 | デア ストーリー エディター | オートボット

元のリンク: https://zhuanlan.zhihu.com/p/646310465

「自動運転ハート」公開アカウントに注目するには下のカードをクリックしてください

ADAS ジャンボ乾物、手に入れられます

この記事は学術的な共有のみを目的としています。侵害がある場合は、記事を削除するために連絡してください。

>>クリックしてエントリー→オートパイロットの核心【フルスタックアルゴリズム】技術交流グループ

Birds-Eyes-View (BEV): 鳥瞰図のことであり、言葉自体に特別な意味はありませんが、自動運転 (AD) の分野で徐々に普及して以来、この業界用語として定着しました。

Simultaneous Localization and Mapping (SLAM): 同時測位と地図マッピング。BEV に関連するもう 1 つの認識技術です。

知覚: AD 分野の知覚、SLAM、および BEV はすべて、制御システムが車両の周囲の状況を理解するのを支援する知覚テクノロジーです。つまり、自分がどこにいるか、どのような障害物があるか、障害物がどこにあるか、それらの距離はどれくらいであるかを把握します。どの障害物が静的であるか、移動している障害物であるかなど、その後の運転決定に関連する情報。

SLAM VS BEV: SLAM は主に、さまざまなセンサーを通じて周囲の空間内のオブジェクトの構造をスキャンし、この情報を 3 次元データで記述します。BEV はセンサーのスキャンを通じて周囲の状況も取得し、この情報を記述するために主に 2 次元データを使用します。現在はSLAMの方が適用範囲が広く、ADが普及する前は主にVR/ARなどの分野で利用され、BEVは主にAD業界に集中していました。技術的な実装の観点から見ると、SLAM はさまざまな幾何学的/確率理論/グラフ理論/群理論関連のソフトウェア パッケージを含む従来の数学ツールに偏っていますが、BEV は基本的にディープ ニューラル ネットワーク DNN に基づいています。この 2 つを対立的に見ないことが最善であり、多くの場合、これらは互いに補完し合うことができます。

以下では、BEV の基本的な導入に焦点を当てます。

SLAMとBEVの最も基本的かつ中核となるセンサーはカメラ(Camera)であるため、両者の計算処理では画像の情報抽出・認識や変換計算に多くの計算能力が消費されます。SLAMは、特徴情報の下位情報に属する画像内の特徴点を認識し、別の画像上の特徴点の位置を計算することでシーンの構造やカメラ自身の姿勢(PositionとPose)を取得する傾向があります。フレーム。また、BEV は、畳み込みネットワーク CNN や Transformer が得意とする、車両/道路/歩行者/障害物などの高度な特徴情報を認識する傾向があります。

カメラには、主にカメラの CCD/CMOS 感光膜のサイズや解像度、光学レンズの係数などを記述する内部基準 (Intrinsics) と、光学レンズの係数を主に記述する外部基準 (Extrinsics) という 2 つの最も基本的なデータがあります。世界におけるカメラの性能 座標系における設置位置と向き角度

内部パラメータの一般的なマトリックスは次のとおりです。

f9dc21d339fb0455cf0d2d79b8a0350e.png

このうち、fx と fy はそれぞれ光学レンズの水平/垂直焦点距離 (Focus) を表しており、CCD/CMOS 感光シート上の画素単位が異なるため、通常は焦点距離が水平と垂直に分割されません。ピクセルが絶対正方形の場合、fx = fy を達成するのは実際には非常に困難です。わずかな違いがあり、光が通過した後、水平座標と垂直座標が単位距離で等距離にならないという問題が発生します。したがって、カメラモジュールのメーカーはこの差を測定しますが、fx と fy を与えることはもちろん、開発者がキャリブレーション (校正) プロセスを使用してこれら 2 つの値を測定することもできます。

109191b9f62025042ea18bfb3353871e.png
図1
8dbf819e0a7ed46575a1db2b8cacec00.png
図2

さらに、従来の光学分野では fx と fy のデフォルトの単位は mm:mm ですが、この分野ではデフォルトの単位はピクセル: ピクセルであるため、写真経験のある多くの人が fx と fy の値を見て非常に困惑しています。 、特に大きく、時には数千、この値はアマチュア天体望遠鏡をはるかに超えています。ここでピクセルが使用されるのはなぜですか? 以下を理解するために、内部パラメータを通じてカメラの FOV (視野、視野サイズ、通常は角度) を計算してみましょう。

6845812183d5e8f25168972f0c6b3670.png
画像3
0fffb4ac8202d28043820704d796​​bf3b.png

ここで、fy は縦方向の焦点距離、h は写真の高さです。h の単位がピクセルであるため、fy もピクセルである必要があります。コンピュータ処理の都合上、fx と fy の単位はピクセルに統一されます。実際、コンピュータは必要ありません。CCD/CMOS 感光フィルムには、通常、感光データをデジタル画像に変換するための別のチップ、ISP (Image Signal Processor) が組み込まれている必要があります。このチップは、ピクセル単位で使用できます。

この行列に加えて、内部基準には一連の歪み (Distortion) 係数 K があります。これについては詳しく説明しませんが、通常のレンズ撮影後、中心位置の変形は小さく、その周囲の変形は大きくなります。一般に、キャリブレーション(Calibration)によってこのパラメータを取得した後、写真にアンチディストーション処理を実行して、比較的「正常な」写真を復元します。写真上の特徴点の絶対位置は位置決めとマッピングの精度に直接関係しており、BEV コードのほとんどはこの歪み防止処理を考慮していないため、SLAM アルゴリズムはこの歪み防止の重要性を強調しています。 BEV はオブジェクト レベルでの高度な機能に焦点を当てており、ピクセル レベルでのわずかなオフセットはほとんど影響しませんが、一方で BEV プロジェクトの多くは、nuScenes/Argoverse などのトレーニング データを使用して論文を書くためのものであり、プロジェクトで奇妙なレンズを使用した場合でも、歪み防止の前処理を正直に行う必要があります。

d5bb679925684c803d08ed7773dbcef0.png
図4

外部パラメータは非常に単純で、1 つのオフセット (Transform) 係数と 1 つの回転 (Rotation) 係数です。

b7924bf5fa94988b260035c408f5021d.png

3D空間で回転を表現する計算方法としては、行列法(Matrix)とクォータニオン(Quaternion)の2つが一般的ですが、マトリックス法ではジンバルロック(Gimbal Lock)の問題を防ぐため、通常はクォータニオンを使って計算します。ただし、AD 分野ではこれが行われることはほとんどありません。カメラは車に固定されており、地面に垂直な軸 (通常は Z 軸) のみが 360 度回転できるため、ジンバルで問題が発生することはありません。ロールオーバー段階で自動運転を維持するという奇妙な要件を順守してください。したがって、BEV のコードは通常行列形式になりますが、SLAM は AR などの分野でも使用され、カメラは比較的固定されていないため、クォータニオンが使用されます。また、AD分野では遠近現象が考慮されていないため、外部パラメータはすべてアフィン行列(Affine Matrix)となり、CG分野の3Dレンダリングとは異なります。

また、一般記事で内部パラメータを紹介する際には、工場ではCCD/CMOS感光シートが機械によって傾いて取り付けられているため、回転ずれも考慮しますが、AD分野では一般的に考慮されていません。誤差が小さすぎるため、カメラが車両に設置されているため、外部パラメータ自体の相対回転が大きい場合は、それらを一緒に忘れて、最終的に DNN に渡して学習し、フィルタリングすることをお勧めします。 AR フィールドは外部パラメータを積極的に計算する必要があり、この霧雨は考慮されません。

内部パラメータと外部パラメータを理解したら、次の基本的な焦点は座標系です。AD にはいくつかの座標系があり、事前に明確にしないでコードを見るのは少しめまいを感じます。

  1. 世界座標系 (World Coordination)。これは現実世界空間における車両の位置と方位角です。通常、大まかな位置は GNSS (Global Navigation Satellite System) 衛星測位システムによって取得されます。GNSS には米国の GPS/中国が含まれますBDS/ヨーロッパ ガリレオ/マオジ GLONASS/日本 QZSS/インド IRNSS、それぞれに長所と短所があり、測位精度を説明するのは困難です。一般に、公称精度とは、車両がオープン エリアにある場合、いくつかの測位精度を指します。測位衛星があなたをカバーしている、車両が静止している、測位装置のアンテナが厚い、他の信号源からの干渉がある場合のテスト結果。あなたが高層ビル、さまざまな電波干渉源、あなたの前に現れたり消えたりする衛星に囲まれた都市にいて、車の速度が遅くない場合、この場合、あなたを数十倍オフセットするのが正しいですメートル。これには、差分基地局補正と地図トラフィック ビッグ データ補正の 2 つの一般的な解決策があります。これにより、衛星測位は非常に正確であると錯覚する可能性があります。どうやっても最終的な座標位置は緯度と経度ですが、従来のGIS(地理情報システム)と比べると、ADの緯度経度は球面座標系ではなく、2次元に展開した座標系になっています。システム間の差異もあります。たとえば、Google は WGS84 の経度と緯度を独自の地図の長方形スライス コードに変換します。Uber は六角形スライスの H3 座標コードを提案しました。 Baidu は、火星の座標、 の長方形のスライス座標などに基づいて BD09 を重ね合わせました。これらは絶対座標位置であり、同様の SLAM テクノロジーによってスキャンされた高精度マップには、これに基づいた相対座標も導入されます。とにかく、最終的にコード内に表示されるのは XY だけです。ただし、これらのシステムはいずれも車両の向き (地理的な北は 0 度、地理的な東は 90 度など、2D マップ上では依然として表示されます) を取得できないため、AD における車両の角度は「軌道」を指します。方向」では、現在の位置座標から直前の座標を減算して方向ベクトルを取得します。もちろん、高精度地図のサポートにより、SLAM テクノロジーにより車両の瞬間的な方位を計算することが可能です。トンネルを通過する場合など、GNSS 測位が不足している場合は、車両の IMU (慣性測定) を使用する必要があります。

  2. BEV トレーニング データ セットの世界座標系 (nuScenes World Coordination、他のトレーニング セットについては特に説明しません)。これは GNSS の絶対座標系とは異なります。

9bdec138675a6a1a372b68839768cdde.png
図5

これは nuScenes マップです。その世界座標系は画像座標系です。原点は画像の左下隅にあり、単位はメートルです。したがって、トレーニング データ セットを使用する場合、緯度と経度は考慮されません。データセットは、時系列に従って車両の瞬間位置、つまりこの写真上の XY を示します。

  1. エゴコーディネーション(エゴコーディネーション)、BEVでは、このエゴは特に車両自体を指し、カメラ/ライダー(ライダー、光検出および測距)/ミリ波レーダー(一般的なコードではレーダーと呼ばれます)を説明するために使用されます。 ) /IMU の車体への取り付け位置 (デフォルトの単位はメートル) と方位角です。座標の原点は一般に車体の中央であり、方位は図に示すとおりです。

375f90b3495ab58455a49f6443746cd1.png
図6

したがって、車の前部のカメラはデフォルトでヨー (Z 軸) を 0 度にし、外部行列は主にこの座標系を記述します。

  1. カメラ座標系 (Camera Coordination) は、写真座標系ではないことを覚えておいてください。座標原点は CCD/CMOS 感光性フィルムの中心にあり、単位はピクセルであり、主に内部参照 (Intrinsics Matrix) がこれを記述します。座標系。

  2. 写真座標系 (Image Coordination)、座標原点は写真の左上隅にあり、単位はピクセル、水平および垂直座標軸は通常 XY ではなく uv で表記されます。

1588cb52abfffe3d34cb75a4246f7c9e.png
図7

左、中央、右の 3 つの座標系セットは、自我調整、カメラ調整、画像調整です。

したがって、BEV で LSS (Lift、Splat、Shoot) を実行するときに、写真内のピクセル位置をワールド座標系に変換する必要がある場合は、次の手順を実行する必要があります。

Image_to_Camera、Camera_to_Ego、Ego_to_World、行列で表されます。

Position_in_World = Inv_World_to_Ego * Inv_Ego_to_Camera * Inv_Camera_to_Image * (Position_in_Image)

ここで、Inv_ は逆行列を表します。実際のコードでは、通常、Camera_to_Image は Intrinsics パラメーター行列であり、Ego_to_Camera は Extrinsics パラメーター行列です。

ここで注意すべき点は、fx、fy、実際には次のように計算されることです。

a0c4d143c17f0673a3b3bb447839cb00.png

Fx と Fy はレンズの水平/垂直焦点距離ですが単位はメートル、Dx と Dy はそれぞれピクセルの幅と高さで、fx と fy の単位はピクセルです。Ego 空間の座標に (Ego_to_Camera * Camera_to_Image) 行列を掛けると、ピクセル単位で写真空間に投影されます。写真空間の座標に (Inv_Ego_to_Camera * Inv_Camera_to_Image) 行列を掛けると、自我空間にメートル単位で投影されますが、ユニットには問題ありません。

ほとんどの BEV には複数のカメラが搭載されています。つまり、複数のカメラで撮影された写真のピクセルを一度にエゴ座標系またはワールド座標系に変換する必要があります。

c9f0bc9909b8c80b098e94a20ac4d52b.png
図8

統一された座標系の下では、複数の角度からの写真が周囲のシーンを正しく「取り囲む」ことができます。さらに、単眼カメラ用の BEV ソリューションがいくつかありますが、その中には正面を向いたカメラが 1 つだけあり (ヨー、ピッチ、ロールがすべて 0)、原点がカメラ自体であるため、エゴ座標系を考慮していないものもあります。 , したがって、カメラ座標系からワールド座標系に直接ジャンプします。

錐台、これは通常 3D レンダリングの分野で「視野円錐」と呼ばれ、カメラの可視範囲を表すために使用されます。

d157c237951eb69f2915ed4b68a0df7f.png
図9

赤い面、緑の面、ワイヤーフレームで囲まれた空間が視円錐と呼ばれ、通常、緑の面は近い面(Near Plane)、赤い面は遠い面(Far Plane)と呼ばれ、角度は視円錐と呼ばれます。 CCD/CMOS の場合、イメージングの高さと幅が同じであれば、近い面と遠い面は両方とも正方形であり、1 つの FOV で十分に表現できますが、そうでない場合は、FOV が必要です。 FOVx と FOVy を区別するためのものであり、この錐台の範囲を超えるオブジェクトは計算では考慮されません。図 7 では、結合された表示範囲は 6 つの三角形の面で構成されています。実際には、6 つの表示コーンで構成される必要があります。表示コーン間に重なり合う領域があることがわかります。これらの領域は、トレーニング中の DNN に役立ちます。 /reasoning, モデルの精度を向上させるために 6 つのデータセットを相互に補正します. カメラの数を増やさずに重複領域を拡大したい場合は、より大きな FOV のカメラを選択する必要がありますが、より大きな FOV のカメラを選択する必要があります一般に、レンズの歪みが深刻になると(いくら歪み補正を行っても、画像はある程度しか補正できません)、画像上のオブジェクトの結像領域が小さくなります。 DNN による画像上の特徴の認識と抽出を妨げます。

BEV は巨大なアルゴリズム群であり、さまざまな方向性でアルゴリズムを選択する傾向があります。大まかに言うと、テスラが支配する視覚ジャンルがあります。コアのアルゴリズムは複数のカメラで構築されます。もう 1 つの大きなカテゴリは、ライダー + ミリ波レーダー +マルチチャンネル路上カメラフュージョン(Fusion)派、国内AD企業の多くがフュージョン派、GoogleのWaymoもそうです。

厳密に言うと、テスラは BEV (ハイドラネット) から新しいテクノロジーである占有ネットワーク、2D から 3D に移行しています。

9b8f4d34aa813832f9194295b95fecc7.png
図10

2D であろうと 3D であろうと、彼らは周囲の空間の占有を表現しようとしていますが、1 つは 2D のチェッカーボードを使用して占有を表現し、もう 1 つは 3D のビルディング ブロックを使用して占有を表現しています。DNN は、この種の占有率を測定するときに確率を使用します。たとえば、特定のグリッド上に車が存在することが直感的にわかりますが、DNN によって得られる元の結果は次のようになります: このグリッドが車である確率は 80% であり、は路面であり、歩行者である確率は5%、歩行者である確率は3%である。したがって、BEV コードでは、考えられるさまざまなオブジェクトが通常、次の 2 つのカテゴリに分類されます。

  1. 頻繁に変更されないもの: 車両通信エリア (Driveable)、路面 (Road)、車線 (Lane)、建物 (Building)、植生 (葉/植生)、駐車エリア (Parking)、信号灯 (Traffic Light)、および一部の未分類の静的オブジェクト(静的)、それらの間の関係には相互に含めることができます。たとえば、Driveable には道路/車線などを含めることができます。

  2. 変数、つまり移動物体: 歩行者 (Pedestrian)、車 (Car)、トラック (Truck)、コーン交通標識/安全バレル (Traffic Cone) など。

この分類の目的は、AD のその後の運転計画 (プランニング、意思決定と訳される場合もあります) と制御 (コントロール) を容易にすることです。BEV の知覚 (Perception) 段階では、これらのオブジェクトがグリッド上に現れる確率がスコア付けされ、最後にソフトマックス関数によって確率が正規化されて、このグリッドを占めるオブジェクトの種類として最大の可能性が取り出されます。

しかし、小さな問題があります。BEV の DNN モデル (Model) のトレーニング段階では、写真内の各オブジェクトが何であるかを示す必要があるのでしょうか? つまり、ラベル付きデータ上のさまざまなオブジェクトにラベルを付ける必要があります。

46f9393a21e0e0a84e1d65ec055277c3.png
図11

右側のものをラベル付きデータとし、左側のものを対応する写真としましょう。このオブジェクト分類に従ってトレーニングされた DNN モデルは、実際に道路上で実行される必要があります。トレーニング セットには表示されませんか? では、モデルがうまく機能しない場合、たとえば、奇妙なポーズの人体が歩行者やその他の既知のタイプとして認識されない場合はどうなるでしょうか? このため、Occupancy Network は認識戦略を変更し、分類を重視しなくなりました (分類がないわけではありませんが、焦点が変わりました)。主な焦点は、道路上に障害物 (Obstacle) があるかどうかです。ただ、それにぶつからないように注意してください。タイプに関係なく。このような障害物は、3 次元の積み木で表現するのが適切であり、3 次元レンダリングの分野で一般的な概念 (Rendering/Shading) を借用して、この 3 次元表現を 3 次元表現と呼ぶ場合もあります。ボクセル (Voxel). 私の世界を想像してください ( MineCraft ) は簡単です。

2dec520a6eb6ed962da1c178d77c26e0.png
図12

以上がビジュアルジャンルの簡単な説明ですが、ハイブリッドスクールは何をやっているのでしょうか?カメラだけでなくライダーのデータにも力を入れており、ミリ波レーダーはデータの質が悪いため徐々に撤退し、残されたものはパーキングレーダーとして利用されているとは言えない。テスラは視覚処理を重視しつつも、ミリ波レーダーを前面に出し、AD分野の技術は急速に変化しているが、突然新たなアルゴリズムが登場し、ミリ波の価値が生まれるレーダーは前に引き継がれます。

LIDAR の利点: 物体の距離を直接測定でき、その精度は視覚によって推定されるシーンの深度よりもはるかに高く、通常は深度 (Depth) データまたは点群 (Point Cloud) に変換されます。 )、および 2 つのマッチング アルゴリズムには長い歴史があるため、AD を直接借用して開発量を減らすことができます。さらに、ライダーは夜間や悪天候でも機能する可能性があり、カメラが見えなくなる可能性があります。

しかし、ここ数日で、新しい認識技術 HADAR (Heat-Assisted Detection and Ranging) が登場しました。これは、カメラ/ライダー/ミリ波レーダーと並行できるセンサーレベルの認識技術です。夜間に従来の熱画像で撮影した画像を特殊なアルゴリズムを用いて周囲の環境・物体の質感や奥行きに変換するのが特徴で、この物体とカメラは夜間の知覚の問題を解決することができます。

以前の BEV がなぜ熱画像/赤外線カメラについて言及しなかったのかというと、従来のアルゴリズムには明らかな欠陥がいくつかあります。つまり、シーンの熱分布しか提供できず、グレースケール (Gray) 画像を形成し、テクスチャ (Texture) が欠如していて、元のデータには奥行き情報が含まれていない 計算された奥行きの精度が低い グレースケール画像から抽出した輪郭(Contour)と明るさの変化(Gradient)だけを使用すると、シーン/オブジェクトのボリューム情報を正確に復元することが困難現在の 2D オブジェクト認識は、テクスチャと色に大きく依存しています。この HADAR の出現により、この問題が解決されます。暗い環境でシーンの奥行きとテクスチャを抽出できます。

5fb7f9cc47d560979c48dbb0b987581e.png
図13

左の列、上から下:

  1. 基本的な熱画像処理 (T と呼ばれる)

  2. 従来の熱画像アルゴリズムを使用して T から抽出された深さ

  3. HADAR アルゴリズムを使用して T から抽出されたテクスチャ マップ

  4. HADAR アルゴリズムを使用して T から抽出された深さ

  5. 現実のシーンの奥行き

右列、上から下:

  1. 日中に可視光カメラで撮影したこのシーンの写真

  2. 写真でわかる推理の深さ

  3. 現実のシーンの奥行き

HADAR の深度情報は非常に古いので、LIDAR の効果を比較してください。

3ba969da92cb20d62b6879155be996e7.png
図14

LIDAR の走査範囲は限られており、通常は半径 100 メートルです。上図からわかるように、テクスチャ情報はなく、遠くの景色には奥行きがありません。走査線によってデータが疎(スパース)構造であり、半径をカバーする必要があります。大きくて密(デンス)であれば、より高価なモデルを購入する必要があります。しばらく停止してスイープするのが最善です。LiDARモジュールメーカーは自社製品を展示する際に、より良い写真を提供しなければならないのは当然ですが、その難しさはADの研究開発担当者のみが知っています。

上記は基本的な概念ですが、BEV アルゴリズムの入門として、まず LSS (Lift、Splat、Shoot) について言及する必要があります。

https://link.zhihu.com/?target=https%3A//github.com/nv-tlabs/lift-splat-shoot

Old Huang 氏の多くの記事では、これが BEV の画期的な作品として挙げられています。シンプルで効率的なプロセスを構築します。

カメラの写真を 2D データから 3D データに投影し、それをハエのように平らにして、この平らになったシーンを神の視点から見ると、特に地図を見る人々の直感的なモードと一致します。普通、これを見ると「3Dシーンデータが確立されているのに、3Dっていいんじゃないの?」と疑問を抱くでしょう。なぜまだ平らにしたいのですか?3D が欲しくないわけではありませんが、完璧な 3D データではないので仕方がありません。

83ac3d200220135636ecb3581835ac1e.png
図15

これを見たことがありますか? これが LSS の本質です 正面から見ると 2D 写真になります この写真が LSS によって 3D 空間に引き伸ばされたのが上の写真です BEV から見ると直接上がったり下がったり、どうなるでしょうか?何も表示されないので、splat(スプラ)のフォローアップ、具体的なプロセスは次のとおりです。

c3469e7613cd6da54322ef117241c829.png
図16

最初に画像の特徴と深度を抽出します (LSS で同時に抽出される特徴と深度については後で詳しく説明します)。深度マップは次のようになります。

cb701ba9b59775f296aa941ef85458c5.png
図17

似ているとしか言えませんが、正確ではありません。詳細は後ほど説明します。この深度情報は、図 15 のような疑似 3D モデル (点群点群モード) を構築できます。

5b44d9eadd1c48207f44ee3dd4959fe3.png
図18

見た目は大丈夫ですが、この 3D モデルを BEV の上面図にすると、母親はそれを認識しないと推定されます。

91c9184b02e53f3b1599dbcfd28a1c10.png
図19

平坦化した後、機能フィーチャーと組み合わせて別の意味認識を実行し、以下を形成します。

9dd967b747c04ab96c1398db4003208d.png
図20

こちらは人気のBEVマップです。以上がLSSの直感的な認識ですが、アルゴリズムレベルではどのように実現されているのでしょうか?

まず、1 台のカメラの撮影範囲用の立方体型のワイヤー ケージ (高さ 8、幅 22、奥行き 41) を構築し、強力な Blender を使用します。

e2f4ee25982d173a26a2340e30eface.png
図21

これは概略図です。グリッドの数とサイズに囚われないでください。この 3D グリッドはカメラの錐台 (Frustum) を全面的に表しており、錐台の形状が前面に貼り付けられています (図 9)。

c0d5a96efc9a8318952b344a7c93cba3.png
図22

右側は、写真から深度が抽出された後の、グリッド キューブに面したカメラの概略図です (深度マップの実際のピクセル サイズは高さ 8、幅 22)。

a50a0c2493b08d754760a8c517fd142f.png
図23

各ピクセルの深度に応じて、赤い線の方向に沿って深度マップを拡張した後 (リフト):

daff9cf9a7f5b1978745e9dab8e8cf12.png
図24

LSS は最初からケージの範囲が限られていると想定しており、超過部分は直接フィルターで除去されるため、一部の深度ピクセルが錐台の範囲を超えていることがわかります。ここで注意してください: LSS は各ピクセルの深さを直接計算するのではなく、各ピクセルがケージ内の各グリッドに存在する確率を推測します。図 24 は、Softmax を通じて各ピクセルがどのグリッドに位置する可能性が最も高いかを抽出しています。を作成し、それを対応するグリッドの概略的な結果に置き換えると、理解しやすくなります。より正確な説明は次のとおりです。

6ea2ebb1db3a9edf03575824e4804de0.png
図25

図 25 の深度マップの特定のピクセルを選択します (赤いグリッド、実際には、LSS 深度マップの解像度は非常に小さく、デフォルトは 8*22 ピクセルのみなので、ここではグリッドをピクセルとして使用できます) 、下端のケージ A 深度グリッドに属します (このグリッドは実際には、カメラが深さに沿って遠くを見る視線を表します)。

949177bd1542a81521f8b153acab85b3.png
図26

図 25 の赤色深度ピクセルの場合、図 26 の視線グリッドに沿った確率分布は次のとおりです。

c30438a8286b4ebdcd5cd21c52e60444.png
図27

黄色の線の浮き沈みは、リフト後の 3D 深度の視線に沿った 2D 深度マップ ピクセルの確率分布を表します (深度分布。厳密に実際のデータに従っているわけではなく、概略的に描いています)。LSS 論文のこの図に相当します。

af63689a3c80b4bfd0d46e128a2118ea.png
図28

LSS で立方体ケージを構築するためのコードは、次の場所にあります。

class LiftSplatShoot(nn.Module):
    def __init__(self, grid_conf, data_aug_conf, outC):
        self.frustum = self.create_frustum()
    def create_frustum(self):
        # D x H x W x 3
        frustum = torch.stack((xs, ys, ds), -1)
        return nn.Parameter(frustum, requires_grad=False)
    def get_geometry(self, rots, trans, intrins, post_rots, post_trans):
        """Determine the (x,y,z) locations (in the ego frame)
        of the points in the point cloud.
        Returns B x N x D x H/downsample x W/downsample x 3
        """
        B, N, _ = trans.shape

        # undo post-transformation
        # B x N x D x H x W x 3
        points = self.frustum - post_trans.view(B, N, 1, 1, 1, 3)
        points = torch.inverse(post_rots).view(B, N, 1, 1, 1, 3, 3).matmul(points.unsqueeze(-1))

        # cam_to_ego
        points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
                            points[:, :, :, :, :, 2:3]
                            ), 5)
        combine = rots.matmul(torch.inverse(intrins))
        points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
        points += trans.view(B, N, 1, 1, 1, 3)

        return points

分析を容易にするために、コードを削減しました。1 台のカメラの錐台サイズは、D x H x W x 3 (奥行き D: 41、高さ H: 8、幅 W: 22) です。つまり、D x H x W コンテナーが作成され、各グリッドはコンテナにはこのグリッドの座標値(X,Y,Z)が格納されます。

e680b1c26260c487152374e2505e8613.png
図29

実際、深さ Z で構成される新しい座標系が写真座標系 (uv) 上に拡張されます。LSS のデフォルトは 5 台のカメラであるため、5 つの錐台を get_geometry 関数に送信すると、5 つの錐台で構成される結合されたケージが出力され、そのテンソル サイズは次のようになります: B x N x D x H x W x 3 (ここで、B はデフォルトのバッチ サイズ)は 4 セットのトレーニング データ、N はカメラの数 5 です。

get_geometry では、最初に 1 つを実行する必要があります。

# undo post-transformation

これは何のためにあるのでしょうか?これはトレーニングセットに関係するのですが、ディープラーニングでは既存のトレーニングサンプルを強化する手法があり、一般にAugmentationと呼ばれています(AR技術のAはAugmentationで強化という意味です)。 /Zoom/Crop、サンプルにランダムなノイズ (ノイズ) を追加します。たとえば、サンプル強化前はカメラの角度は変化しませんが、トレーニング後、モデルはこの角度からの写真のみを認識し、ランダム強化後のトレーニング後、モデルは特定の角度範囲内での適応性を学習できます。堅牢性。

42f9e486630d9057bb47811e24019ce7.png
図30

オーグメンテーション技術にも関連する理論や手法があるので、ここでは写真を掲載し、詳細には触れません。データ拡張のコードは通常、DataLoader にあります。

class NuscData(torch.utils.data.Dataset):
   def sample_augmentation(self):

先ほどの get_geometry の話に戻りますが、データ拡張により写真にランダムな変更が加えられますが、DNN モデルがこれらのランダムな変更のルールを学習して適応できるように、カメラ自体を修正する必要があります。したがって、5-way Frustum をボディ座標系に配置するときは、まずこれらのランダムな変更を削除 (元に戻す) する必要があります。

次に、次のように渡します。

# cam_to_ego
        points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
                            points[:, :, :, :, :, 2:3]
                            ), 5)
        combine = rots.matmul(torch.inverse(intrins))
        points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
        points += trans.view(B, N, 1, 1, 1, 3)

各錐台をカメラ座標系から車両独自の座標系に転送します。ここでの intrins はカメラの内部パラメータであり、rot と trans はカメラの外部パラメータであることに注意してください。これらは nuScenes トレーニング セットによって提供されます。ここでは、内部関数は逆行列を使用しますが、外部関数にはパラメーターがありません。nuScenes は最初に各カメラをボディの原点に配置し、次にオフセット変換を実行してから、各カメラのポーズに従って回転を回転させるため、ここで逆計算をします。データ セットを変更する場合、またはデータを収集するために独自のカメラをセットアップする場合は、これらの変換行列の定義と計算順序を理解する必要があります。

4つのビューはおおよそ次のようなものです。

a0a2516341499fca5f3ffde1cc26fb4a.png
図31

LSS で深度と写真の特徴を推論するためのモジュールは、次の場所にあります。

class CamEncode(nn.Module):
    def __init__(self, D, C, downsample):
        super(CamEncode, self).__init__()
        self.D = D
        self.C = C

        self.trunk = EfficientNet.from_pretrained("efficientnet-b0")

        self.up1 = Up(320+112, 512)
        self.depthnet = nn.Conv2d(512, self.D + self.C, kernel_size=1, padding=0)

トランクは元の深度と画像の特徴を同時に推論するために使用されます デプスネットはトランクから出力された元のデータを LSS が必要とする情報に解釈するために使用されます デプスネットは畳み込みネットワークですが、畳み込みカーネル (Kernel) のサイズははわずか 1 ピクセルであり、関数は近いです。完全に接続されたネットワーク FC (Full Connected)、FC の毎日の作業は、分類またはフィッティングです。画像の特徴については、ここでの分類と同様です。深い特徴については、同様です。深さの確率分布をフィッティングします。EfficientNet は最適化された ResNet であり、高度な畳み込みネットワーク (CNN) として見ることができます。この畳み込みネットワークの場合、画像特徴と深度特徴の間に論理的な違いはなく、どちらもトランク上の同じ次元に位置し、チャネルを区別するだけです。

これは別のトピック、つまり単一の 2D 画像から深い特徴を推論/抽出する方法につながります。このタイプの問題は一般に、単眼深度推定、単眼深度推定と呼ばれます。一般に、このタイプのシステムには、大まかな処理 (Coarse Prediction) と細かい処理 (Refine Prediction) の 2 つの段階があり、粗い処理では画像全体のシーン レベルでの単純な奥行き推定が行われ、仕上げ処理では小さなオブジェクトを識別します。これに基づいて、より詳細な深度まで外挿します。これは、画家が最初に単純なストロークでシーンの輪郭を描き、次に部分的な絵の輪郭を詳細に描くのと似ています。

この種の深度推定問題を解決するために畳み込みネットワークを使用することに加えて、グラフ畳み込みネットワーク (GCN) とトランスフォーマー、さらには測距装置 (RangeFinder) に依存する DNN モデルもあります。 BEV 自体と同じくらい複雑です。

ここでの LSS は、深い特徴を取得するためにトランクのみを使用しますが、それは幼稚すぎるでしょうか、実際、その通りです。LSS によって推定される深度の精度と解像度は非常に悪いです。BEVDepth プロジェクトの LSS 深度の問題に関するさまざまなテスト レポートを参照してください。

https://link.zhihu.com/?target=https%3A//github.com/Megvii-BaseDetection/BEVDepth

BEVDepth テストでは、LSS 深度推定部分のパラメータが乱数に置き換えられ、学習プロセス (Back Propagation) が関与しない場合、BEV の全体的なテスト効果はわずかに減少するだけであることがわかりました。ただし、Lift 自体のメカニズムが非常に強力であることを説明する必要があり、この画期的な方法自体は問題ありませんが、深度推定のリンクをさらに強化することができます。

LSS のトレーニング プロセスには別の問題があります:写真のデータの約半分がトレーニングに寄与しません。実際、この問題はほとんどの BEV アルゴリズムに存在します

53b35db2b5e82f1c8c92845f5e5418c1.png
図32

右側のラベル付きデータは、実際には写真の赤い線の下の領域のみを記述しています。赤い線の半分は無駄になっています。LSS のモデルが上半分について何を計算するのかを尋ねる必要があります。わかりません。したがって、ほとんどの BEV はこの方法でトレーニングされているため、これは一般的な現象です。トレーニング中に、BEV は周囲のラベリング データの固定範囲を選択し、写真は通常、より遠くのシーンをキャプチャします。この 2 つは本質的に範囲が一致しません。一方、トレーニング セットの一部は路面ラベリングのみに焦点を当てており、アーキテクチャが欠けています。現在、BEV は主に運転の問題を解決し、建物や植生については考慮していません。

これが、図 17 の深度マップが LSS 内の実際の深度マップと一致しない理由です。実際の深度マップには、路面近くの有効なデータのみが含まれています。

8b59fc620f397b42535ef55ee8fed8ee.png
図33

したがって、BEV DNN モデル全体の計算能力の一部は必ず無駄になります。これまでのところ、この側面に関する研究論文は見たことがありません。

次に、LSS のリフト スプラット計算プロセスをさらに深く掘り下げていきます。

def get_depth_feat(self, x):
        x = self.get_eff_depth(x)
        # Depth
        x = self.depthnet(x)

        depth = self.get_depth_dist(x[:, :self.D])
        new_x = depth.unsqueeze(1) * x[:, self.D:(self.D + self.C)].unsqueeze(2)

        return depth, new_x    
   def get_voxels(self, x, rots, trans, intrins, post_rots, post_trans):
        geom = self.get_geometry(rots, trans, intrins, post_rots, post_trans)
        x = self.get_cam_feats(x)

        x = self.voxel_pooling(geom, x)

        return x

ここでの new_x は、深度確率分布に画像テクスチャ特徴量を直接乗算するものであり、直感的に理解するために、画像特徴量には 3 つのチャネル (c1、c2、c3) があり、深度は 3 つのグリッド (d1、d2、d3) のみであると仮定します。 。写真から特定のピクセルを取り出し、それぞれが表す意味は次のとおりです。 c1: このピクセルが車である可能性は 70% あります。 c2: 道路である可能性が 20% あります。 c3: 道路です。 10% の可能性、これは信号光です。d1: このピクセルが深さ 1 にある確率は 80%、d2: 深さ 2 にある確率は 15%、d3: 確率は %5 です。それは深さ3にあるということです。それらを掛け合わせると、次のようになります。

d3f8206f31272734b91e675775405505.png

この場合、このピクセルの最大確率は、深さ 1 にある車です。LSS には次のようなものがあります。

560989720b063e9edad3b9182e0b19d2.png

式の意味は、画像特徴 c (Context) と呼ばれることに注意してください。a_d の意味は、視線グリッドに沿った奥行きの確率分布であり、d は奥行きです。new_x はこの計算の結果です。前述したように、画像の特徴と深度は体幹を通じて学習されるため、同じ次元に位置しますが、異なるチャネルを占有し、深度は最初の自己 D (41) チャネルを占有し、コンテキストは後者の自己を占有します。 C(64)チャンネル。

new_x は各カメラの錐台に応じて個別に計算され、5 つの錐台には重複領域があるため、データの融合が必要となるため、グリッドのインデックスと対応する空間位置が voxel_pooling で計算されます。指定されたインデックスのグリッドに 1 つずつロードされます。

voxel_pooling における LSS の計算能力には、cumsum のメカニズムが導入されています。これについて説明している記事はたくさんありますが、ここで多大な労力を費やすことはお勧めできません。これはほんの小さな計算トリックであり、全体の飾りです。 LSS は必要ありません。

① ネットワーク全体で独占的なビデオコース

BEV知覚、ミリ波レーダービジョンフュージョン、マルチセンサーキャリブレーション、マルチセンサーフュージョン、マルチモーダル3D物体検出、点群3D物体検出、物体追跡、占有、cudaおよびTensorRTモデル展開、協調的知覚、セマンティックセグメンテーション、自動運転シミュレーション、センサー展開、意思決定計画、軌道予測などの学習ビデオ(スキャンコード学習)

ca19b5b7b29e59c89e3dec92977c29cd.png 動画公式サイト:www.zdjszx.com

② 中国初の自動運転学習コミュニティ

30 以上の自動運転技術スタックの学習ルートが含まれる約 2,000 人のコミュニケーション コミュニティ。自動運転の認識 (2D 検出、セグメンテーション、2D/3D 車線境界線、BEV 認識、3D 物体検出、占有、マルチセンサーフュージョン、マルチセンサーキャリブレーション、目標追跡、オプティカルフロー推定)、自動運転測位・自動マッピング(SLAM、高精度地図、ローカルオンライン地図)、自動運転計画制御・軌道予測等の技術ソリューション、AIモデル展開実戦、業界動向、求人発表、下のQRコードをスキャンして自動運転の中心となるナレッジプラネットに参加してください。ここは本物の乾物がある場所です。開始時のさまざまな問題について現場のリーダーとコミュニケーションを取り、勉強します、仕事中、転職中、毎日論文 + コード + ビデオを共有して、コミュニケーションを楽しみにしています。

055491ffe36d198bb3283cae1f67e251.png

③【Heart of Autopilot】技術交流グループ

The Heart of Autopilot は、物体検出、セマンティック セグメンテーション、パノラマ セグメンテーション、インスタンス セグメンテーション、キー ポイント検出、車線境界線、物体追跡、3D 物体検出、BEV 認識、マルチモーダル認識、占有、マルチに焦点を当てた初のオートパイロット開発者コミュニティです-センサーフュージョン、トランス、大型モデル、点群処理、エンドツーエンド自動運転、SLAM、オプティカルフロー推定、深度推定、軌道予測、高精度地図、NeRF、計画制御、モデル展開、自動運転シミュレーションテスト、製品マネージャー、ハードウェア構成、AI の求人検索とコミュニケーションなど。QR コードをスキャンして Autobot Assistant WeChat を追加し、グループへの参加を招待します。注: 学校/会社 + 方向 + ニックネーム (グループに参加する簡単な方法)

bfabfab2b6f5c0a1fa38df8fcac21768.jpeg

④【自動運転ハート】プラットフォームマトリックス、お問い合わせ大歓迎!

5f7f6b7f6257c617b3eb41bf87ebf3a9.jpeg

おすすめ

転載: blog.csdn.net/CV_Autobot/article/details/132114702