人类活动识别HAR:深度学习模型选型与工程实践

发布时间:2026/10/1 17:59:15
人类活动识别HAR:深度学习模型选型与工程实践 人类活动识别Human Activity RecognitionHAR是时间序列分类里最接地气的一支。它处理的不是抽象的股票曲线或工业波形而是人身上那几颗加速度计和陀螺仪吐出来的三轴数据。我这几年从手搓均值方差喂SVM到堆三层LSTM再到现在拿Transformer和自监督预训练往下压误差绕了一大圈才发现真正决定项目成败的往往不是模型结构图上那几根箭头而是窗口怎么切、归一化统计量从哪算、评估集怎么划分这些看起来不高级的脏活。这篇是时间序列分类系列的第19篇。我想把人类活动识别这条线上比较主流的深度学习模型做一次相对完整的梳理从一维卷积、循环网络、时序卷积到注意力机制、图神经网络、自监督对比学习把每一类模型的适用边界、参数规模、训练代价、容易踩的坑都说清楚。文章里会给一个可以直接跑起来的基线代码会有一张模型选型决策表也会把我自己踩过的几个典型坑原样写出来。如果你正在做可穿戴设备、手机行为识别、老年人跌倒监测、健身动作计数这类项目或者你只是想把时间序列分类的理论落到一个具体场景上这篇应该能帮你省下不少试错时间。我不会堆公式推导重点是讲清楚为什么这么选和实际怎么调。1. 人类活动识别到底在解决什么问题1.1 任务定义把一段信号翻译成一个动作标签从数学形式上看人类活动识别属于典型的多元时间序列分类问题。输入是一个形状为 T×C 的矩阵T 是时间步数C 是传感器通道数输出是一个离散标签比如走路上楼坐下站立躺下慢跑。整个任务的难点在于人做同一个动作的方式差异极大——同样是走路有人步频110有人步频90有人手臂摆动幅度大有人几乎不摆——但模型必须把这些都归到同一个类别里。实际工程中我们不会把一整段连续采集的数据直接丢给模型而是用滑动窗口切成一堆小片段。窗口长度的选择直接决定了模型能看到多少信息太短了一个完整的步态周期都没覆盖到模型只能看到局部抖动太长了窗口里可能混进两个不同的动作标签就没法打了。行业里比较常见的做法是取2到3秒比如经典的UCI HAR数据集就是50Hz采样、2.56秒窗口换算下来正好128个采样点。这个128不是随便定的2.56秒约等于一个成年人走路的2到3个完整步态周期足够让模型看出节奏特征又不至于长到跨越动作边界。1.2 它和普通时间序列分类的几个关键差别很多人上手时会把HAR当成一般的时序分类任务处理直接套用那些在UCR数据集上表现不错的算法结果往往不理想。原因在于HAR有几个很特殊的性质理解这些性质比选模型更重要。第一是强周期性。走路、跑步、骑车这类动作有非常稳定的周期结构频域特征和自相关特征特别有效而坐下、起身、摔倒这类动作是一次性事件周期特征反而会误导模型。第二是类内差异远大于类间差异。不同人的走路之间的差异可能比同一个人走路和慢跑之间的差异还大这是HAR最核心的挑战也是为什么跨受试者评估的准确率总会比随机划分低一大截。第三是传感器位置敏感。手机放在裤兜、拿在手里、贴在耳边同样的动作会产生完全不同的信号模式模型如果不做位置归一化泛化能力会非常差。第四是标签边界模糊。快走和慢跑之间、上楼梯和爬坡之间并没有天然的分界线标注者的主观判断会引入噪声这也是准确率很难做到99%以上的根本原因之一。1.3 数据集与评价基准先把尺子统一做HAR研究绕不开那几个公开数据集但很多人只记住了名字没注意它们的采集条件差异有多大结果横向对比时得出错误结论。数据集受试者数采样率传感器位置类别数特点UCI HAR3050Hz腰部手机6数据干净入门首选WISDM3620Hz裤兜手机6采样率低噪声大PAMAP29100Hz腕、胸、踝18多位置多模态难度高Opportunity430Hz全身多传感器多场景复杂含大量空动作USC-HAD14100Hz腰部12类别多包含姿态转换SHAR1750Hz腰部手机7含手机位置标注注意这些数据集普遍存在同一段原始信号切出的窗口既出现在训练集又出现在测试集的泄漏问题。如果按窗口随机划分准确率虚高5到15个百分点是常事。评价口径比模型选择更值得花时间。真正的HAR项目应该采用留一受试者交叉验证Leave-One-Subject-OutLOSO也就是每次留一个人的全部数据做测试其他人做训练轮流一遍后取平均。这个数字才是你能拿出去说的数字。另外HAR数据普遍存在类别不平衡走路样本远多于摔倒所以macro F1比accuracy更能反映真实水平。2. 数据这一关决定天花板的环节2.1 采样率、窗口长度与重叠率的确定方法这三个参数不是调出来的是算出来的。我的习惯是先看目标活动的最短持续时间。以跌倒检测为例一次跌倒从失重到静止大概1.5到2秒那么窗口绝对不能再短取2秒是下限。再往下算车轮采样的设备是50Hz2秒就是100个点设备是100Hz2秒就是200个点。窗口点数 采样率 × 窗口秒数这个换算必须先在纸上算清楚不要在代码里乱试。重叠率的选择有讲究。训练阶段我一般用50%重叠相当于做数据增强能让样本量翻倍推理阶段如果用滑动窗口输出重叠率要跟后处理逻辑匹配。这里有个经常被忽略的细节重叠窗口在评估时会互相污染。如果测试集也用50%重叠切窗那么相邻窗口共享一半的采样点模型只要对一个窗口判对它的邻居大概率也会判对最终准确率会被高估。我现在的做法是训练用重叠窗口测试用无重叠窗口两者分开处理。2.2 通道选择与坐标系对齐一个典型的惯性测量单元会输出六路信号三轴加速度加三轴角速度。加速度里又同时包含重力分量和运动分量这两个成分的物理意义完全不同——重力反映的是姿态设备朝向运动分量反映的是动作强度。很多人直接把原始加速度喂给模型等于让模型自己去分离这两者白白浪费了网络的表达能力。我的处理方式是靠一个低通滤波器截止频率0.3Hz左右把重力分量估出来然后用原始加速度减掉重力得到线性加速度。这样模型拿到的三路加速度是纯粹的运动另外三路重力分量则携带了姿态信息两者各自都有明确的物理含义训练收敛会明显更快。坐标系随手机朝向变化这个问题更麻烦。同样是走路手机竖着放和横着放加速度在三个轴上的分布完全调换了。工程上有两种解法一是用重力方向做主对齐把坐标系旋转到重力指向-z轴的规范姿态二是干脆在训练时做随机三轴旋转增强让模型学会旋转不变性。前者更省算力后者更通用我一般两个都用。2.3 预处理与数据增强的具体做法预处理的第一步是去噪。惯性传感器的噪声主要来自高频抖动和电磁干扰用一个四阶巴特沃斯低通滤波器、截止频率设20Hz基本够用采样率100Hz时截止频率可以放到30Hz别把有效信号也滤掉。第二步是归一化。这里有个必须强调的点均值和标准差只能用训练集的统计量来算然后用同一组数字去处理验证集和测试集。我见过太多人图省事把整个数据集丢进StandardScaler一次性fit_transform测试集的信息就通过统计量泄漏进了训练过程评估结果必然虚高。正确写法是只在训练集上fit再transform其他集合。import numpy as np def fit_normalizer(X_train): # X_train shape: (N, T, C) mean X_train.mean(axis(0, 1), keepdimsTrue) std X_train.std(axis(0, 1), keepdimsTrue) 1e-8 return mean, std def apply_normalizer(X, mean, std): return (X - mean) / std数据增强方面我按有效性从高到低排个序三轴旋转模拟设备朝向变化最有效、通道丢弃随机把某一路信号置零迫使模型不依赖单一通道、加性高斯噪声信噪比控制在20到30dB别太猛、时间扭曲把时间轴按非线性方式拉伸幅度控制在±10%以内、幅度缩放整体乘以0.9到1.1的系数。还有一类是mixup把两个不同样本按比例混合、标签也按比例混合在小数据集上效果不错。注意时间扭曲和幅度缩放的幅度都不能太大。我试过把时间扭曲做到±30%模型在验证集上表现挺好但到测试集直接崩了——因为扭曲之后的信号已经不像真实动作了模型学到的是扭曲伪影而不是动作特征。3. 卷积与循环HAR的主力模型族上3.1 一维卷积最稳的基线也是最容易被低估的如果只能选一个模型做HAR我会选一维卷积网络。原因很简单它的归纳偏置和传感器信号高度契合。一维卷积核在时间轴上滑动本质上就是在检测局部波形模式——某个特定的上升沿、某个周期性的抖动这正好对应动作的局部特征。而且它对输入长度的要求很宽松参数量小推理快端侧部署友好。卷积核大小的选择直接决定感受野。感受野的递推公式是第 l 层的感受野等于上一层感受野加上 (k_l - 1) 乘以之前所有层的步长乘积。用最朴素的情况算三层卷积核都是5、步长都是1感受野就是 1 4 4 4 13 个采样点。这意味着一个13点的窗口内的模式能被第一路输出看到。如果采样率50Hz13个点只有0.26秒覆盖不了半步堆到五层、核大小7感受野能到29个点约0.58秒勉强够用。我一般让最终感受野至少覆盖一个完整的步态周期1秒左右这是设计网络深度时的一个硬约束。参数量也要算。一个输入6通道、输出64通道、卷积核长度5的卷积层参数量是 6×64×5 1920第二层64进128出、核长度5是 40960第三层128进128出、核长度3是 49152。三层加起来不到10万参数加个全连接头总共也就10万出头。这个规模在手机上跑实时推理毫无压力比后面要讲的Transformer小了将近两个数量级。3.2 循环网络讲清楚它到底擅长什么LSTM和GRU在HAR领域曾经是标配。它的核心机制是门控——你可以把它想象成一个很尽责的秘书每收到一个新数据点就决定这条信息要不要记到长期笔记本上笔记本上翻旧的哪一页可以擦掉了。输入门控制新信息的写入遗忘门控制旧信息的清除输出门控制当前要往外报什么。这个机制让它天然适合捕捉长距离的时间依赖关系。但说实话在HAR这个任务上循环网络的优势没有想象中那么大。原因在于HAR的关键信息大多在局部——一个步态周期内部就包含了主要判别信息不太需要跨越好几秒去建立依赖。加上循环网络是串行计算的同样长度的序列LSTM的推理时间是卷积的几倍甚至十几倍在端侧设备上这是硬伤。我现在只在一种场景下用LSTM输入序列特别长比如10秒以上、且动作的判别确实依赖长程累积比如从坐到站的完整转换过程。如果你决定用有几个技巧用双向LSTM在离线场景下能稳定提升1到3个百分点隐藏单元数从128起步别一上来就512HAR数据集规模撑不住加zoneout比加dropout更合适因为dropout会破坏循环网络的时间连续性。3.3 CNN-LSTM混合结构工程上最常用的一种把卷积和循环拼起来是HAR领域最经典的架构代表作是2016年提出的DeepConvLSTM。思路非常清晰先用几层卷积在时间维上做下采样把128个时间步压到16个左右同时把通道数从6扩到128相当于把原始信号编码成一组高层的局部特征然后把这16个特征向量按时间顺序喂给两层LSTM让它建模这些高层特征之间的时序关系。这个设计的妙处在于把计算量分配得很合理。卷积部分处理的是长序列但它的计算是并行的而且下采样之后序列变短了LSTM处理的是短序列串行开销被大幅压缩。实测下来同样的准确率水平CNN-LSTM的训练时间比纯LSTM少一半左右。我在实际项目里的调整是卷积部分用三层核大小分别5、5、3每层后面跟最大池化做2倍下采样LSTM用两层、每层128单元层间加zoneout最后接全连接分类头。这个配置在UCI HAR上LOSO大概能到92%上下在PAMAP2上80%左右作为基线很稳。3.4 时序卷积网络把循环网络的活抢过来干时序卷积网络TCN的核心思想是用因果卷积加空洞卷积加残差连接来替代循环结构。因果卷积保证时刻t的输出只依赖t及之前的输入不会看到未来——这在实时流式推理里是必须的离线场景下其实可以放宽用非因果卷积反而效果更好。空洞卷积的作用是快速扩大感受野普通卷积核长度3只能看3个点空洞率设成2就能看5个点设成4就能看9个点空洞率按2的幂次递增感受野是指数级扩张的。感受野的算法是核长度 k、空洞率 d、层数 L 的情况下感受野约等于 1 2×(k-1)×(2^L - 1)。取 k3、L5感受野是 1 2×2×31 125 个采样点50Hz下接近2.5秒足够覆盖完整的动作周期。这个计算你可以在设计网络时先做一遍确定层数比盲目堆深度高效得多。TCN相对LSTM的优势是并行计算、梯度路径稳定、感受野可控。我在做实时手势识别时最终就选了TCN——延迟从LSTM的60多毫秒降到20毫秒以内准确率还略有提升。缺点也很明显它没有对顺序的显式建模对于依赖状态累积的任务比如连续动作的边界判断不如循环网络自然。4. 注意力、图与自监督HAR模型族下4.1 注意力机制与Transformer数据量是硬门槛Transformer在HAR上的应用这两年增长很快但要冷静看待。它的核心是自注意力每个时间步都能直接和序列中其他所有时间步交互不像卷积那样受限于感受野也不像循环那样有严格的顺序依赖。这个特性在长序列上优势明显代价是计算复杂度随序列长度平方增长。128个时间步的自注意力矩阵是128×128完全可以接受但如果你的窗口长度是1000点采样率200Hz、窗口5秒那就是1000×1000的矩阵显存和计算量都会爆炸。所以用Transformer做HAR第一件事就是把序列切patch——把128个点切成16个patch每个patch 8个点注意力在patch级别做复杂度直接降了64倍。这个做法和视觉Transformer的思路是一致的。Transformer对数据量的要求远高于卷积网络。卷积网络带有一维卷积核这个强先验小数据也能学好自注意力几乎没有先验是从数据里学关系。UCI HAR这种只有7000多个窗口、30个受试者的数据集直接用Transformer很容易过拟合我试过训练集准确率能到99%测试集掉到85%以下。可行的做法有两个一是用大量无标签传感器数据做自监督预训练再微调二是用混合结构前面几层还是卷积只在后面接一两层注意力兼顾先验和全局建模。位置编码也不能省。时间序列的顺序信息对HAR至关重要先抬腿后落地和先落地后抬腿是完全不同的动作。用可学习的位置嵌入还是正弦编码实测差异不大但一定要有。4.2 图神经网络把传感器通道当成节点当你的系统里有多个传感器节点时比如手表、手机、腰夹、脚环同时采集图神经网络提供了一种很自然的建模方式把每个传感器当成图上的一个节点把传感器之间的相关性当成边用图卷积在节点间传递信息。关键在于邻接矩阵怎么来。三种做法我都试过一是先验定义比如规定手表和手机之间连通、腰夹和脚环之间连通简单但僵化二是相关性计算算通道间的皮尔逊相关系数矩阵作为邻接矩阵数据驱动但需要足够的样本才能算准三是可学习邻接矩阵把邻接矩阵当成参数一起训练最灵活但最容易过拟合。我现在一般用第二种加一个小的正则项让邻接矩阵既反映真实相关性又不至于太极端。图神经网络在全身多传感器场景下的提升是实打实的PAMAP2上相对于单节点基线能涨5到8个百分点。但如果只有单个设备图结构的价值就有限了——你可以把三轴加速度和角速度当成6个节点做通道级的图建模也能涨一点但收益不如直接在数据层面做通道注意力来得实在。4.3 自监督与对比学习标签不够时的解法HAR领域最现实的问题就是标注贵。让人连续戴一周传感器采集数据很容易但给这一周的数据逐秒打标签需要一个标注员盯着一整天。自监督学习提供的思路是先用大量无标签数据学一个通用表示再用少量标注数据微调。常用的预训练任务有三类。掩码重建随机遮住信号中的一部分时间段让模型预测被遮住的内容这迫使模型理解信号的局部结构。时间对比从同一段信号里取两个不同时间窗口认为它们相似从不同段里取的窗口认为不相似。跨模态对比如果同时有加速度和陀螺仪让两个模态对应的表示互相靠近。我自己的经验是跨模态对比学习在小样本场景下性价比最高。用一周无标签数据预训练再用每个动作20到30个标注样本微调就能达到从头训练用200个样本的效果标注量直接省了八成。微调的时候注意先冻结主干网络只训分类头1到2个epoch再解冻做小学习率整体微调这样能防止预训练学到的表示被小数据带偏。4.4 多模态融合什么时候该融怎么融多模态融合在HAR里主要是指不同传感器类型或不同佩戴位置的融合。融合位置分三种早期融合在输入层把通道拼起来实现最简单但要求各路信号严格时间对齐中期融合在特征层做拼接或注意力加权灵活性最好晚期融合让每个模态各自出一个预测再投票鲁棒性最强但参数量最大。我的默认选择是中期融合加注意力加权。具体做法是每个模态走一个独立的编码器输出特征后在通道维拼接然后用一个小的注意力模块学习每个模态的权重。这样做的好处是模型能自己判断在什么动作上该信任哪个传感器——比如判断跑步时脚环数据权重高判断举手时手表数据权重高。注意多模态融合最容易踩的坑是时间戳不同步。不同设备的采样时钟有微小漂移一天下来可能差出好几秒。融合之前必须用互相关或者信号特征点做对齐否则融合反而会降低性能。5. 从原始信号到可复现结果完整实操流程5.1 数据划分这一步做错后面全白干我把数据划分放在实操的第一位因为它是最容易出错、后果最严重的一步。正确流程是先按受试者划分出训练受试者集合和测试受试者集合确保同一个人不会同时出现在两边然后在训练受试者内部再按受试者划分出验证集通常是留出20%的受试者最后才在各自集合内部做窗口切分。这个顺序不能颠倒。如果你先切窗口再按比例划分那么同一个受试者的相邻窗口甚至是重叠窗口会同时进入训练和测试模型只要记住这个人的步态特征就能在测试集上拿高分但这完全不代表它能识别一个新用户。我见过一个项目随机划分下准确率96%改成正儿八经的LOSO之后掉到81%项目方一开始以为是模型不行其实是评估方式在骗人。提示如果受试者数量很少少于10人可以考虑留一受试者交叉验证如果受试者很多50人以上固定划分一批人做测试集就够了省时间。5.2 一个可以直接跑的1D-CNN基线下面这个网络是我每次开新项目时的起点参数量约9.3万在手机端单次推理不到1毫秒改起来也方便。import torch import torch.nn as nn class ConvBlock(nn.Module): def __init__(self, in_ch, out_ch, k5): super().__init__() self.conv nn.Conv1d(in_ch, out_ch, k, stride1, paddingk // 2, biasFalse) self.bn nn.BatchNorm1d(out_ch) self.act nn.ReLU(inplaceTrue) self.pool nn.MaxPool1d(2) def forward(self, x): return self.pool(self.act(self.bn(self.conv(x)))) class HARNet(nn.Module): def __init__(self, in_ch6, n_class6, width64, dropout0.3): super().__init__() self.features nn.Sequential( ConvBlock(in_ch, width, k5), # 128 - 64 ConvBlock(width, width * 2, k5), # 64 - 32 ConvBlock(width * 2, width * 2, k3) # 32 - 16 ) self.head nn.Sequential( nn.AdaptiveAvgPool1d(1), nn.Flatten(), nn.Dropout(dropout), nn.Linear(width * 2, n_class) ) def forward(self, x): # x: (B, C, T) return self.head(self.features(x))输入张量的维度顺序是 (batch, channels, time)这点和很多教程里的 (batch, time, channels) 不一样转换的时候记得permute否则卷积会在错误的维度上滑动怎么调都学不好。5.3 训练配置与调参的先后顺序超参数很多但顺序不能乱。我固定按这个顺序调第一步定窗口。窗口长度和重叠率是数据层面的东西定了就别动后面所有实验都基于它。第二步定归一化。通道级的z-score标准化是默认选择如果数据里有明显的异常值改用中位数和四分位距。第三步定模型宽度。从width32开始32、48、64、96这样往上试看验证集曲线的拐点在哪。UCI HAR这种规模的数据width超过128基本不会再涨只会过拟合。第四步定正则。dropout从0.2到0.5扫一遍再决定要不要加权重衰减我一般用1e-4和早停patience设15个epoch。优化器用Adam学习率1e-3配合余弦退火batch size 64。这几个几乎是HAR的默认值很少需要大改。如果loss震荡得厉害把batch size提到128如果收敛太慢学习率提到2e-3。from torch.optim import Adam from torch.optim.lr_scheduler import CosineAnnealingLR model HARNet(in_ch6, n_class6, width64) opt Adam(model.parameters(), lr1e-3, weight_decay1e-4) sched CosineAnnealingLR(opt, T_max60) criterion nn.CrossEntropyLoss(label_smoothing0.05)标签平滑这个细节值得单独说。HAR的标签本身就有边界模糊的问题快走和慢跑到底算哪个硬标签会让模型对边界样本过度自信加上0.05的标签平滑通常能涨0.5到1个百分点而且几乎不需要调参。5.4 评估accuracy只是开始准确率是给外人看的混淆矩阵才是给自己看的。我看混淆矩阵的习惯是找双向混淆对——如果A被误判成B的比例和B被误判成A的比例都很高说明这两类在特征空间里高度重叠需要从数据或特征层面解决如果是单向混淆A大量误判成B但B很少误判成A往往是类别不平衡导致的B类样本多模型倾向于往B靠。报告指标时我固定给出四个overall accuracy、macro F1、每类recall、以及混淆矩阵。macro F1和accuracy的差距越大说明类别不平衡越严重。另外还要报告推理延迟和模型大小因为HAR项目最终都要落到设备上一个95%准确率但需要200毫秒推理的模型在很多场景下不如一个92%准确率、20毫秒推理的模型有用。6. 常见问题排查与端侧部署6.1 问题速查表现象常见原因排查动作训练准确率很高测试集崩盘按窗口随机划分导致泄漏改成按受试者划分重跑验证集波动大每次结果不同批大小太小或学习率过高batch提到128lr降到5e-4某几类recall极低类别不平衡用加权交叉熵或focal loss推理延迟不达标模型太深或用了循环结构换TCN或纯卷积做下采样换设备后性能骤降采样率或量程不一致统一重采样到同一频率检查量程增强后训练集涨但测试集跌增强幅度过大破坏语义把时间扭曲降到±10%以内手机放不同位置识别差坐标系未对齐加重力对齐或旋转增强6.2 端侧部署参数量、延迟与量化模型要落到设备上有三个数字必须心里有数。参数量决定模型文件大小量化前的float32模型每100万参数占4MB。乘加运算量决定算力需求粗略估算可以用卷积层的输出长度乘以输出通道数乘以核长度。峰值内存决定能不能跑起来主要看最大特征图的尺寸。量化是性价比最高的一步。训练后动态量化把权重转成INT8、激活保持FP32几乎不需要改代码模型大小直接降到四分之一推理提速20%到40%准确率损失通常在0.5个百分点以内。如果还不够做量化感知训练在训练时就模拟量化误差能把损失压到0.1个百分点以内。import torch.quantization as tq model.eval() qmodel tq.quantize_dynamic( model, {nn.Linear, nn.Conv1d}, dtypetorch.qint8 ) torch.save(qmodel.state_dict(), har_int8.pt)注意BatchNorm层在量化时容易出问题特别是训练时batch size太小导致统计量不准的情况。量化之前先用几千个样本跑一遍model.eval()更新滑动统计量能省掉后面一大半调试时间。6.3 我个人踩过的几个坑第一个坑是归一化统计量算错范围。前面提过了但我还是要再强调一遍因为我自己也犯过。当时用某个公开数据集做实验看别人论文里的准确率是93%我怎么做都只有88%排查了两天才发现是归一化的均值和标准差用了全量数据。改过来之后准确率立刻上去了而且还发现了另一个问题真正的LOSO准确率应该是89%而不是93%。第二个坑是忽略了采样率差异。有一次把模型从100Hz的设备迁移到50Hz的设备上直接拿原模型跑准确率掉了将近20个百分点。原因是同样的2秒窗口在50Hz下只有100个点而模型是在200点上训的池化层的下采样比例对不上了。解法很简单推理前先做重采样但这很容易忘。第三个坑是过度依赖公开数据集。公开数据集大多是在实验室环境下、按固定动作脚本采集的动作标准、环境安静。真实用户的使用场景里会有大量非目标动作掏手机、整理衣服、开车时手部抖动这些在训练集里完全没有。我后来的做法是加入一个其他类别专门用真实场景的杂散数据训练虽然会让总体准确率数字变难看但实际可用的程度高很多。第四个坑是窗口边界效应。滑动窗口输出的预测序列会有抖动同一个动作在窗口边界处经常被判成两个类别。解法是加后处理用滑动平均或者维特比解码对预测序列做平滑让输出标签连续。这一步纯后处理不改模型但体感提升非常明显。7. 模型选型表与后续可扩展方向7.1 不同场景下怎么挑模型选型没有最好只有最合适。我按项目条件整理成一张表实际做方案时可以直接对照。场景条件推荐模型理由数据少5000窗口、算力有限1D-CNN先验强小数据不易过拟合需要长程依赖多阶段动作CNN-LSTM 或 TCN兼顾局部特征与时间演化实时性要求高30msTCN 或纯卷积全并行无串行依赖多设备多位置融合GNN 或中期融合网络能建模节点间相关性标注极少、无标签数据多自监督预训练 微调用无标签数据补足标签缺口长序列500点Patch化 Transformer全局建模需切patch控复杂度端侧部署、内存紧张深度可分离卷积 INT8量化参数量和内存都压到最低7.2 还能往下挖的几个方向如果你已经把基线跑通了想让效果再上一个台阶我觉得有三个方向值得投入。一是个性化适配。新用户来了之后用他本人的少量数据比如每个动作5个样本做一次快速微调或者用少样本学习的方法做原型校正。跨受试者准确率是HAR最大的痛点而个性化适配是投入产出比最高的解法实测能涨5到10个百分点。二是持续学习。设备上的模型会随着用户习惯变化而逐渐失准比如换了鞋、换了走路方式需要能在线更新又不忘旧知识。这块的挑战是灾难性遗忘目前比较实用的方案是保留一小部分旧数据的回放缓冲。三是不确定性估计。在很多场景下模型说我不确定比说错更有价值。用蒙特卡洛dropout或者深度集成让模型对模棱两可的样本输出高不确定度再交给人工确认。这在医疗健康监测类的应用里几乎是必需品。最后分享一个我最近的习惯。每次开新项目我会先花半天时间只做数据探索把每个类别的信号画出来看一眼算一下各个类别的周期长度、能量分布、通道间相关性。这半天往往能发现一些靠调模型永远解决不了的问题比如某类样本的标签本身就是错的、某个通道的传感器已经坏了。模型能做的事有边界边界之外的活儿得靠肉眼看。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询