ホームページ > 記事 > テクノロジー周辺機器 > クロスモーダル トランスフォーマー: 高速かつ堅牢な 3D オブジェクト検出用
現在、自動運転車には、ライダーやミリ波レーダー、カメラセンサーなど、さまざまな情報収集センサーが搭載されています。現在の観点から見ると、さまざまなセンサーが自動運転の認識タスクにおいて大きな発展の可能性を示しています。たとえば、カメラによって収集された 2D 画像情報は豊富な意味特徴をキャプチャし、LIDAR によって収集された点群データは、知覚モデルにオブジェクトの正確な位置情報と幾何学情報を提供できます。さまざまなセンサーから得られる情報を最大限に活用することで、自動運転の知覚プロセスにおける不確実要素の発生を低減し、知覚モデルの検出ロバスト性を向上させることができます。 Megvii 自動運転知覚論文からの論文であり、今年の ICCV2023 ビジョン サミットに選ばれました。この記事の主な特徴は、PETR のようなエンドツーエンド BEV 知覚アルゴリズムです (フィルター処理に NMS 後処理操作を使用する必要がなくなりました)冗長な知覚結果).フレーム)を追加し、同時に LIDAR の点群情報を追加してモデルの知覚パフォーマンスを向上させています。自動運転知覚の方向性に関する非常に優れた論文です。記事へのリンクと公式のオープンソース ウェアハウスのリンクは次のとおりです。
論文のリンク: https://arxiv.org/pdf/2301.01283.pdf全体のアルゴリズム ブロック図からわかるように、アルゴリズム モデル全体は主に 3 つの部分で構成されています。
Lidar バックボーン ネットワーク カメラ バックボーン ネットワーク (Image Backbone Lidar Backbone): 点群と周囲の画像を取得するために使用されます。機能は、Point Cloud Token**(PC Tokens)
Tensor([bs * N, 2048, H/16, W/16])
出力: 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 スケルトン抽出画像の特徴
Neck (CEFPN)
# 上記の紹介によると、位置コーディングの生成には主に 3 つの部分、つまり画像位置埋め込み、点群位置埋め込み、およびクエリ埋め込みが含まれます。以下では、その生成プロセスを 1 つずつ紹介します。
# を使用します。 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_sizebatch_y = (batch_y + 0.5) / y_sizecoord_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.pipos = pos * scaledim_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_tpos_y = pos[..., 1, None] / dim_tpos_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维的高维向量
オブジェクトクエリ、画像トークン、ライダートークン間の類似度計算を行うためにより正確には、論文へのクエリ埋め込みは、位置エンコーディングを生成する Lidar とカメラのロジックを使用して生成されます。具体的には、クエリ埋め込み = 画像位置埋め込み (以下の rv_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 座標系の初期点です。画像位置埋め込みの生成プロセスを追跡するには、最初に BEV 座標系の 3D 空間点を画像座標系に投影し、次に前世代の画像位置埋め込みの処理ロジックを使用して、次のことを保証する必要があります。生成プロセスのロジックは同じです。以下はコア コードです: 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() > 0proj_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] = 0)& (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 を生成するための埋め込み。
実験結果からわかります。その結果、CMT-L 知覚モデルのパフォーマンスは FUTR3D および UVTR を上回り、ライダー点群データとカメラ データ収集後の両方を使用した場合、CMT は FUTR3D、UVTR、TransFusion、BEVFusion などの既存のマルチモーダル知覚アルゴリズムを大幅に上回りました。
まず、位置エンコーディングを使用するかどうかを決定するために、一連のアブレーション実験を実施しました。実験結果により、NDS インジケーターと mAP インジケーターは、画像と LIDAR の位置エンコーディングを同時に使用すると最良の結果が得られることがわかりました。次に、アブレーション実験のパート (c) と (f) では、さまざまなタイプとボクセル サイズの点群バックボーン ネットワークを実験しました。パート (d) と (e) のアブレーション実験では、カメラ バックボーン ネットワークの種類と入力解像度のサイズに関して異なる試みを行いました。上記は実験内容を簡単にまとめたものですが、より詳細なアブレーション実験について知りたい場合は、元の記事を参照してください
最後に、CMTの知覚結果をnuScenesのデータ上に視覚的に表示してみましょう実験結果から、CMT の方が依然として優れた知覚結果を持っていることがわかります。
概要現在、さまざまなモダリティを融合してモデルの知覚パフォーマンスを向上させることが人気の研究方向性になっています(特に自動運転車には複数のセンサーが装備されています)。一方、CMT は完全にエンドツーエンドの認識アルゴリズムであり、追加の後処理ステップを必要とせず、nuScenes データセットで最先端の精度を実現します。この記事はこの記事を詳しく紹介しています。皆様のお役に立てれば幸いです。以上がクロスモーダル トランスフォーマー: 高速かつ堅牢な 3D オブジェクト検出用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。