【传知代码】无监督目标检测最新CVPR解读(论文复现)

前言:当今的计算机视觉领域,目标检测一直是研究的热点与难点。传统的目标检测方法往往依赖于大量的标注数据和复杂的监督学习流程,这不仅增加了数据收集和标注的成本,也限制了这些方法在真实世界应用中的泛化能力。然而,随着深度学习技术的飞速发展,尤其是无监督学习方法的兴起,我们迎来了目标检测领域的新变革,希望通过本文的解读,读者能够深入了解无监督目标检测技术的最新进展,激发对计算机视觉领域研究的兴趣和热情。让我们一起期待无监督目标检测技术在未来能够为我们带来更多的惊喜和突破!

本文所涉及所有资源均在传知代码平台可获取

目录

概述

核心代码

使用方式

写在最后


概述

今天我们介绍一篇CVPR2024的最新无监督三维目标检测的SOTA工作,这篇论文介绍了一种名为Commonsense Prototype-based Detector(CPD)的方法,用于解决无监督三维目标检测中的挑战,可以点击 论文地址 进行查看,如下图所示:

        在当前的无监督三维目标检测方法中,通常采用基于聚类的伪标签生成和迭代式自训练过程。然而,由于激光雷达扫描的稀疏性,导致生成的伪标签存在尺寸和位置上的错误,从而影响了检测性能。为了应对这一问题,该论文提出了一种基于常识原型的检测器(CPD),以提高无监督三维目标检测的性能,如下所示:

        无监督学习与传统的全监督学习有所区别,它要求在没有任何数据标记的前提下,从数据集中吸取特定的知识。目前有多种基于不完备信息的半监督分类算法用于解决这一问题。常用的策略有预先的训练和启示性的算法等。传统的DBSCAN方法是直接对点云数据进行分类,进而模拟出较为粗糙的边界结构。MODEST技术采用了多次在场景中的遍历来判断物体是否在移动,并依据一些基础知识来过滤掉不合逻辑的伪标签。该方法具有很强的鲁棒性和精确性,但也有不足,例如在大数据环境下需要人工参与。OYSTER利用近距离的点聚类方法来培训一个目标探测器,并借助CNN的平移等变特性来产生远距离的伪标签,接着利用目标路径的时间一致性来抽取自我监控的信号。这些方法都能有效地检测出运动对象在不同时刻发生的变化情况。显然,这些建议的方法都有其固有的限制,并且它们的准确性不高。 

        在三维目标检测领域,一个至关重要的议题是如何获得高品质的伪标签(pseudo label)。在三维场景下,为了提高伪标签的质量,必须对其进行聚类分析以获取最优解。由于基于聚类生成的伪标签往往表现得非常粗略和不精确,因此有必要构建一个能够生成高品质伪标签的系统架构。本文提出了一种新的、有效的、快速高效的方法来生成高质量的伪标签。CPD的技术主要分为三个核心部分:

1)伪标签初始化

        作者观察到,连续帧中的一些静止物体看起来更完整。作者通过使用一种多帧聚类(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,α,β,τ]。分别代表检测框的位置、长宽高、方位角、类别和跟踪标识。

2)伪标签标签优化

        基于原型学习的方法是近年来无监督学习中常见的一种策略,方法希望网络能够从代表性样本(即Prototype)中学习到特征,并且通过这些典型样例,进一步将其泛化为更为复杂的场景。初始化伪标签时可能会得到很多伪标签位置与尺寸都不精确,而且因为点云稀疏,所以点云上的例子也会不全面。因此,从点云数据中筛选出高品质的典型原型变得尤为关键。笔者的思路是根据从完整物体上获得的无监督评分来构造一个优质CProto集来对不完整物体进行伪标签细化。区别于OYSTER仅能细化被扫描物体中至少1个完整物体的伪标签,CBR方法能够细化全部物体伪标签并显着减小总体尺寸及位置误差。

        笔者设计了测量这些伪标签质量优劣的CSS分数,以筛选出优质常识原型。该方法仅依赖于基础的常识知识来近似评估IoU在全监督评估中的表现。例如:离得较近的点中相对应的例子完整性可能相对较好,汽车、人员等对象通常都有长宽比范围。以及基于优质常识原型调整初始化标签。

