视频序列和射频信号多模态融合算法Fusion-Vital解读

  • 概述
    • 模型整体流程
    • 视频帧时间差分归一化
    • TSM模块
    • 视频序列特征融合模块
    • 跨模态特征融合模块

概述

最近看了Fusion-Vital的视频-射频(RGB-RF)融合Transformer模型。记录一下,对于实际项目中的多模态数据融合有一定参考价值。原始论文,参考实现源码。
具体来说,Fusion-Vital模型首先将多帧视频RGB图像投影到一个共享的时间差分域中,以有效捕捉微小的生理信号,同时避免全局运动的干扰。
对于RF射频模态,利用多普勒特性,通过短时傅里叶变换(STFT)生成时间-频率图像,作为时间差分域的替代指标。
模型采用并行编码分支,分别处理RGB和RF数据,并引入多级特征融合模块,利用交叉注意力机制在时间差分域中对齐和融合两种模态的特征。

模型整体流程

在这里插入图片描述

整个模型有以下模块组成:

  1. 时序移动模块(TSM)
  2. RGB通路(运动分支 + 外观分支)
  3. RF通路(射频分支)
  4. 注意力机制(Attention)
  5. 两次跨模态交互块(CrossAttentionModule)
  6. 池化与Dropout
  7. 最终MLP输出

输入输出

  1. 输入:
    rgb_input: 形状为 (B, C=3, T, H, W),视频帧序列。
    rf_input: 形状为 (B, C=4, T, F),射频信号时频特征。
  2. 输出:
    bvp :形状为 (B, T),这里为脉搏波形。
    在这里插入图片描述

视频帧时间差分归一化

  1. 连续的视频帧时间差分归一化处理。
  2. 维度变换​:
    输入:(B, C, T, H, W)
    输出:(B, C, T, H, W)
def diff_normalize_data(x):"""Calculate discrete difference in video data along the time-axis and nornamize by its standard deviation."""B, C, T, H, W = x.shape# denominatordenominator = torch.ones((B, C, T, H, W), dtype=torch.float32, device=x.device)for j in range(T - 1):denominator[:, :, j, :, :] = x[:, :, j + 1, :, :] + x[:, :, j, :, :] + 1e-7x_diff = torch.cat([torch.zeros((B, C, 1, H, W), device=x.device), x.diff(dim=2)], dim=2) / denominatorx_diff = x_diff / x_diff.view(B, -1).std(dim=1)[:, None, None, None, None]x_diff[torch.isnan(x_diff)] = 0return x_diff

TSM模块

在这里插入图片描述

  1. 通道分割​:将特征通道分为3部分:
    前1/3:向前时序移位(用下一帧的特征替换当前帧)
    中1/3:向后时序移位(用上一帧的特征替换当前帧)
    后1/3:保持不变
  2. 维度变换​:
    输入:(B×T, C, H, W)
class TSM(nn.Module):def __init__(self, n_segment=32, fold_div=3):super(TSM, self).__init__()self.n_segment = n_segmentself.fold_div = fold_divdef forward(self, x):nt, c, h, w = x.size()n_batch = nt // self.n_segmentx = x.view(n_batch, self.n_segment, c, h, w)fold = c // self.fold_divout = torch.zeros_like(x)out[:, :-1, :fold] = x[:, 1:, :fold]  # shift leftout[:, 1:, fold: 2 * fold] = x[:, :-1, fold: 2 * fold]  # shift rightout[:, :, 2 * fold:] = x[:, :, 2 * fold:]  # not shiftreturn out.view(nt, c, h, w)

视频序列特征融合模块

在这里插入图片描述

  1. 运动分支:对输入的时序差分特征(diff_input)做两次卷积和两次TSM,得到 d2。
    外观分支:对原始输入做两次卷积,得到 r2。
    注意力分支:对外观分支 r2 做 1x1 卷积和 sigmoid,得到注意力权重 g1。
    融合:d2 * g1,得到融合后的 rgb1
  2. 输入:diff_input, raw_input → (BT, C, H, W)
    输出:rgb1 → (B
    T, nb_filters1=32, H, W)
