自监督行为识别-时空线索解耦


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

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

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

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

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

📘📚 所属专栏:人工智能话题分享

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

​​

​​

目录

引言

挑战1. 时空信息的混淆

挑战2.数据增强的局限性

挑战3. 未考虑方法的可迁移性

1.论文概述

2.核心创新点

2.1 双向解耦编码器

2.2 跨域对比损失的构建

2.3 结构化数据增强

结构引导的空间掩码

基于管道的时间掩码

3.项目部署

3.1准备工作

3.2 数据准备

生成数据

3.3 训练&测试

训练

测试

4.bug修改


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

2024年人工智能顶会AAAI会议论文复现
SCD-Net: Spatiotemporal Clues Disentanglement Network for
Self-Supervised Skeleton-Based Action Recognition

引言

  自监督骨架行为识别是一种利用未标记的骨架数据进行行为识别的方法。传统的行为识别方法通常需要大量标记好的数据进行训练,但标记数据的获取成本高昂。自监督学习通过设计自动生成标签的任务,可以在缺乏标记数据的情况下进行训练。


  在自监督骨架行为识别中,骨架数据可以通过传感器或深度摄像头等设备获取。这些数据包含了人体关节的位置和运动信息。自监督学习任务的关键是设计一种能够从未标记的骨架数据中自动生成标签的方法。

  在训练过程中,使用未标记的骨架数据进行自监督学习,生成伪标签。然后,将生成的伪标签用于监督骨架行为识别模型的训练。通过这种方式,自监督学习可以在缺乏标记数据的情况下,提供一种有效的方法进行骨架行为识别。

那么目前自监督骨架行为还面临哪些挑战呢?

挑战1. 时空信息的混淆

编码器负责将输入映射到可以进行对比的潜在空间。而之前的大多数方法专注于通过常用的时空建模网络获得统一的信息。他们的设计导致了时间、空间信息的纠缠,无法为随后的对比措施提供明确的指示。

挑战2.数据增强的局限性

此外,现有技术往往局限于规模转换(常见的增强策略,比如裁剪、旋转),这导致无法充分利用数据增强的潜力。

挑战3. 未考虑方法的可迁移性

优化过程中,大多数方法都专注于在相同的表示水平上构建对比对;
忽略域之间的差距(同一任务下或数据集中)。

1.论文概述

  SCD-NET(SCD-Net: Spatio temporal Clues Disentanglement Network forSelf-Supervised Skeleton-Based Action Recognition AAAI2024)引入了一种新的对比学习框架,即时空线索解耦网络(SCD-Net)。
  具体来说,将解耦模块与特征提取器相结合,分别从空间和时间域获得明确的线索。对于SCD-Net的训练,构建了一个全局锚点,鼓励锚点与提取的线索相互作用。此外,本文提出了一种具有结构约束的新的掩码策略,以加强上下文关联,利用掩码图像建模到所提出的SCD-Net。
  从实验结果来看,在NTU-RGB+D(60&120)和PKUMMD (I&II)数据集进行了广泛的评估,涵盖了各种下游任务,如动作识别、动作检索、迁移学习和半监督学习。实验结果证明了该方法的有效性,显著优于现有的最先进(SOTA)方法。

2.核心创新点

  为了解决自监督在面临的三个挑战,该文分别提出三种方法分别应对。首先在时空信息混淆的问题上,作者提出双向接口编码器;数据增强方面,分别在时间、空间上分设置不同的数据增强策略;方法的可迁移性方面设置了跨越对比损失,详细架构可见下文。
  SCD-NET整体架构如下所示:骨架数据->数据增强(data augmentation)后,分别送入编码器层(encoder)以及动量编码器层(Momentum encoder).每个编码器都使用了双向解耦编码器,在经过特征抽取器(feature extractor)后,分别对空间解耦(spatial decoupling)、时间解耦(temporal decoupling)操作,获取不同维度的特征。动量编码器得到的输出作为键向量,正常编码器得到的输出作为查询向量,最后将键向量、查询向量进行对比学习。

