この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転載したものです。転載については出典元にお問い合わせください。 現在、自動運転車には、ライダー、ミリ波レーダー、カメラセンサーなど、さまざまな情報収集センサーが搭載されています。現在、複数のセンサーの融合は、自動運転の認識タスクにおいて大きな発展の見通しを示しています。たとえば、カメラで収集された 2D 画像情報は豊富な意味的特徴を捉え、LIDAR で収集された点群データは、物体の正確な位置情報と幾何学的情報を認識モデルに提供できます。異なる種類のセンサーによって得られた情報を最大限に活用することで、自動運転の認識プロセスにおける不確実性要因の発生を減らし、認識モデルの検出堅牢性を向上させることができます。 本日は、今年の ICCV2023 Vision Summit に選ばれた Megvii の自動運転認識に関する論文を紹介します。この論文の主な特徴は、PETR などのエンドツーエンドの BEV 認識アルゴリズムに類似していること (認識結果の冗長フレームをフィルタリングするために NMS 後処理操作を使用する必要がなくなった) と、同時に、LIDAR のポイント クラウド情報を使用してモデルの認識パフォーマンスを向上させていることです。自動運転認識に関する非常に優れた論文です。記事へのリンクと公式のオープン ソース リポジトリは次のとおりです。 - 論文リンク: https://arxiv.org/pdf/2301.01283.pdf
- コードリンク: https://github.com/junjie18/CMT
CMTアルゴリズムモデルの全体構造次に、まず次の図に示すように、CMT 知覚モデル全体のネットワーク構造を紹介します。 アルゴリズムブロック図全体から、アルゴリズムモデル全体が主に3つの部分で構成されていることがわかります。 - 画像バックボーン + Lidar バックボーン: ポイント クラウドとサラウンド イメージの特徴を取得し、ポイント クラウド トークン (PC トークン)と画像トークン(Im トークン) を取得するために使用されます。
- 位置コーディングの生成: さまざまなセンサーによって収集されたデータ情報に対して、 Im Tokens は対応する座標位置コーディングIm PEを生成し、 PC Tokens は対応する座標位置コーディングPC PEを生成し、 Object Queriesも対応する座標位置コーディングQuery Embeddingを生成します。
- Transformer Decoder + FFNネットワーク: 入力はオブジェクトクエリ+クエリ埋め込みと、クロスアテンション計算のための位置エンコーディングを完了したImトークンとPCトークンであり、FFNは最終的な3Dボックス+カテゴリ予測を生成するために使用されます。
ネットワークの全体的な構造を紹介した後、上記の 3 つのサブ部分を詳しく見ていきましょう。 画像バックボーン + LiDAR バックボーン- ポイント クラウド データの特徴を抽出するために一般的に使用される LiDAR バックボーン ネットワークには、次の 5 つの部分が含まれます。
- 点群情報のボクセル化
- ボクセル特徴エンコーディング
- 3Dバックボーン(一般的に使用されるVoxelResBackBone8xネットワーク)は、ボクセル特徴エンコーディングの結果から3D特徴を抽出します。
- 3DバックボーンをフィーチャのZ軸に抽出し、圧縮してBEV空間のフィーチャを取得します。
- 2Dバックボーンを使用して、BEV空間に投影された特徴をさらに適合させる
- 2D Backbone が出力する特徴マップのチャンネル数は、Image が出力するチャンネル数と一致しないため、畳み込み層を使用してチャンネル数を揃えます (この記事のモデルでは、チャンネル数の揃えが行われていますが、これは元の点群情報抽出の範囲には属しません)
- 2D 画像の特徴を抽出するために一般的に使用されるカメラ バックボーン ネットワークには、次の 2 つの部分が含まれます。
入力: 2Dバックボーン出力特徴マップを16倍および32倍にダウンサンプリング 出力: ダウンサンプリングされた16倍と32倍の画像特徴を融合して、ダウンサンプリングされた16倍の特徴マップを取得します。 Tensor([bs * N, 1024, H / 16, W / 16]) Tensor([bs * N,2048,H / 16,W / 16]) Tensor([bs * N,256,H / 16,W / 16]) 入力: ResNet-50ネットワークを使用してサラウンドビュー画像の特徴を抽出します 出力: 16倍と32倍にダウンサンプリングされた出力画像の特徴 入力テンソル: Tensor([bs * N,3,H,W]) 出力テンソル: Tensor([bs * N,1024,H / 16,W / 16]) 出力テンソル: ``Tensor([bs * N, 2048, H/32, W/32])` 画像特徴の2Dバックボーン抽出 首(CEFPN)
位置エンコーディングの生成上記の紹介によると、位置エンコーディングの生成には、主に画像位置埋め込み、ポイントクラウド位置埋め込み、クエリ埋め込みの 3 つの部分が含まれます。以下では、それぞれの生成プロセスを紹介します。 - 画像位置埋め込み (Im PE)
画像位置埋め込みの生成プロセスは、PETR の画像位置エンコーディングの生成ロジックと同じです (詳細については、ここでは詳しく説明しませんので、元の PETR 論文を参照してください)。これは、次の 4 つのステップに要約できます。
- 画像座標系で3D画像錐台点群を生成する
- 3D画像円錐点群は、カメラの固有パラメータ行列を使用してカメラ座標系に変換され、3Dカメラ座標点が取得されます。
- カメラ座標系の3Dポイントは、cam2ego座標変換行列を使用してBEV座標系に変換されます。
- 変換されたBEV 3D座標はMLPレイヤーを使用して位置エンコードされ、最終的な画像位置エンコードが取得されます。
- ポイントクラウド位置埋め込み (PC PE)
ポイント クラウド位置埋め込みの生成プロセスは、次の 2 つのステップに分けられます。 BEV 空間のグリッド座標点では、 pos2embed() 関数を使用して、2 次元の水平および垂直座標点を高次元の特徴空間に変換します。
# 点云位置编码`bev_pos_embeds`的生成bev_pos_embeds = self.bev_embedding(pos2embed(self.coords_bev.to(device), num_pos_feats=self.hidden_dim)) def coords_bev(self): x_size, y_size = (grid_size[0] // downsample_scale,grid_size[1] // downsample_scale) meshgrid = [[0, y_size - 1, y_size], [0, x_size - 1, x_size]] batch_y, batch_x = torch.meshgrid(*[torch.linspace(it[0], it[1], it[2]) for it in meshgrid]) batch_x = (batch_x + 0.5) / x_size batch_y = (batch_y + 0.5) / y_size coord_base = torch.cat([batch_x[None], batch_y[None]], dim=0) # 生成BEV网格. coord_base = coord_base.view(2, -1).transpose(1, 0) return coord_base # shape: (x_size * y_size, 2) def pos2embed(pos, num_pos_feats=256, temperature=10000): scale = 2 * math.pi pos = pos * scale dim_t = torch.arange(num_pos_feats, dtype=torch.float32, device=pos.device) dim_t = temperature ** (2 * (dim_t // 2) / num_pos_feats) pos_x = pos[..., 0, None] / dim_t pos_y = pos[..., 1, None] / dim_t pos_x = torch.stack((pos_x[..., 0::2].sin(), pos_x[..., 1::2].cos()), dim=-1).flatten(-2) pos_y = torch.stack((pos_y[..., 0::2].sin(), pos_y[..., 1::2].cos()), dim=-1).flatten(-2) posemb = torch.cat((pos_y, pos_x), dim=-1) return posemb # 将二维的x,y坐标编码成512维的高维向量
空間変換にMLPネットワークを使用して、チャネル数の調整を確実にする
クエリの埋め込み
オブジェクト クエリ、イメージ トークン、および Lidar トークン間の類似度の計算をより正確にするために、この論文のクエリ埋め込みでは、Lidar とカメラによる位置エンコーディングの生成ロジックを使用して、具体的には、クエリ埋め込み = 画像位置埋め込み (以下の rv_query_embeds と同じ) + ポイント クラウド位置埋め込み (以下の bev_query_embeds と同じ) を生成します。
bev_query_embeds 生成ロジック
論文のオブジェクトクエリはもともと BEV 空間で初期化されていたため、ポイントクラウド位置埋め込み生成ロジックの位置エンコーディングと bev_embedding() 関数は直接再利用できます。対応するキーコードは次のとおりです。 def _bev_query_embed(self, ref_points, img_metas): bev_embeds = self.bev_embedding(pos2embed(ref_points, num_pos_feats=self.hidden_dim)) return bev_embeds # (bs, Num, 256)
rv_query_embeds 生成ロジック
前述のように、Object QueryはBEV座標系の初期点です。したがって、論文のImage Position Embeddingの生成プロセスに従うには、まずBEV座標系の3D空間点を画像座標系に投影し、次に前世代のImage Position Embeddingの処理ロジックを使用して、生成プロセスのロジックが同じであることを確認する必要があります。コアコードは次のとおりです。 def _rv_query_embed(self, ref_points, img_metas): pad_h, pad_w = pad_shape # 由归一化坐标点映射回正常的roi range下的3D坐标点ref_points = ref_points * (pc_range[3:] - pc_range[:3]) + pc_range[:3] points = torch.cat([ref_points, ref_points.shape[:-1]], dim=-1) points = bda_mat.inverse().matmul(points) points = points.unsqueeze(1) points = sensor2ego_mats.inverse().matmul(points) points =intrin_mats.matmul(points) proj_points_clone = points.clone() # 选择有效的投影点z_mask = proj_points_clone[..., 2:3, :].detach() > 0 proj_points_clone[..., :3, :] = points[..., :3, :] / ( points[..., 2:3, :].detach() + z_mask * 1e-6 - (~z_mask) * 1e-6 ) proj_points_clone = ida_mats.matmul(proj_points_clone) proj_points_clone = proj_points_clone.squeeze(-1) mask = ( (proj_points_clone[..., 0] < pad_w) & (proj_points_clone[..., 0] >= 0) & (proj_points_clone[..., 1] < pad_h) & (proj_points_clone[..., 1] >= 0) ) mask &= z_mask.view(*mask.shape) coords_d = ( 1 + torch.arange(depth_num).float() * (pc_range[4] - 1) / depth_num) projback_points = (ida_mats.inverse().matmul(proj_points_clone)) projback_points = torch.einsum("bvnc, d -> bvndc", projback_points, coords_d) projback_points = torch.cat( [projback_points[..., :3], projback_points.shape[:-1]], dim=-1) projback_points = (sensor2ego_mats.matmul(intrin_mats).matmul(projback_points)) projback_points = (bda_mat@ projback_points) projback_points = (projback_points[..., :3] - pc_range[:3]) / (pc_range[3:] - self.pc_range[:3]) rv_embeds = self.rv_embedding(projback_points) rv_embeds = (rv_embeds * mask).sum(dim=1) return rv_embeds 上記の変換により、BEV 空間座標系の点が画像座標系に投影され、以前に生成された画像位置埋め込みの処理ロジックを使用して rv_query_embeds が生成されます。 最後に、クエリ埋め込み = rv_query_embeds + bev_query_embeds
トランスデコーダー + FFN ネットワーク- トランスデコーダー
ここでの計算ロジックはTransformerのDecoderと全く同じですが、入力データが若干異なります。
- 最初のポイントはメモリです。ここでのメモリは、イメージ トークンと Lidar トークンの連結の結果です (2 つのモードの融合として理解できます)。
- 2 番目のポイントは位置エンコーディングです。ここでの位置エンコーディングは、rv_query_embeds と bev_query_embeds の連結の結果であり、query_embed は rv_query_embeds + bev_query_embeds です。
- FFN ネットワークの機能は PETR とまったく同じです。具体的な出力結果は元の PETR テキストに記載されていますので、ここでは詳細には触れません。
論文の実験結果まず、CMTと他の自動運転認識アルゴリズムの比較実験を公開しましょう。著者らは、nuScenesのテストセットと検証セットで比較しました。実験結果は次のとおりです。 - nuScenes テスト セットにおけるさまざまな認識アルゴリズムの認識結果の比較。表のモダリティは、認識アルゴリズムに入力されるセンサー カテゴリを表し、C はカメラ センサーを表し、モデルにはカメラ データのみが供給されます。 L は LiDAR センサーの略で、モデルにはポイント クラウド データのみが供給されます。 LC は LiDAR とカメラ センサーの略で、モデル入力はマルチモーダル データです。実験結果によると、CMT-C モデルのパフォーマンスは BEVDet や DETR3D よりも高いことが示されています。 CMT-L モデルのパフォーマンスは、CenterPoint や UVTR などの純粋な LiDAR 認識アルゴリズム モデルよりも高くなります。 CMT は、LIDAR ポイント クラウド データとカメラ データを使用することで、既存のすべてのシングル モーダル メソッドを上回り、SOTA 結果を達成します。
- nuScenes の val セットでのモデルの知覚結果の比較。実験結果によると、CMT-L 知覚モデルのパフォーマンスは FUTR3D および UVTR のパフォーマンスを上回っています。 CMT は、LIDAR ポイント クラウド データとカメラ データの両方を使用すると、FUTR3D、UVTR、TransFusion、BEVFusion などの既存のマルチモーダル認識アルゴリズムを大幅に上回り、評価セットで SOTA 結果を達成します。
次はCMTイノベーションのアブレーション実験部分です まず、(a) 位置エンコーディングを使用するかどうかについてアブレーション実験を実施しました。結果によると、画像とライダーの位置エンコーディングを同時に使用した場合、NDS インジケーターと mAP インジケーターが最良の結果を達成しました。部分 (c) と (f) のアブレーション実験では、主に、ポイント クラウド バックボーン ネットワークのさまざまなタイプのバックボーン ネットワークとボクセル サイズを試します。部分 (d) と (e) のアブレーション実験では、主にさまざまなタイプのカメラ バックボーン ネットワークと入力解像度サイズを試します。このセクションは、大まかな概要にすぎません。より詳細なアブレーション実験をご覧になりたい場合は、元の論文をお読みください。 最後に、nuScenes データセットにおける CMT の知覚結果の視覚化を示します。実験結果から、CMT が依然として良好な知覚結果を示していることがわかります。 要約する現在、さまざまなモダリティを融合してモデルの知覚性能を向上させることが、注目されている研究方向となっています(結局のところ、自動運転車にはさまざまなセンサーが搭載されています)。同時に、CMTは完全にエンドツーエンドの知覚アルゴリズムであり(追加の後処理手順は不要)、nuScenesデータセットでSOTA精度を備えています。この記事では、この記事をより詳しく紹介しますので、皆さんのお役に立てれば幸いです。 オリジナルリンク: https://mp.weixin.qq.com/s/Fx7dkv8f2ibkfO66-5hEXA |