# 第一次和第二次卷积
diff_input = self.TSM_1(diff_input)
d1 = torch.tanh(self.motion_conv1(diff_input))
d1 = self.TSM_2(d1)
d2 = torch.tanh(self.motion_conv2(d1))
r1 = torch.tanh(self.apperance_conv1(raw_input))
r2 = torch.tanh(self.apperance_conv2(r1))
g1 = torch.sigmoid(self.apperance_att_conv1(r2))
g1 = self.attn_mask_1(g1)
rgb1 = d2 * g1 # 第一次输入Fusion Block的rgb1
  1. 注意力掩码attn_mask的计算:
  • 空间求和​:
    首先沿高度(H)维度求和,保持维度(keepdim=True)
    然后沿宽度(W)维度求和,得到每个空间位置的总和
  • 归一化处理​:
    将输入特征图除以其空间总和,实现初步归一化
    乘以高度和宽度恢复数值范围
    乘以0.5的缩放因子
def forward(self, x):# 计算空间维度的总和 (高度和宽度)xsum = torch.sum(x, dim=2, keepdim=True)  # 沿高度维度(H)求和xsum = torch.sum(xsum, dim=3, keepdim=True)  # 沿宽度维度(W)求和# 获取输入形状xshape = tuple(x.size())# 计算注意力掩码并应用return x / xsum * xshape[2] * xshape[3] * 0.5

跨模态特征融合模块

在这里插入图片描述

交叉注意力融合

  1. 展平空间/频率维度,视频帧序列维度变为 (B, T, H*W*C),射频序列维度(B, T, F*C)
  2. 加入时间位置编码,时间位置编码由time_indices = torch.arange(T, device=rgb.device)然后经过Embedding实现,输出维度不变:(B, T, H*W*C)(B, T, F*C)
  3. Transform1,Q为视频特征,K和V为射频特征:Q为视频特征维度变换得到,维度(T, B, D=64),K为射频特征变换为得到,维度(T, B, D=64),这里把T和B的位置进行了变换,因为nn.MultiheadAttention 默认的输入格式是 (seq_len, batch, embed_dim)。经过MultiheadAttention之后变换回视频特征维度,也就是(B, T, H*W*C)
  4. Transform2: Q为射频特征,K和V为视频特征,同上,经过MultiheadAttention之后变换回射频特征维度,也就是(B, T, F*C)
def forward(self, rgb, rf):B, C, T, H, W = rgb.shape_, _, _, F = rf.shape# Flatten spatial dimensions to create sequences for cross-attentionrgb = rgb.permute(0, 2, 3, 4, 1).reshape(B, T, -1)  # (B, T, H*W*C)rf = rf.permute(0, 2, 3, 1).reshape(B, T, -1)  # (B, T, F*C)# print(rgb.shape, rf.shape)# Temporal Embeddingtime_indices = torch.arange(T, device=rgb.device)rgb_time_embeddings = self.rgb_embedding(time_indices).unsqueeze(0)  # (1, T, H*W*C)rf_time_embeddings = self.rf_embedding(time_indices).unsqueeze(0)  # (1, T, F*C)rgb = rgb + rgb_time_embeddingsrf = rf + rf_time_embeddings# nn.MultiheadAttention 默认的输入格式是 (seq_len, batch, embed_dim),即 (T, B, D)。rgb, rf = rgb.permute(1, 0, 2), rf.permute(1, 0, 2)# Transform RGB to Q and RF to K and VQ = self.rgb_to_q(rgb)  # (T, B, D)K = self.rf_to_k(rf)    # (T, B, D)V = self.rf_to_v(rf)    # (T, B, D)# Apply cross-attention: RGB as query, RF as key and valuergb_prime, _ = self.attention_rgb_rf(Q, K, V)  # (T, B, D)rgb_prime = self.proj_rgb(rgb_prime)  # (T, B, D)# Reverse the flattening process for RGB'rgb_prime = rgb_prime.view(T, B, H, W, C).permute(1, 4, 0, 2, 3)  # (B, C, T, H, W)# Transform RF to Q and RGB to K and VQ = self.rf_to_q(rf)  # (T, B, D)K = self.rgb_to_k(rgb)    # (T, B, D)V = self.rgb_to_v(rgb)    # (T, B, D)# Apply cross-attention: RF as query, RGB as key and valuerf_prime, _ = self.attention_rf_rgb(Q, K, V)  # (T, B, D)rf_prime = self.proj_rf(rf_prime)  # (T, B, D)# Reverse the flattening process for RF'rf_prime = rf_prime.view(T, B, F, C).permute(1, 3, 0, 2)  # (B, C, T, F)return rgb_prime, rf_prime

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88285.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88285.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88285.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