2.1 双向解耦编码器

  一般来说,从骨架序列中提取的特征被描述为描述动作的复杂时空关联。然而,本文认为这种范式并不适用于对比学习。由于信息的纠缠性很大,很难为后续的比较提供明确的指导。在SCD-Net中,本文提倡一种双路解耦编码器,从复杂的序列信息中分别提取出时间、空间信息以获得更好的判别性表示。
  双向解耦编码器构造如下图:分为建模(projection)和细化(refinement)阶段,空间部分对CT维度进行合并,保留V(代表骨骼关节)维度,而后进行嵌入操作得到骨架图->序列化–>transformer 编码器->空间池化->空间特征;时间部分对CC维度进行合并,保留T(代表视频帧)维度,而后进行嵌入操作得到关节序列->序列化–>transformer 编码器->时间池化->时间特征;

# 双向解耦编码器
        vt = self.gcn_t(x)
        vt = rearrange(vt, '(B M) C T V -> B T (M V C)', M=2)
        vt = self.channel_t(vt)
        vs = self.gcn_s(x)
        vs = rearrange(vs, '(B M) C T V -> B (M V) (T C)', M=2)
        vs = self.channel_s(vs)
        vt = self.t_encoder(vt) # B T C
        vs = self.s_encoder(vs)
        # implementation using amax for the TMP runs faster than using MaxPool1D
        # not support pytorch < 1.7.0
        vt = vt.amax(dim=1)
        vs = vs.amax(dim=1)
        return vt, vs

2.2 跨域对比损失的构建

使用解耦的时空表示,本文首先通过以下方式获得最终表示,ZS、Zt分别表示对空间时间特征的归一化后的特征,其中Fs, Ft是对应的投影函数,在通过函数映射后得到查询特征向量qs 、qt


空间和时间域之间存在明显的差距,为此本文引入了与两者兼容的全局视角qg作为与时间、空间特征对比的中介,其中Fg是联合时空对应的投影函数。


基于这些候选特征,本文定义了一个新的跨域损失。设计的核心在于锚定全局表示,并将其与其他编码器获得的其他表示建立关联。损失函数定义为:


这样设计的目的是减少跨域带来的识别精度下降,所以在损失函数的设计上,要对比每一种查询编码器和键编码器的组合,在空间、时间、全局都进行对比损失。

 # 正负样本以及损失函数的设计
    def forward(self, q_input, k_input):
        三种查询向量的定义
        qt, qs, qi = self.encoder_q(q_input)  # queries: NxC

        qt = nn.functional.normalize(qt, dim=1)
        qs = nn.functional.normalize(qs, dim=1)
        qi = nn.functional.normalize(qi, dim=1)

        # 计算key特征
        with torch.no_grad():  # no gradient to keys
            self._momentum_update_key_encoder()  # update the key encoder

            kt, ks, ki = self.encoder_k(k_input)  # keys: NxC

            kt = nn.functional.normalize(kt, dim=1)
            ks = nn.functional.normalize(ks, dim=1)
            ki = nn.functional.normalize(ki, dim=1)
        # 正负样本
        l_pos_ti = torch.einsum('nc,nc->n', [qt, ki]).unsqueeze(1)
        l_pos_si = torch.einsum('nc,nc->n', [qs, ki]).unsqueeze(1)
        l_pos_it = torch.einsum('nc,nc->n', [qi, kt]).unsqueeze(1)
        l_pos_is = torch.einsum('nc,nc->n', [qi, ks]).unsqueeze(1)

        l_neg_ti = torch.einsum('nc,ck->nk', [qt, self.i_queue.clone().detach()])
        l_neg_si = torch.einsum('nc,ck->nk', [qs, self.i_queue.clone().detach()])
        l_neg_it = torch.einsum('nc,ck->nk', [qi, self.t_queue.clone().detach()])
        l_neg_is = torch.einsum('nc,ck->nk', [qi, self.s_queue.clone().detach()])
        # 损失函数
        logits_ti = torch.cat([l_pos_ti, l_neg_ti], dim=1)
        logits_si = torch.cat([l_pos_si, l_neg_si], dim=1)
        logits_it = torch.cat([l_pos_it, l_neg_it], dim=1)
        logits_is = torch.cat([l_pos_is, l_neg_is], dim=1)

        logits_ti /= self.T
        logits_si /= self.T
        logits_it /= self.T
        logits_is /= self.T

2.3 结构化数据增强

  本位在空间、时间部分分别提出了不同的增强策略,空间部分提出结构引导的空间掩码,时间部分提出基于管道的时间掩码。