3)自训练

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

(1) CSS-Weighted Detection Loss,它根据标签质量分配不同的训练权重来抑制虚假监督信号。

(2)几何对比度损失,将稀疏扫描点的预测与密集的CProto对齐,从而提高特征的一致性。

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

核心代码

下面这段代码的作用是定义了一个用于处理Waymo无监督数据集的类,并提供了初始化函数来配置数据集的相关参数,并准备好加载数据集的样本序列列表:

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

下面这段配置文件提供了一个完整的目标检测模型的定义,包括输入数据的处理、特征提取、以及最终的目标检测过程:

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.tar 到 data/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}

写在最后

        回顾这些最新的研究成果,无监督目标检测技术的魅力在于其摆脱了对大量标注数据的依赖,使得模型能够直接从无标签的图像中学习到目标对象的特征。这不仅降低了数据收集和标注的成本,也为目标检测技术的广泛应用提供了更加灵活和便捷的途径。我们也看到了无监督目标检测技术在多个方面的突破。从模型的架构设计到优化算法的创新,再到实验验证的严谨性,这些研究都展示了研究者们对无监督目标检测技术的深入理解和不断探索的精神。

        然而,无监督目标检测技术仍然面临着诸多挑战。如何进一步提高模型的检测精度和泛化能力,如何更好地处理复杂场景下的目标检测问题,以及如何将无监督目标检测技术与其他计算机视觉任务相结合,都是未来研究需要重点关注的方向。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取

【传知科技】关注有礼     公众号、抖音号、视频号

### 多光谱目标检测论文复现代码实现 在深度学习框架中,PyTorch 和 TensorFlow 是最常用的两种工具。对于多光谱目标检测论文复现,通常需要关注以下几个方面: #### 1. 框架选择 如果计划使用 TensorFlow 进行实验,则需要注意 TensorFlow 2.x 版本已经废弃了 `tf.contrib` 模块[^1]。因此,在尝试运行旧版代码时可能需要降级到 TensorFlow 1.x 或者对代码进行兼容性修改。 另一方面,PyTorch 提供了一种更直观的方式处理张量操作和动态计算图构建,这使得它成为许多研究者的首选框架之一。尤其当涉及到复杂的自定义层设计或多模态输入融合时,PyTorch 的灵活性显得尤为重要。 #### 2. 数据准备与预处理 多光谱图像的数据结构往往比统 RGB 图像复杂得多。为了有效利用这些额外波段的信息,可以采用如下策略: - **标准化**: 对不同波段分别执行均值方差归一化。 - **增强技术应用**: 如随机裁剪、翻转等常规手段外还需考虑特定于多光谱特性的变换方式。 可以通过设置断点来观察各个阶段 tensor 形状变化情况从而更好地理解网络内部工作原理并调整参数配置[^3]。 #### 3. 模型架构搭建 无论是基于 Faster R-CNN, YOLO 系列还是 RetinaNet 构建的目标检测器都需要适配至能够接收多通道输入的形式。以下是用 PyTorch 定义一个多输入分支 ResNet 骨干网的一个简单示例: ```python import torch.nn as nn class MultiSpectralResNet(nn.Module): def __init__(self, num_bands=8): # Assuming input has 8 bands super(MultiSpectralResNet, self).__init__() self.conv1 = nn.Conv2d(num_bands, 64, kernel_size=7, stride=2, padding=3,bias=False) ... def forward(self,x): out=self.conv1(x) ... return out ``` 而对于 TensorFlow 用户来说,虽然路径相似但由于 API 差异较大故具体编码形式会有所不同。值得注意的是实际项目开发过程中可能会遇到各种预料之外的问题比如即使成功移植官方样例程序也可能因为迁移失败而导致性能下降严重等问题[^4]。 综上所述,无论选用哪种框架都建议先仔细阅读原始文献弄清楚其核心贡献所在再着手编程实践;另外积极参与开源社区交流分享经验教训也是提高效率的好办法!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦世凡华、

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值