frp内网穿透下创建FTP(解决FTP“服务器回应不可路由的地址。使用服务器地址替代”错误)

使用宝塔面板,点击FTP,下载Pure-FTPd插件 点击Pure-FTPd插件,修改配置文件,找到PassivePortRange, 修改ftp被动端口范围为39000 39003,我们只需要4个被动端口即可,多了不好在内网穿透frp的配置文件中增加…

STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)

1.前期硬件准备 2s锂电池一个(用于供电),stm32f103c8t6最小系统板一个(主控板),两个摇杆(用于摇杆模式),四个电位器(用于示教器模式)&#xff0c…

华为OD机试_2025 B卷_最差产品奖(Python,100分)(附详细解题思路)

题目描述 A公司准备对他下面的N个产品评选最差奖, 评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。 评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。 输入描述 第…

飞算JavaAI:重塑Java开发效率的智能引擎

飞算JavaAI:重塑Java开发效率的智能引擎 一、飞算JavaAI核心价值 飞算JavaAI是全球首款专注Java语言的智能开发助手,由飞算数智科技(深圳)有限公司研发。它通过AI大模型技术实现: 全流程自动化:从需求分析→软件设计→代码生成一气呵成工程级代码输出:生成包含配置类、…

Java和Go各方面对比:现代编程语言的深度分析

Java和Go各方面对比:现代编程语言的深度分析 引言 在当今的软件开发领域,选择合适的编程语言对项目的成功至关重要。Java作为一门成熟的面向对象语言,已经在企业级开发中占据主导地位超过25年。而Go(Golang)作为Google…

CloudCanal:一款企业级实时数据同步、迁移工具

CloudCanal 是一款可视化的数据同步、迁移工具,可以帮助企业构建高质量数据管道,具备实时高效、精确互联、稳定可拓展、一站式、混合部署、复杂数据转换等优点。 应用场景 CloudCanal 可以帮助企业实现以下数据应用场景: 数据同步&#xff…

如何发现 Redis 中的 BigKey?

如何发现 Redis 中的 BigKey? Redis 因其出色的性能,常被用作缓存、消息队列和会话存储。然而,在 Redis 的使用过程中,BigKey 是一个不容忽视的问题。BigKey 指的是存储了大量数据或包含大量成员的键。它们不仅会占用大量内存&…

Golang读取ZIP压缩包并显示Gin静态html网站

Golang读取ZIP压缩包并显示Gin静态html网站Golang读取ZIP压缩包并显示Gin静态html网站1. 读取ZIP压缩包2. 解压并保存静态文件3. 设置Gin静态文件服务基本静态文件服务使用StaticFS更精细控制单个静态文件服务4. 完整实现示例5. 高级优化内存映射优化使用Gin-Static中间件6. 部…

参数列表分类法:基本参数与扩展参数的设计模式

摘要 本文提出了我设计的一种新的函数参数设计范式——参数列表分类法,将传统的"单一参数列表"扩展为"多参数列表协同"模式。通过引入"基本参数列表"和"扩展参数列表"的概念,为复杂对象构建提供了更灵活、更具表…