结构引导的空间掩码

  考虑到骨架的物理结构,当选择某个关节进行掩码时,模型可能通过周围的点学习到相关信息,掩码效果不佳。通过施加结构约束,本文的方法在当前随机选择的关节或框架周围的局部区域内应用掩码操作,而不是仅依赖于孤立的点本文同时对其相邻区域的进行掩码。让本文用矩阵p来表示邻接关系,如果关节i和j连通,则Pij = 1,否则Pij= 0。令D = Pn。为了施加结构约束,当节点i被选中时,本文对Dij != 0的所有节点j执行相同的增强操作。

基于管道的时间掩码

  基于管道的时间掩码的核心思想是通过将时间序列数据分为多个管道,并为每个管道生成对应的时间掩码,来提取关键的行为特征。具体而言,时间掩码是一种二进制序列,用于指示时间序列中的重要时间段。通过对时间序列数据进行分割,并根据具体的行为任务和特征需求,选择性地将时间掩码应用于每个管道。结构图图下:
  这种方法的优势在于,它可以将注意力集中在对行为识别最有用的时间段上,从而提高模型对关键动作的感知能力。时间掩码的生成可以根据不同的策略进行,如基于阈值、基于能量或基于模式识别等方法。生成的时间掩码可以作为输入数据的权重,用于调整模型对不同时间段的重视程度。

3.项目部署

3.1准备工作

  • Pytorch环境

  • 安装依赖包,运行以下命令即可

pip install -r requirements.txt

3.2 数据准备

生成数据

下载数据集

数据处理

  • 用以下代码处理数据: python ntu_gendata.py.

3.3 训练&测试

训练

  • 训练 NTU-RGB+D 60数据集 在 Cross-Subject 评价标准下的预训练模型, 运行以下命令
    python ./pretraining.py --lr 0.01 --batch-size 64 --encoder-t 0.2   --encoder-k 8192 \
                --checkpoint-path ./checkpoints/pretrain/ \
                --schedule 351  --epochs 451  --pre-dataset ntu60 \
                --protocol cross_subject --skeleton-representation joint

测试

  • 测试论文给出模型在行为识别任务下NTU-RGB+D 60 数据集 Cross-Subject 评价标准上的结果, 运行以下命令
    python ./action_classification.py --lr 2 --batch-size 1024 \
                --pretrained ./checkpoints/pretrain/checkpoint.pth.tar \
                --finetune-dataset ntu60 --protocol cross_subject --finetune_skeleton_representation joint

  • 测试论文给出模型在行为检索任务下NTU-RGB+D 60 数据集 Cross-Subject 评价标准上的结果, 运行以下命令
    python ./action_retrieval.py --knn-neighbours 1 \
                --pretrained ./checkpoints/pretrain/checkpoint.pth.tar \
                --finetune-dataset ntu60 --protocol cross_subject --finetune-skeleton-representation joint

4.bug修改

在复现原文代码的时候,直接运行运行./pretraining文件,会出现如下错误:


错误如下
TypeError: init() got an unexpected keyword argument ‘batch_first’
原因分析
init方法没有参数‘batch_first’,所以将batch_first删去即可。在更改batch_first参数的请务必同时输入数据进行同步调整。具体来说,batch_first=True时的输入维度为 (batch, seq, feature),否则对应的输入维度需要调整为(seq, batch, feature)
解决方法
将报错代码中encoder_layer部分替换为如下代码,即可正常运行:

        encoder_layer = TransformerEncoderLayer(self.d_model, num_head, self.d_model)
        self.t_encoder = TransformerEncoder(encoder_layer, num_layer)
        self.s_encoder = TransformerEncoder(encoder_layer, num_layer)

    def forward(self, x):
        
        vt = self.gcn_t(x)

        vt = rearrange(vt, '(B M) C T V -> B T (M V C)', M=2)
        vt = self.channel_t(vt)

        vs = self.gcn_s(x)
        
        vs = rearrange(vs, '(B M) C T V -> B (M V) (T C)', M=2)
        vs = self.channel_s(vs)

        # batch_first=True时的输入维度为 (batch, seq, feature),
        # 否则对应的输入维度需要调整为(seq, batch, feature)
        # 通过transpose函数调整维度
        vt = vt.transpose(0, 1)  # 调整为 (T, B, M*V*C)
        vs = vs.transpose(0, 1)  # 调整为 (T, B*M*V, C)

        vt = self.t_encoder(vt) # 
        vs = self.s_encoder(vs) #

        vt = vt.amax(dim=1)
        vs = vs.amax(dim=1)

        return vt, vs

​​

