ReMiX-MAE:从RGB视频学习跨模态表征用于疼痛评估
ReMiX-MAE 这个研究方向可以简单理解成在只有 RGB 临床面部视频的条件下用掩码自编码器去学习缺失通道的跨模态表征最终服务于交感神经介导的疼痛评估。它不是那种下载下来就能跑的 Demo而是一套模型设计思路。如果你做的是医学图像分析、多模态表征学习、自监督预训练或者想用普通摄像头做生理状态估计那这篇文章会把这套思路拆成可理解、可验证的步骤。我不会去复述论文里那些我没有确认过的架构参数和性能数字而是按我自己的落地经验把它拆成几个关键问题这个任务到底难在哪、MAE 在这里起了什么作用、数据该怎么准备、训练流程怎么搭、复现时最容易在什么地方翻车。1. 先理解问题为什么 RGB 面部视频里的疼痛信号这么难学1.1 疼痛评估需要客观指标而面部视频是最容易采集的信号之一临床上疼痛评估通常依赖患者自述或医生观察。自述很主观患者可能高估、低估也可能因为镇静、认知障碍或交流困难而无法表达。医生观察则依赖经验且很难持续盯住一个患者。面部视频是一个折中方案。它非接触、被动采集、设备成本低。在病房、康复科、疼痛科、术后监护这些场景里摄像头比专用生理记录仪更容易部署。这也是很多研究选择从面部视频做疼痛评估的直接原因。但难点也随之而来面部视频包含大量与疼痛无关的变化。个体差异、头部姿态、遮挡、光照、表情习惯、文化背景都会影响模型判断。同一个人的轻微皱眉可能代表疼痛换一个人可能只是习惯性表情。模型如果只记住“皱眉就去打高分”很容易过拟合到训练集。关键不是“能不能采集”而是“能不能从采集到的可见光信号里找到与交感神经激活稳定相关的特征”。1.2 只用 RGB 通道意味着丢掉了不少“看不见”的生理线索普通视频通常是指 RGB 三通道记录的是可见光反射。它能看到肌肉运动、眼睛开合、眉头上扬这些偏“动作性”的变化。但交感神经介导的疼痛反应还包括很多不那么直接可见的变化心率上升、血流分布改变、皮肤温度变化、出汗、呼吸加快、瞳孔直径变化。这些信号在普通 RGB 图像里并非完全不存在但被压缩到了非常微弱的外观变化中。比如血流变化可能引起肤色细微波动呼吸和心率可能引起头部极细微震颤出汗可能引起皮肤反光变化。也就是说用 RGB 视频做疼痛评估本质上是从可见光里去推断交感神经状态。这属于间接推断不是直接测量。模型必须学会捕捉那些极其微弱的耦合信号而不是只盯住表面动作。这就是为什么很多方法要引入红外热像或生理信号。热像可以直接看到皮肤温度分布心率信号可以直接给出心率变异性。可问题在于实际应用时不一定有条件在每台设备上都装热像相机。于是就有了这类研究里常见的设定预训练阶段可能用到了多模态信息甚至只是用多模态信号来构造监督目标但推理阶段只输入 RGB 视频。1.3 跨模态表征的意义让模型自己补上缺失的那部分信息如果训练时只有 RGB 视频和疼痛评分模型很容易走捷径找到几个与标签相关但实际不健壮的表观特征然后不再继续学习。比如在某个医院采集的数据里光线偏暖肤色偏暗模型可能学到“整体颜色偏暖的人疼痛分数高”而不是学到真正与疼痛相关的动态特征。跨模态表征的思路是在预训练阶段给模型一个更难的任务。这个任务要求模型从 RGB 输入去预测、重建或对齐另一个模态的信息。模型为了完成这个任务被迫去学习那些跨模态稳定的特征。这些特征不依赖单一模态的表面统计因此迁移到下游任务时更鲁棒。ReMiX-MAE 标题里的 “Missing-Channel”强调的就是这个“缺失通道”问题。它可以被理解为空间上缺失一块图像也可以被理解为通道上少了一个或多个颜色通道还能被理解成完整缺失一个模态。具体是哪种需要看论文原文的设计。但把它当成一个广义的“模态缺失”来理解方向不会跑偏。2. MAE 的核心机制和 ReMiX-MAE 的思路差异2.1 原始 MAE 做什么随机遮块、重建像素MAE 全称是 Masked Autoencoder掩码自编码器。它最早在图像领域被广泛使用核心逻辑很直接把输入图像切成一个个 patch随机遮盖其中大部分 patch只留下少量可见 patch。编码器只处理可见 patch然后解码器负责从这些可见信息里重建整张图。这个设计有几个关键点自监督不依赖人工标签适合医学场景里标注稀缺的问题。遮盖比例通常很高例如 75%。模型必须在很少信息的情况下理解全局结构和局部纹理。重建任务迫使模型学会不同 patch 之间的关系而不是孤立地看每个局部。对图像分类或回归任务来说MAE 的价值体现在预训练阶段。先用大量无标签图像训练一个重建模型再把编码器拿下来接一个小分类头或回归头用少量标注数据做微调。在面部视频上MAE 同样适用。把时间维度和空间维度都考虑进去可以随机遮掉某些帧、某些 patch甚至某个时间段让模型从上下文重建被遮的内容。这类方法对理解面部动态很有帮助因为它要求模型学习“一个人从平静到疼痛的过程中面部状态如何连续变化”。2.2 ReMiX-MAE 的“缺失通道”到底指什么从标题本身看ReMiX-MAE 很可能不是普通的随机遮块而是把 masking 任务扩展到了“通道”或者“模态”层面。我按常见做法拆成三种可能实际论文用到哪种需要以原文为准但理解这三种会更容易把握方向。第一种是通道掩码。输入是三通道 RGB 图像训练时随机把其中一个通道或两个通道置为掩码标记模型从剩余通道预测被隐藏通道。这个任务要求模型理解不同颜色通道之间的相关性。对肤色分析来说R、G、B 通道并不是完全独立的它们的相对比例往往包含生理信息。学到这种关系后推理时即使某个通道质量差模型也不容易崩。第二种是模态掩码。预训练时有多个模态比如 RGB 视频和热像视频训练时随机丢掉其中一个模态让模型从另一个模态预测被丢模态的特征。推理阶段只提供 RGB等于把“热像模态”永久丢掉了。模型如果能在预训练阶段学会从 RGB 推断热像特征那推理时就能用这些跨模态特征做疼痛评估。第三种是空间掩码与通道掩码的组合。既遮掉一些空间块又在剩余区域遮掉部分通道。这种任务更难但也更能防止模型走捷径。无论哪种设计核心都是同一个让模型学会用不完整的信息去重建缺失信息从而形成更鲁棒的表征。2.3 跨模态表征比单模态表征多了什么单模态模型很容易把注意力放在表面统计上。比如“颜色偏红的人可能更疼”“皱纹明显的人分数更低”。这些特征在训练集上可能有效但换一个环境、换一个相机、换一个人群性能立刻下降。跨模态表征希望学习的是什么样的面部动态模式与交感神经激活有稳定关联。它不只看“这一帧长什么样”更看重“这一段视频里面部状态如何随时间变化变化过程中有哪些生理相关的波动”。这种表征对个体差异更鲁棒。不同人的静态肤色差异很大但血液循环变化引起的肤色微变规律是跨个体相近的。头部姿态的影响也可以被弱化因为模型在学习时被迫关注与另一模态一致的部分而不是与角度绑定最强的部分。当推理阶段只有 RGB 时这种表征比单纯的 RGB 外观特征更接近真实生理状态。这也是这个标题里“跨模态表征”的核心价值。3. 落地的数据准备和预处理流程3.1 临床面部视频数据采集要注意什么这类任务的数据通常来自临床实验环境受试者可能是术后患者、分娩产妇、慢性疼痛患者或者是在实验室里接受实验性疼痛刺激的健康志愿者。采集时最值得关注的是视频分辨率、帧率、拍摄视角、受试者知情同意、同步采集的标签和生理信号。分辨率影响模型能看到的细节。如果只想捕捉粗粒度表情变化较低分辨率也能用但如果想捕捉肤色微变、血管搏动等微弱信号分辨率不能太低。帧率方面常见做法是 25 到 30 FPS 已经够用更高帧率会显著增加数据量但未必带来模型提升。光照是另一个容易被低估的变量。普通 RGB 视频中肤色颜色是反射光的结果光照颜色和强度变化会被模型当成语义信息。如果训练集和测试集光照差异很大模型会非常不稳定。采集时应尽量保持环境光稳定如果无法控制至少要记录光照条件方便后续做增强或归一化。3.2 视频帧提取、人脸检测和人脸裁剪拿到视频后第一步通常是用 OpenCV 读取视频、提取帧。这里有个基础但常见的坑OpenCV 读取图像默认是 BGR 顺序不是 RGB。如果你习惯用cv2.imread读图片又直接把数组送入预训练模型通道顺序会被颠倒。模型看到的颜色关系完全不对训练时 loss 不降或者降得很慢往往就是这类问题。人脸检测可以选现成工具常见的有 MTCNN、RetinaFace、MediaPipe。检测到人脸后并不是直接把整个人脸框送入模型而是要统一裁剪尺寸例如把面部区域缩放到 112 到 224 像素左右。然后再做归一化把像素范围从 0-255 映射到 0-1 或 -1 到 1。最重要的一点验证。每次改完裁剪逻辑都要把裁剪结果可视化出来确认面部区域在画面中的位置和尺度一致。不要等到训练结束才发现模型学到的其实是摄像头位置。如果视频来自原始传感器可能还会碰到 Bayer 到 RGB 的去马赛克问题。传感器直接输出的往往不是 RGB而是 Bayer RAW 格式需要插值转成彩色图像。转出来的颜色如果不对后续所有颜色相关特征都是错的。普通处理时要留意这个环节别默认相机输出一定正确。3.3 标签定义和评估协议疼痛评估不是简单的二分类或三分类。不同论文会用不同定义常见有几种连续疼痛强度评分例如 0 到 10 分。按时间片段切分每段由标注者判断是否存在明显疼痛。使用面部动作单元 AU 作为中间标签再由 AU 推导疼痛强度。使用同步生理信号作为间接标签比如心率变异性、皮肤电导。无论用哪种标签都要先定好评估协议。我这里给一个通用方案流程把受试者划分训练集和测试集尽量保证同一个人的数据不跨集合出现否则模型可能靠记住人脸来“作弊”式提分。然后确定评估指标用交叉验证方式跑多轮避免一次划分带来的偏差。如果标签来自多人标注还要算标注者间一致性。比如两位护士对同一段视频的疼痛评分相差很大那这个样本本身就有噪声。训练时可以考虑用标注方差做样本权重方差大的样本权重降低避免模型死磕无法可靠学习的样本。3.4 模态对齐如果你真的要用额外信号如果预训练阶段会用到热像、心率或呼吸信号就涉及模态对齐。RGB 视频和热像视频往往来自不同摄像头它们的视野、分辨率、帧率、时间偏移都不一样。最稳妥的做法是在采集阶段就设计好同步机制。比如用同一台设备输出双画面或者用闪光同步来校准时间。如果前期没有做好后期处理会非常痛苦。RGB 和热像画面对齐一般需要标定板计算单应矩阵再做透视变换。时间对齐则需要根据帧率做插值并把两个信息流的偏移量校准到相同时间戳。注意ReMiX-MAE 标题明确写了 RGB-Only 推断。也就是说额外信号只在训练阶段帮助模型学跨模态表征推理阶段不会用到。如果你的整体方案里热像是必需的输入那就不属于这篇文章讨论的场景。4. 模型结构和训练流程的探索4.1 输入构造从视频片段到 patch 序列模型输入不是整段视频而是切成一个个短片。常见做法是取 2 到 5 秒的片段以固定帧率采样若干帧。比如一个 3 秒片段25 FPS共 75 帧但不可能把 75 帧全部作为模型输入因为显存和计算量都太大。通常会降采样到 8 到 16 帧再逐帧做人脸裁剪。每一帧经过裁剪后再切成固定大小的 patch。例如把 224×224 的面部图像切成 16×16 的 patch每一帧就有 196 个 patch。如果把视频看作多帧序列就要在 patch 上同时加入空间位置编码和时间位置编码。空间位置编码告诉模型patch在图像里处于哪个位置时间位置编码告诉模型这是第几帧。没有时间位置编码模型会分不清帧的先后顺序动态信息就会丢失。4.2 masking 策略空间遮块还是通道遮块Masking 是整个方法里最值得花时间调的部分。我建议按下面几条路径逐项做消融而不是一开始就组合多个策略。空间掩码最基础。随机遮掉一定比例的 patch让模型重建被遮 patch 的像素或特征。这里要注意 mask 比例。原始 MAE 常用 75%但视频场景不一定同样合适。因为视频里有时间冗余遮掉一帧的大部分内容可能很容易从相邻帧推断出来。如果重建任务太简单模型学到的东西就不够深层。通道掩码是最贴合“Missing-Channel”这个标题的做法。把 RGB 三通道中的一个或两个通道置零或者在通道维度上添加可学习的掩码 token模型从剩余通道预测被遮通道。这个任务对手指肤色分析特别有用因为 R、G、B 通道之间的比例关系往往比单通道绝对值更稳定。模态掩码是更复杂的版本。预训练时如果同时有 RGB 和热像特征会随机丢弃其中一个模态让模型从另一个模态预测被丢模态的特征。训练时需要处理两个模态的分辨率和特征维度不一致的问题。推理阶段只给 RGB相当于测试时始终丢弃热像模态。建议先跑最基础的空间掩码再逐步加通道掩码。不要一上来就做完整组合否则出了问题很难定位是哪个环节引入的。4.3 损失函数的设计预训练阶段可以用像素重建损失也可以用特征重建损失。像素重建简单但可能让模型过分关注纹理细节。特征重建要求模型输出与某个目标特征对齐通常需要先有一个教师模型或目标模态编码器。如果是通道掩码目标比较明确预测被遮通道的像素值或归一化特征。这里我建议用均值绝对误差或平滑 L1 损失而不是单纯 MSE因为面部图像存在大量低纹理区域MSE 容易被平滑区域主导导致模型不关注边缘和细节。如果是模态掩码损失函数可以选择 L2 距离也可以选择对比损失。对比损失更强调跨模态的一致性它的做法是让同一个样本的两个模态表征在向量空间中尽量靠近不同样本尽量远离。这个策略对下游任务通常更有利。预训练损失不是越低越好。经常出现预训练重建很漂亮但微调后分类或回归效果没有提升的情况。原因可能是模型学会了重建表面纹理但没有学到与标签相关的语义。所以每个阶段都要保留验证集用下游任务指标来评估预训练收益。4.4 一个最小可行的伪代码思路下面给出一个近似方案结构用来帮助理解整个流程。它不是论文原版代码只是按一般 MAE 和跨模态学习思路整理的伪代码。# 伪代码仅用于说明 ReMiX-MAE 类方案的模块结构 # 1. 读取视频提取帧裁剪人脸 # video_frames: [T, C, H, W]T 是帧数C 通常是 3 # 把每帧缩放到固定尺寸例如 224 x 224 # 2. 将图像切成 patch加入位置编码 # 对每一帧使用相同的 patch embedding 权重 # patches: [T, N, D]N H / patch_size * W / patch_size # 3. 生成掩码 # 方式一空间掩码随机遮住部分 patch # 方式二通道掩码对某些帧的某个通道置为 mask_token # 方式三模态掩码随机丢弃整个 RGB 或目标模态特征 # 4. 编码器只处理未被掩码的 token # encoded encoder(visible_tokens) # 5. 解码器重建被掩码部分 # recon decoder(encoded_tokens mask_tokens) # 6. 计算重建损失 # loss MSE(recon, original_px_masked) # 像素重建 # 也可以换成特征重建或对比损失微调阶段去掉解码器和掩码逻辑把编码器输出的 [CLS] token 或平均池化特征接上一个回归头输入 RGB 视频片段输出疼痛强度预测值。此时不需要掩码也不需要重建只用编码器做特征提取。4.5 评估指标的选择连续疼痛强度预测常用平均绝对误差 MAE 和均方根误差 RMSE。注意这里的 MAE 是“平均绝对误差”英文 Mean Absolute Error跟掩码自编码器 Masked Autoencoder 的缩写 MAE 完全一样。写代码、写论文、看日志时要分清楚上下文否则容易混淆。除了回归误差还可以报告与人工评分的皮尔逊相关系数或组内相关系数 ICC。相关系数高说明模型预测的趋势和标注一致但绝对值校准不一定好。回归误差小说明数值偏差不大。两者最好都报。如果做的是分类问题则用准确率、精确率、召回率、F1 分数同时关注类别不均衡问题。疼痛强度中高疼痛样本通常偏少模型容易偏向低疼痛类别需要做类别权重或重采样。5. 复现这类工作时最容易踩的坑5.1 数据量太少训练不稳定医学面部视频数据量通常不会很大尤其是带有疼痛标签的临床数据。几百个受试者、几万到几十万个片段已经算不错了。自监督预训练虽然能缓解标注不足但预训练本身也需要足够多样本。如果样本很少模型可能在预训练阶段就过拟合到重建任务迁移到下游任务时性能下降。小数据场景下我建议先做三件事用比较小的 patch size 以增加 token 数量会加重计算负担所以不要盲目照搬用已有预训练权重初始化编码器使用强数据增强包括空间翻转、少量旋转、裁剪、颜色抖动和灰度化。颜色抖动尤为重要。因为 RGB 皮肤颜色对光照和个体肤色差异极其敏感。如果模型只记住“偏红的区域是皮肤”它就无法泛化到不同光照环境。可以在输入上随机改变亮度、对比度、饱和度甚至以一定概率转为灰度迫使模型更多依赖纹理和动态特征而不是静态颜色统计。5.2 标签噪声和个体差异疼痛评分是人工标注的存在明显噪声。同一个视频不同标注者可能给 4 分和 6 分。模型如果完全拟合标签很容易学到标注者个人倾向而不是真实疼痛信号。对策有几个层面。先做标注者一致性分析比如 ICC 低于 0.6 的样本可以考虑剔除或降低权重。训练时把标注方差作为噪声估计让模型回归到标签分布而不是单一硬标签。还有一种做法是使用软标签比如把标注分布作为回归目标损失函数改为分布匹配。不同患者的疼痛表现差异很大。有人疼到 8 分仍然面无表情有人刚有一点不适就表情夸张。模型如果只学面部肌肉动作很难处理这类个体差异。这个时候跨模态表征的价值会体现出来因为它更关注与生理状态耦合的微弱变化而不是单纯的表情强度。5.3 光照、肤色、相机型号对结果的影响RGB 值不是物理量只是传感器对反射光的量化结果。同一个人的肤色在不同光照、不同相机、不同白平衡设置下RGB 值差异可能非常大。如果模型只依赖颜色统计很容易崩塌。一个有效的验证方法是用不同相机或不同光照条件采集同一个人的视频看模型输出的疼痛评分是否稳定。如果评分随光照变化明显说明模型没有学到与疼痛相关的核心特征而是在用颜色统计走捷径。预处理阶段可以做色彩校正但不同数据集之间很难统一。更实际的做法是在预训练阶段做数据增强同时检查模型注意力是否集中在面部动作区域。如果注意力图基本集中在整张脸的颜色纹理上而不是眼睛、眉毛、嘴角等关键区域就要怀疑模型的特征提取方向有问题。5.4 RGB 与红外对齐的工程细节如果预训练阶段确实要用到红外热像或其他辅助模态对齐是绕不开的问题。RGB 与红外相机的视野、分辨率、视差各不相同直接按时间戳拼接输入会让模型学到错位特征。工程上一般这样做先用棋盘格等标定板拍摄若干组同步图像计算两个相机之间的单应矩阵或投影关系。然后对红外图像做透视变换使其与 RGB 视角对齐。最后再检查像素级重叠情况比如叠加显示、计算边缘重合度。最小可行方案是把两路视频按时间取帧同步假设位置偏差不大先用中心裁剪和缩放做粗对齐。粗对齐能跑通验证流程但要获得可靠结论还是需要做精确标定。这类问题的排查顺序是先确认时间戳是否对齐再确认空间是否对齐最后确认分辨率是否一致。不要上来就调模型。5.5 常见报错排查顺序训练过程中遇到 loss 不下降、输出全黑、显存溢出、数据加载慢按下面的顺序排查。先看数据流。把预处理后的图片、掩码和标签单独保存出来可视化检查。确认人脸裁剪正确、patch 尺寸正确、mask 是否命中预期目标。很多“模型有问题”最终都定位到数据预处理。再看输入范围。RGB 是 0-255 还是 0-1模型解码器输出是否加了不合适的激活函数。如果目标像素范围是 0-255解码器输出却用了 Sigmoidloss 就会一直压不下去。再看 mask 策略。如果通道被置零模型可能学到“所有通道被置零时输出一个常数”这是任务退化。此时重建 loss 很低但下游任务没有提升。可以通过可视化重建结果来确认模型是否在认真修复缺失通道。再看资源。batch size、帧数、分辨率是否超过显存数据读取是否成为瓶颈。如果是数据加载慢先检查图像解码格式、人脸检测是否在数据管线里重复执行尽量离线缓存裁剪结果。最后看损失和梯度。如果 loss 异常大或梯度爆炸检查学习率和损失权重。跨模态预训练很容易出现两个模态 loss 尺度不一致的情况先用固定权重调通再考虑自适应权重。6. 边界和现实评价6.1 这个方法不是万能工具ReMiX-MAE 类方法适合的场景是实际部署只有 RGB 视频但数据中存在或可以构造出跨模态目标。如果训练集本身也完全没有任何多模态信息那“缺失通道”这个任务的动机就要打折扣。有些研究者会把多模态简化成“自己预测自己”比如遮住 RGB 通道再重建。这类任务也能学到表征但它更多是学习图像内部结构而不是真正补足缺失模态。如果下游任务是疼痛评估可能还不如一个有监督的强基线模型。复现时要先问自己一个问题你希望模型从 RGB 视频中学到什么跨模态特征这个特征用什么目标来构造如果答不上来说明方法设计还没有落到具体可执行步骤。6.2 对复现落地更稳妥的路径不要一上来就复现完整复杂 pipeline。我建议按这样四步走。第一步跑一个强基线。用现成的视频分类或回归模型直接预测疼痛评分比如 ResNet 3D、SlowFast、Video Swin。先看数据质量、标签质量和评估协议是否合理。第二步加入 MAE 预训练。使用空间掩码做自监督预训练再用预训练权重初始化视频编码器。这个阶段要对比有无预训练在下游任务上的差异判断自监督在这个数据集上是否有效。第三步实现通道掩码或模态掩码。在 MAE 基础上增加缺失通道任务看它能否带来进一步的提升。这里要特别注意消融设计避免把两个因素揉在一起说不清楚。第四步做稳定性和可解释性分析。查看注意力可视化看模型关注哪些面部区域在不同光照和不同个体上的评分稳定性如何。这一步虽然不直接提升性能但能说明方法到底学到了什么。6.3 后续可以继续做的方向后续优化可以从几个方向延伸。把缺失通道任务扩展到更多模态特征。比如用同步心率信号作为重建目标训练一个从 RGB 视频预测心率波形的模块再用心率特征辅助疼痛评估。这类做法的好处是心率信号本身是交感神经活动的直接指标之一。把单帧重建扩展到时间序列预测。让模型预测未来帧或者预测被遮时间段的面部动态特征。疼痛评估往往靠持续性观察短时间内的连续变化比单帧静态外观更重要。研究通道掩码比例的敏感度。对不同通道做不同比例遮挡观察模型对哪些通道的依赖最强。这能帮助我们理解模型是否真的学会了跨通道的生理耦合特征。最后把模型输出和传统生理指标结合起来做可解释性分析。比如比较高分预测片段和低分预测片段在心率变异性上的差异看模型是否捕捉到了和已知生理机制一致的信号。如果预测结果与已知医学规律相悖说明模型学到的可能只是数据噪声。我个人更建议把这个方向理解成“如何用自监督方式从单模态推多模态表征”而不是单纯的面部表情识别。真正要跑通并取得可信结果数据清洗、标签协议、掩码策略和评估方式比换一个更大的模型更值得花时间。这四件事没有做扎实后面的提升多半是过拟合出来的假象。