Ajax之核心语法详解

Ajax之核心语法详解一、Ajax的核心原理与优势1.1 什么是Ajax?1.2 Ajax的优势二、XMLHttpRequest:Ajax的核心对象2.1 XHR的基本使用流程2.2 核心属性与事件解析2.2.1 readyState:请求状态2.2.2 status:HTTP状态码2.2.3 响应数据属性…

ArcGIS 打开 nc 降雨量文件

1. 打开ArcToolbox,依次打开 多维工具 → 创建 NetCDF 栅格图层,将 nc 文件拖入 输入 NetCDF 文件输入框,确认 X维度(经度)、Y维度(经度) 的变量名是否正确,点击 确定。图 1 加载nc文…

01-elasticsearch-搭个简单的window服务-ik分词器-简单使用

1、elasticsearch下载地址 如果是其他版本可以尝试修改链接中的版本信息下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip 2、ik分词器下载地址 ik分词器下载的所有版本地址:Index of: analysis-ik/stable/…

[数据结构与算法] 优先队列 | 最小堆 C++

下面是关于 C 中 std::priority_queue 的详细说明,包括初始化、用法和常见的应用场景。什么是 priority_queue? priority_queue(优先队列)是 C 标准库中的一个容器适配器。它和普通队列(queue)最大的不同在…

零基础入门物联网-远程门禁开关:硬件介绍

一、成品展示 远程门禁最终效果 二、项目介绍 整个项目主要是实际使用案例为主,根据自己日常生活中用到物联网作品为原型,通过项目实例快速理解。项目分为两部分:制作体验和深入学习。 制作体验部分 会提供所有项目资料及制作说明文档&a…

软件系统国产化改造开发层面,达梦(DM)数据库改造问题记录

本系统前(vue)后端(java spring boot)为列子,数据库由MySQL--->DM(达梦),中间件为中创的国产化相关软件,如tomcat、nginx、redis等。重点讲数据库及代码端的更改,中间件在服务端以…

N8N与Dify:自动化与AI的完美搭配

“N8N”和“Dify”这两个工具彻底理清楚,它们其实是两个定位完全不同的开源平台,各自擅长解决不同类型的问题,但也能协同工作。以下是详细说明:1. n8n:工作流自动化平台定位:n8n 是一个专注于跨系统连接与任…

ARM汇编编程(AArch64架构)课程 - 第5章函数调用规范

目录AAPCS64调用约定参数传递规则返回值规则栈帧管理SP寄存器FP寄存器 (X29)栈帧布局示例AAPCS64调用约定 ARM Architecture Procedure Call Standard for 64-bit (AAPCS64) 参数传递规则 参数位置寄存器分配特殊规则参数1-8X0-X7 (64-bit) / W0-W7 (32-bit)浮点数使用 V0-V7参…

软考(软件设计师)软件工程-成本评估模型,软件能力成熟度,软件配置管理

成本评估模型 Putnam 下面通过一个具体案例,逐步说明Putnam模型的计算过程。我们将开发一个银行核心交易系统,规模为80万行代码(LOC),要求24个月内交付。参数符号值说明软件规模L800,000 LOC通过功能点转换获得开发时间…

SASSNet复现

复现结果–Dice:89.354614,Jaccard:80.968917,95HD:7.3987764,误差在接受范围 MethodDiceJaccardJaccard # 感想 第19篇完全复现的论文

大数据学习5:网站访问日志分析

1.数据处理1.1 环境准备进入cd /opt/server/hadoop-3.1.0/sbin文件夹,停止hdfs服务cd /opt/server/hadoop-3.1.0/sbin ./stop-dfs.sh进入/opt/server/hadoop-3.1.0/etc/hadoop文件夹,编辑yarn-site.xml文件/opt/server/hadoop-3.1.0/etc/hadoop vim yarn…