<think>好的,用户想了解UHI-NTL时空解耦的技术原理或实现方法。首先,我需要明确UHI和NTL分别代表什么。UHI是城市热岛效应,而NTL是夜间灯光数据。时空解耦指的是将这两者在时间和空间上的影响分离开来,以更准确地分析它们各自的变化和相互作用。 接下来,我应该回忆一下相关领域的研究方法。可能涉及到遥感数据的处理,比如使用卫星数据来获取地表温度和夜间灯光数据。需要考虑到时间序列分析和空间统计方法,比如时间分解模型和空间回归模型。此外,机器学习方法可能被用来处理大量的时空数据,识别模式和分离变量。 然后,用户提到的引用链接可能涉及到Google Earth Engine的应用,因为链接是code.earthengine.google.com的。这可能意味着实现方法中会用到GEE平台进行大规模遥感数据处理。例如,使用Landsat或MODIS数据获取地表温度,结合VIIRS的夜间灯光数据。在GEE中,可以处理长时间序列的数据,进行时间滤波和空间分析。 技术原理方面,时空解耦可能需要分别处理时间和空间维度的影响因素。比如,时间上分解长期趋势、季节变化和随机波动;空间上分析城市结构、土地利用类型对热岛和灯光的影响。可能需要使用统计模型如面板数据回归或地理加权回归(GWR)来量化各因素的贡献。 实现步骤可能包括:数据预处理(去云、校正)、时间序列分解(如STL分解)、空间异质性分析、建立解耦模型(如线性混合模型)、验证模型准确性(交叉验证)等。同时,机器学习方法如随机森林或深度学习可能用于特征提取和变量分离。 需要注意的是,用户提供的引用链接虽然与热岛和夜间灯光相关,但具体内容可能涉及GEE的脚本示例。可能需要参考这些脚本中的数据源和处理方法,比如使用Landsat地表温度产品和VIIRS NTL数据,进行时空匹配和分析。 最后,生成的相关问题需要围绕技术细节、数据源、模型应用和实际案例展开,帮助用户进一步深入了解。</think>### UHI-NTL时空解耦技术原理与实现方法 #### 一、技术原理 UHI(城市热岛效应)与NTL(夜间灯光数据)时空解耦的核心在于**分离热环境与人类活动的时空异质性影响**。其理论基础包含: 1. **时间维度解耦**:通过时间序列分解(如STL分解)提取UHI的长期趋势、季节周期和残差项,同时分析NTL的年际变化特征[^1] 2. **空间维度解耦**:利用空间回归模型(如地理加权回归GWR)量化地表类型、植被覆盖、建筑密度等空间变量对热岛效应的贡献度 3. **协变量分析**:引入人口密度、能源消耗等社会经济数据作为控制变量,建立如下的解耦模型: $$ \Delta T_{UHI} = \alpha \cdot NTL + \beta \cdot X_{cov} + \epsilon $$ 其中$X_{cov}$表示协变量矩阵,$\alpha,\beta$为系数矩阵 #### 二、实现方法 **典型技术路线**(基于Google Earth Engine平台): ```python # 伪代码示例:时空解耦核心流程 def UHI_NTL_decoupling(): # 1. 数据获取 LST = ee.ImageCollection("MODIS/006/MOD11A2") # 地表温度 NTL = ee.ImageCollection("NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG") # 夜间灯光 # 2. 时空对齐 aligned_data = temporal_matching(LST, NTL) # 时间插值对齐 .spatial_resample(1000) # 空间重采样 # 3. 趋势分解 lst_trend = stl_decomposition(LST) # 使用Seasonal-Trend分解 ntl_trend = harmonic_analysis(NTL) # 谐波分析 # 4. 空间回归 covariates = ee.Image.cat([DEM, NDVI, UrbanMask]) # 高程/植被/城市掩膜 model = ee.Regression.spatialGWR( features = covariates, target = lst_trend ) # 5. 残差提取 uhi_residual = lst_trend.subtract(model.predict()) return uhi_residual, model.coefficients() ``` #### 三、关键技术创新点 1. **多源数据融合**:整合热红外遥感(Landsat/MODIS)、夜间灯光(VIIRS)、POI等多维度数据 2. **时空尺度转换**:采用混合像元分解技术处理不同分辨率数据的空间匹配问题 3. **机器学习增强**:结合随机森林特征重要性分析,识别主导因子[^2] 4. **不确定性量化**:通过蒙特卡洛模拟评估解耦结果的置信区间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值