无监督目标检测最新CVPR解读

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

[Commonsense Prototype for Outdoor Unsupervised 3D Object Detection (CVPR 2024解读)](#Commonsense Prototype for Outdoor Unsupervised 3D Object Detection (CVPR 2024解读))

引言

相关工作

方法

伪标签初始化

[用于标签优化的常识原型约束框正则化(CProto-constrained Box Regularization,CBR)](#用于标签优化的常识原型约束框正则化(CProto-constrained Box Regularization,CBR))

[常识原型约束自训练(CProto-constrained Self-Training,CST)](#常识原型约束自训练(CProto-constrained Self-Training,CST))

效果对比

核心代码

数据集处理

网络定义

配置文件

使用方式

环境安装

Waymo数据集准备

训练和评估


本文所有资源均可在该地址处获取。

Commonsense Prototype for Outdoor Unsupervised 3D Object Detection (CVPR 2024解读)

论文地址 | 项目地址 | 讲解视频

引言

今天我们介绍一篇CVPR2024的最新无监督三维目标检测的SOTA工作,这篇论文介绍了一种名为C ommonsense P rototype-based D etector(CPD)的方法,用于解决无监督三维目标检测中的挑战。在当前的无监督三维目标检测方法中,通常采用基于聚类的伪标签生成和迭代式自训练过程。然而,由于激光雷达扫描的稀疏性,导致生成的伪标签存在尺寸和位置上的错误,从而影响了检测性能。为了应对这一问题,该论文提出了一种基于常识原型的检测器(CPD),以提高无监督三维目标检测的性能。

相关工作

与传统全监督学习不同的是,无监督学习要求在数据完全无标记的情况下从数据集中学习到一定知识。常见的方法包括预训练、启发式算法等。传统的DBSCAN 直接对点云进行聚类,从而拟合粗糙的边界框。MODEST 方法使用了通过对场景中多次遍历,来确定物体是否移动,并根据一些常识信息滤除不合理的伪标签。OYSTER通过近距离点聚类,来训练一个目标检测器,并使用CNN的平移等变性来生成远距离的伪标签,然后通过目标轨迹的时间一致性来提取自我监督信号。当然,这些方法都存在一定局限性,并且精度较低。

方法

三维目标检测中一个极为重要的问题在于:如何得到高质量的伪标签(pseudo label) 。基于聚类生成的伪标签通常是极为粗糙和不准确的,因此需要设计一个生成高质量伪标签的架构。CPD的方法主要包括三个部分:

  • (1)伪标签初始化
  • (2)伪标签标签优化
  • (3)自训练

伪标签初始化

作者观察到,连续帧中的一些静止物体看起来更完整。作者通过使用一种多帧聚类(Multi-Frame Clustering)的策略来初始化伪标签。具体做法是将将一个连续的点云序列:{x−n,...,xn}{x−n​,...,xn​}拼接,x−nx−n​代表前n帧点云,xnxn​代表后n帧。并通过计算点云的PP-Score来确定运动点,并移出当前帧之外的所有运动点,避免运动伪影对标签生成产生影响。并通过去除地面、DBSCAN、拟合检测框等操作来得到初步的伪标签b={bj}jb={bj​}j​,bj=[x,y,z,l,w,h,α,β,τ]bj​=[x,y,z,l,w,h,α,β,τ]。分别代表检测框的位置、长宽高、方位角、类别和跟踪标识。

用于标签优化的常识原型约束框正则化(CProto-constrained Box Regularization,CBR)

基于原型学习的方法是近年来无监督学习中常见的一种策略,方法希望网络能够从代表性样本(即 Prototype) 中学习到特征,并通过这些典型样例来进一步泛化到更复杂的情况。在初始化伪标签过程中,我们可能获得许多伪标签的位置和大小是不准确的,并且由于点云的稀疏性,点云中的实例可能是并不完整的。因此,如何从点云中挑选典型的高质量原型非常重要。作者的想法是基于来自完整对象的无监督评分构建高质量的 CProto 集,以细化不完整对象的伪标签。与 OYSTER只能细化至少有一个完整扫描的对象的伪标签不同,本文的CBR方法可以细化所有对象的伪标签,显着降低整体大小和位置误差。

作者通过设计一个CSS分数来衡量这些伪标签质量的好坏,从而选取高质量的常识原型。它仅使用常识知识来近似实现全监督评估中IoU的效果。例如:距离较近的点所对应的实例的完整性可能会比较高,汽车和人等物体一般会具有一定的长宽比范围。并根据高质量的常识原型来对初始化标签进行调整。

常识原型约束自训练(CProto-constrained Self-Training,CST)

在上面的过程中,通过基于常识原型对伪标签进行了调整。然而,即使在细化之后,一些伪标签仍然不准确,降低了正确监督的有效性,并可能误导训练过程。因此作者设计两部分损失函数解决这一问题:

特别地,如pipeline所示,作者设计了两个网络:检测网络FdetFdet和原型网络FproFpro。

  • (1) CSS-Weighted Detection Loss,它根据标签质量分配不同的训练权重来抑制虚假监督信号。
    Ldetcss=1N∑iωi(Lipro+Lidet),ωi={0sicss<SLsicss−SLSH−SLSL<sicss<SH1sicss>SHLdetcss=N1∑iωi(Lipro+Lidet),ωi=⎩⎪⎨⎪⎧0SH−SLsicss−SL1sicss<SLSL<sicss<SHsicss>SH
  • (2)几何对比度损失,将稀疏扫描点的预测与密集的CProto对齐,从而提高特征的一致性。

效果对比

作者将CPD和先前的无监督目标检测方法进行了对比,说明了CPD性能的有效性。

核心代码

数据集处理

class WaymoUnsupervisedDataset(DatasetTemplate):
    def __init__(self, dataset_cfg, class_names, training=True, root_path=None, logger=None, test_iter=0):
        super().__init__(
            dataset_cfg=dataset_cfg, class_names=class_names, training=training, root_path=root_path, logger=logger,
            test_iter=test_iter
        )
        self.data_path = self.root_path / self.dataset_cfg.PROCESSED_DATA_TAG
        self.split = self.dataset_cfg.DATA_SPLIT[self.mode]
        split_dir = self.root_path / 'ImageSets' / (self.split + '.txt')
        self.sample_sequence_list = [x.strip() for x in open(split_dir).readlines()]

        self.only_top_lidar = dataset_cfg.TL
        self.sampling = dataset_cfg.SAMPLING

        self.infos = []
        self.include_waymo_data(self.mode)

网络定义

OpenPCDet提供各种主流的backbone框架,可以根据自己的求修改配置文件和网络架构。它定义了一个父类Detector3DTemplate作为基本的检测器框架,不同检测器继承这个类,并根据自己的要求修改。

class Detector3DTemplate(nn.Module):
    def __init__(self, model_cfg, num_class, dataset):
        super().__init__()
        self.model_cfg = model_cfg
        self.num_class = num_class
        self.dataset = dataset
        self.class_names = dataset.class_names
        self.register_buffer('global_step', torch.LongTensor(1).zero_())

        self.module_topology = [
            'vfe', 'backbone_3d', 'map_to_bev_module', 'temporal_model',
            'backbone_2d', 'dense_head','pfe', 'wrap_head',  'point_head', 'roi_head'
        ]
        self.num_frames=dataset.num_frames

        self.test_filp=dataset.test_flip

配置文件

OpenPCDet可以通过修改.yaml定义自己的模型和数据集。

CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist']

DATA_CONFIG:
    _BASE_CONFIG_: cfgs/dataset_configs/waymo_unsupervised/waymo_unsupervised_cproto.yaml
    NUM_FRAMES: 1
    LABEL_OFFSET: 0.0
    POINT_FEATURE_ENCODING: {
        encoding_type: absolute_coordinates_encoding,
        used_feature_list: ['x', 'y', 'z', 'intensity', 'time'],
        src_feature_list: ['x', 'y', 'z', 'intensity', 'time']}

MODEL:
    NAME: VoxelRCNN

    VFE:
        NAME: MeanVFE

    BACKBONE_3D:
        NAME: VoxelResBackBone8x
        NUM_FILTERS: [16, 32, 64, 128]
        RETURN_NUM_FEATURES_AS_DICT: True
        OUT_FEATURES: 128
        MM: True
        FREEZE_TEACHER: False

    MAP_TO_BEV:
        NAME: HeightCompression
        NUM_BEV_FEATURES: 256

    BACKBONE_2D:
        NAME: BaseBEVBackbone

        LAYER_NUMS: [5, 5]
        LAYER_STRIDES: [1, 2]
        NUM_FILTERS: [128, 256]
        UPSAMPLE_STRIDES: [1, 2]
        NUM_UPSAMPLE_FILTERS: [256, 256]

   ......

使用方式

环境安装

基本环境:

  • Linux (tested on Ubuntu 14.04/16.04/18.04/20.04/21.04)
  • Python 3.6+
  • PyTorch 1.1 or higher (tested on PyTorch 1.1, 1,3, 1,5~1.10)
  • CUDA 9.0 or higher (PyTorch 1.3+ needs CUDA 9.2+)
  • spconv v2.x

安装OpenPCDet

git clone https://github.com/open-mmlab/OpenPCDet.git
cd OpenPCDet
pip install -r requirements.txt
python setup.py develop

Waymo数据集准备

  • 下载waymo官方数据集Waymo Open Dataset,

  • 解压所有 xxxx.tardata/waymo/raw_data文件夹下。(798 train tfrecord and 202 val tfrecord ):
    结构目录如下:

    CPD
    ├── data
    │ ├── waymo
    │ │ │── ImageSets
    │ │ │── raw_data
    │ │ │ │── segment-xxxxxxxx.tfrecord
    | | | |── ...
    | | |── waymo_processed_data_train_val_test
    │ │ │ │── segment-xxxxxxxx/
    | | | |── ...
    │ │ │── pcdet_waymo_track_dbinfos_train_cp.pkl
    │ │ │── waymo_infos_test.pkl
    │ │ │── waymo_infos_train.pkl
    │ │ │── waymo_infos_val.pkl
    ├── pcdet
    ├── tools

然后运行:

python3 -m pcdet.datasets.waymo.waymo_tracking_dataset --cfg_file tools/cfgs/dataset_configs/waymo_unsupervised/waymo_unsupervised_cproto.yaml

训练和评估

# 分布式训练
cd tools
sh dist_train.sh {cfg_file}

或者运行

cd tools
python train.py 

# 评估
cd tools
sh dist_test.sh {cfg_file}

​​

相关推荐
桂月二二2 分钟前
利用ChatGPT API构建智能应用的最佳实践
人工智能·chatgpt
科技与数码2 小时前
倍思氮化镓充电器分享:Super GaN伸缩线快充35W
人工智能·神经网络·生成对抗网络
zhangfeng11332 小时前
selenium已经登陆了 我怎么查看 网页 在fRequest xhr 的数据呢
开发语言·python
HUIBUR科技3 小时前
量子计算遇上人工智能:突破算力瓶颈的关键?
人工智能·量子计算
CES_Asia4 小时前
CES Asia 2025聚焦量子与空间技术
人工智能·科技·数码相机·金融·量子计算·智能手表
程序猿阿伟4 小时前
《量子比特:解锁人工智能并行计算加速的密钥》
人工智能·量子计算
music&movie5 小时前
代码填空任务---自编码器模型
python·深度学习·机器学习
盖丽男5 小时前
机器学习的组成
人工智能·机器学习
风一样的树懒5 小时前
Python使用pip安装Caused by SSLError:certificate verify failed
人工智能·python
9命怪猫6 小时前
AI大模型-提示工程学习笔记5-零提示
人工智能·笔记·学习·ai·提示工程