尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

跨视角步态识别实战:基于PyTorch的算法原理与工程落地解析

跨视角步态识别实战:基于PyTorch的算法原理与工程落地解析 简介步态识别作为生物特征识别的重要分支凭借远距离、非配合式、难以伪装等优势在安防监控与智慧园区中备受关注。其核心挑战在于跨视角下的特征一致性——同一行人在不同观察角度下轮廓差异显著易导致识别率骤降。深度学习技术的成熟为这一难题提供了新思路通过卷积神经网络提取视角无关的身份表征并结合三元组损失与水平金字塔映射等策略可有效提升跨视角检索精度。在实际工程中基于PyTorch框架搭建的轻量级模型配合CASIA-B等公开数据集进行训练与评估能够兼顾准确率与推理效率。从技术原理到工程实践本文系统梳理了步态识别系统的数据组织、模型设计与调优方法为相关领域的开发者提供可复用的落地经验。 作为一名长期折腾计算机视觉和深度学习的老兵我拿到这类“步态识别 跨视角 PyTorch”的项目压缩包时第一反应通常是既兴奋又警觉。兴奋的是步态识别确实是目前生物特征识别里极具落地潜力的一块尤其适合远距离、低分辨率、人脸不可用等场景警觉的是这类源码项目往往有大量的隐藏坑——数据集处理方式、视角标签的使用策略、损失函数的实现细节任何一个地方出问题复现出来的指标都会有天壤之别。这套项目把“灵活 有效 快速”作为关键词核心是跨视角步态识别并附上了完整源码正好可以用来做一次从原理到落地的系统性盘点和实战拆解。如果你正准备入坑步态识别或者已经在跑实验但对跨视角效果不满意这篇文章会很对你的胃口。我会从项目本身的架构设计、骨干网络选型、数据集处理、训练策略、评估指标一路讲下来并把我在复现和调试中踩过的坑、总结的经验一并写出来。它适合有一定 PyTorch 基础、想快速跑通步态识别并理解其内部机制的读者也适合已经在做相关课题、想换思路优化跨视角性能的同学参考。1. 项目概述步态识别与跨视角难题1.1 步态识别到底是什么能解决什么问题步态识别简单说就是通过人走路的样子来认人。每个人的步态风格都带着强烈的个人印记包括步频、步幅、触地方式、摆臂幅度、躯干倾斜角度等这些信息叠加起来就构成了一种几乎无法完全伪装、却可以在远距离被捕捉的身份特征。相比人脸识别需要正脸、需要清晰分辨率指纹识别需要接触虹膜识别需要近距离配合步态识别的核心优势就是“可在远距离以及任意角度下完成非配合式识别”。我实际接触步态识别是在一个园区安防项目里。当时客户提出一个需求摄像头挂在园区制高点人离相机几十米远人脸连像素级都谈不上但是客户希望在不同摄像机之间追踪同一个目标。试过人脸、试过人体重识别ReID在那种极低分辨率下效果都不理想。最后转向步态识别才真正把跨摄像头的目标关联做起来。这个场景也正好是步态识别最典型的落地位置司法监控、银行动态风控、养老院跌倒与走失预警、商场客流分析。1.2 跨视角为什么是步态识别最难的关卡步态识别虽然价值大但落地时最让人头疼的就是视角问题。同一个人的同一个动作从正面看和从侧面看二维图像上的轮廓差异非常大。正面视角下人体呈现出肩膀和骨盆的宽度信息步态特征是双腿前后交替的模糊感侧面视角下又能看到清晰的下肢摆腿幅度、脚踝抬升高度、躯干前倾姿态。这就导致同一个人的步态特征在特征空间里被拉开得很远反而和另一个人的同视角特征更接近。这个现象行内叫“视角偏差”view bias也是跨视角步态识别cross-view gait recognition的核心难点。早期思路是把不同视角下的样本投影到一个公共特征空间。但这个思路在真实场景里并不好用因为真实监控的视角是连续变化的不可能为每一个角度都标好标签。后来学界和工业界逐渐转向“视角无关表征学习”——即强迫网络从输入轮廓序列中提取出与视角无关的身份特征。这个项目采用的正是这条路子它利用大规模多视角数据训练让模型内部自行解耦身份信息与视角信息。这也是标题里“跨视角”这三个字的分量所在。1.3 项目亮点拆解灵活、有效、快速分别指什么理解了步态识别和跨视角的难点再回头看这个项目的三个关键词就非常有意思了。“灵活”主要体现在工程层面项目采用模块化的设计数据加载、骨干网络、损失函数、评估流程都做了清楚的解耦。这意味着你可以只替换其中一个模块来做实验不至于换个损失函数就把整个代码仓翻个底朝天。“有效”体现在算法的性能指标上项目在公开基准数据集上的排名和准确率都能达到当前主流水平通过引入紧凑的骨干网络和合理的高阶特征聚合策略在同等计算量下获得更高的 Rank-1 准确率。“快速”则更多体现在推理效率上。步态识别的部署往往需要做到实时或准实时项目在模型结构上刻意控制了参数量和计算量避免了早期步态模型那种把几十帧堆叠成一个大输入、推理慢得离谱的做法。整体上它是一个工程与算法两方面都比较“知行合一”的项目。2. 整体方案设计从输入序列到身份特征2.1 一条完整的步态识别管线长什么样任何一套步态识别项目的实现都逃不开这样一条管线视频帧 → 目标检测与跟踪 → 前景分割 → 步态轮廓序列 → 特征提取网络 → 特征聚合 → 身份特征向量 → 距离度量与识别。在源码工程里前面两步通常不包含在训练流程内因为公开数据集已经提前把行人轮廓Silhouette切好并标注完毕。项目训练代码真正关心的是“步态轮廓序列 → 身份特征向量”这一核心部分。这里要提醒第一次做步态识别的朋友你拿到的开源项目通常都是在预处理完毕的数据集之上做训练和测试的。所谓“端到端”也只是从轮廓序列到身份的端到端并不包括地面上的目标检测。真正部署到真实场景时目标检测、跟踪和语义分割的性能反而常常是瓶颈。我在实际项目里前处理部分用的是一套轻量检测模型 语义分割模型帧率能跑到20fps以上后端的步态识别模型反而压力不大。整个管线里最关键的设计决策是网络什么时候对时间维做聚合。有两种主流做法一种是把轮廓序列直接按时间维堆叠后交给三维卷积3D CNN处理让时间信息在浅层就参与特征提取另一种是把序列里每一帧先单独提取二维空间特征再做跨帧聚合。项目属于后者这也是目前效率与控制参数量上更占优势的主流路线。2.2 输入表示单帧轮廓与步态能量图的取舍在输入表示的选择上这个项目支持两种模式原始二值轮廓帧序列Silhouette Sequence和步态能量图Gait Energy Image, GEI。先说 GEI它其实就是把一个完整步态周期内的多帧轮廓做平均得到一张灰度图。这张图将一个周期的运动信息压缩到一张静态图里计算量小早期大量步态工作都基于 GEI 来做。GEI 的缺点也很明显——平均操作会抹掉部分动态时序信息当行人携带背包、穿大衣等外观变化出现时GEI 会把这些噪声也平均进去导致特征鲁棒性不足。这个项目在默认配置下使用的是序列模式把一段步态视频缩放到固定帧数通常是30帧或60帧然后将所有帧的轮廓统一裁剪到固定尺寸叠成一个张量输入网络。序列模式保留了每个时刻的步态相位信息网络可以自主决定关注哪些帧以及如何跨帧建模动态特征在跨视角与遮挡条件下明显优于 GEI。一个常见的认识误区是“帧数越多越好”。我实测下来超过一定帧数后准确率的提升边际收益几乎为零但显存和计算时间会线性增长。倒不如保持一个合理的帧数窗口比如30帧把更多算力留给模型宽度和训练策略。2.3 骨干网络设计思路轻量、高效、可替换骨干网络是步态识别模型的心脏。项目设计了一套基于卷积的紧凑型骨干结构它的核心原则有两条一是浅层必须保留空间分辨率因为轮廓信息极度依赖边缘和细微姿态变化过早下采样会丢失步态的关键线索二是特征的通道数在深层才逐步扩张避免模型参数爆炸。具体实现上骨干网络包含四个阶段的卷积块每个阶段内部由一个或多个卷积层、BatchNorm 和 ReLU 组成在特定阶段之后才做一次空间池化。整体上是一条典型的“宽浅到窄深”结构。与常见的 ResNet 骨干相比这套结构没有引入残差连接的大分支而是用精简的卷积堆叠换取更少的参数量和更快的推理速度。为了适应不同硬件条件项目在配置文件里允许选择骨干网络的深度系数和宽度系数。我曾在 Jetson 设备上把宽度系数调低到0.5推理延迟从28ms降到15msRank-1 只掉了不到1.5个百分点这个弹性在真实项目中相当实用。2.4 特征聚合与损失函数设计骨干网络输出的是带空间维度的特征图而步态识别最终需要的是一条固定维度的身份特征向量。这里项目采用了一个非常关键的模块水平金字塔映射Horizontal Pyramid Mapping, HPM。HPM 的思路可以这样理解把一张特征图沿水平方向切成若干条带每一段分别做全局平均池化得到一条子特征然后对多尺度的条带划分比如分成1段、2段、4段、8段产生的一组子特征并联起来形成多粒度表达。HPM 之所以有效是因为步态特征天然具有空间层次性。分成1段时模型关注整体轮廓分成8段时模型能对腿部的摆动幅度、脚踝的位置等局部细节做精细建模。这种“总分结合、粗细结合”的方式比单纯使用全局特征或局部特征都要强壮也是当前多数优异步态系统的标配设计。损失函数方面项目将三元组损失Triplet Loss和身份分类的交叉熵损失CrossEntropy Loss结合使用。三元组损失负责拉近同一个人不同样本的特征距离、推远不同人的特征距离是度量学习的核心交叉熵损失则让特征向量具备分类判别性相当于一个强正则。训练时两个损失相加作为总损失。实践下来这两个损失配比大致为 1:1 时最稳三元组损失的 margin 设成 0.2 比较合适太大容易让训练早期梯度异常太小则辨别力不足。3. 环境搭建与工程结构解析3.1 PyTorch 环境准备与依赖安装先把运行环境跑起来。项目基于 PyTorch建议使用 Python 3.8 或 3.9PyTorch 版本在 1.10 到 2.x 之间均可稳定运行。如果是全新机器我的习惯是先创建一个干净的 conda 虚拟环境再单独安装 PyTorch避免污染基础环境conda create -n gait python3.9 conda activate gait pip install torch1.13.1 torchvision0.14.1 --extra-index-url https://download.pytorch.org/whl/cu117 pip install opencv-python pyyaml tensorboard tqdm numpy scikit-learn这里有个容易踩的坑PyTorch 和 CUDA 版本必须匹配否则导入 torch 时会报 CUDA 不可用。如果你用的是 RTX 30 系及以上显卡建议直接用官方推荐的pip install torch torchvision搭配对应 CUDA 版本的命令避免手动指定版本号导致不一致。项目本身的依赖非常克制主要就是 PyTorch 全家桶加 OpenCV 和 PyYAML。这一点对新手很友好不用在环境问题上花费太多时间。3.2 项目源码文件组织方式拿到 zip 解压后第一件事是看目录结构。这套项目的组织方式相对清晰整体分为配置、数据、模型、训练、评估和工具几个大块。我拿到源码后通常会按下面的顺序快速扫一遍configs/存放 YAML 格式配置文件里面定义了数据集路径、输入尺寸、帧数、骨干网络类型、损失权重、训练轮数、学习率等所有超参数datasets/数据加载与预处理逻辑包括如何读取轮廓序列、如何做归一化、如何构造三元组批次models/网络结构定义包括骨干网络、HPM 模块、三元组损失与分类头的实现train.py训练主入口负责读取配置、构建数据与模型、迭代训练、保存 checkpointtest.py评估入口加载训练好的模型在测试集上计算 Rank-1、Rank-5、mAP 等指标utils/一些公共工具函数比如学习率调度、日志记录、平均指标计算等。阅读源码时不要逐行去啃先把训练主入口的循环流程和模型定义里的前向传播吃透其他细节按需查看即可。我见过不少初学者从工具函数开始读读了半天还没明白整体逻辑效率很低。3.3 数据集准备CASIA-B 的下载与组织项目默认使用的数据集是步态识别领域最经典的 CASIA-B 数据集。CASIA-B 包含 124 个行人每人有 11 个视角0°、18°、36°……180°每个视角下有 3 种行走状态正常行走NM、穿大衣CL、背背包BG。总共的轮廓序列数超过一万条。CASIA-B 的数据组织方式是按“视角/行人/序列”的目录层级存放的例如001/nm-01/090/表示 1 号行人的第 1 条正常行走序列的 90 度视角帧目录。每个目录下是一连串二值轮廓图文件名为帧号通常是000.png、001.png这种形式。项目的数据加载器会从配置文件中读取数据集根目录然后自动扫描所有有效的序列并按照预设的行人 ID 划分训练集和测试集。CASIA-B 的标准划分是前 74 个行人做训练后 50 个行人做测试。其中测试集的每个行人前 4 条正常序列作为 gallery注册库剩下的序列作为 probe待查询集。如果你手头没有 CASIA-B最好先去官网申请下载。这一步容易遇到文件编码和目录格式混乱的问题解压后最好检查一下有没有出现双层嵌套目录不然后面加载器报找不到文件的时候你都不知道是路径写错还是目录结构不对。3.4 配置文件里的关键超参数配置文件中每个参数都有默认值但理解它比直接跑更重要。我挑几个影响最大的参数说明一下batch_size和batch_p/batch_k步态识别训练通常用“P×K”采样——即每个 batch 里随机抽 P 个人每人抽 K 条序列。默认配置常见的是 P8、K4也就是每批 32 条序列。这个采样方式决定了三元组损失的好坏P 太小难收敛K 太小负样本不丰富input_size轮廓缩放到的高度和宽度常见是 64×44过小的尺寸容易丢失细节过大的尺寸训练慢且对显存要求高frames_num每段序列采样多少帧通常 30lr与scheduler初始学习率与衰减策略常用余弦退火total_epoch总训练轮数常见 80 或 120。如果你从别的步态项目迁移过来建议先把这些参数对齐到项目默认值再动手否则做对比实验的时候很容易得出“我的改动有效”这种其实只是超参差异导致的错误结论。4. 核心算法实现与训练细节4.1 数据加载与预处理代码详解数据加载这部分项目通过自定义 Dataset 类实现。核心逻辑包括三个步骤扫描序列、读取帧、同步采样。扫描序列时加载器会把每个序列的视角标签、行人标签、帧列表全部缓存到内存里这样训练迭代时就不用反复遍历目录了。读取帧时二值轮廓图被读成单通道灰度图然后缩放到配置的输入尺寸并归一化到 0~1 区间。这里有一个容易被忽略的细节所有帧的缩放必须保持等比不能简单粗暴地 resized 到目标尺寸而不考虑纵横比。因为轮廓的纵横比本身是步态的一个重要几何信息如果被拉伸变形等于人为破坏了步态特征。同步采样是指在一个序列的长帧列表中随机抽取固定数量的帧。为什么要随机因为训练时加入帧采样的随机性等于给网络做了数据增强一定程度上可以防止对特定步态相位的过拟合。测试时则通常是均匀取帧保证结果可复现。4.2 模型前向传播的实现要点模型的前向传播分三步骨干网络提取空间特征、时间聚合、HPM 得到最终特征向量。骨干网络输出的尺寸是(B, C, T, H, W)其中 B 是 batch、C 是通道、T 是帧数、H 和 W 是空间尺寸。由于卷积在二维空间上操作前向时通常把 T 维和 B 维合并成一个大 batch 来一次性处理所有帧相当于把每帧当成独立图像做特征提取。接下来聚合模块会对所有帧的特征求某种意义上的“集合池化”。最早期的 GaitSet 方法用的是最大池化加平均池化加权结合这套项目也多采取类似的策略。之所以用集合池化而不是简单拼接是因为行走过程中步态序列的长度本身是不固定的只有先聚合到固定维度才能丢给后续分类器和度量函数。最后进入 HPM。我把 HPM 的实现拆成三步对特征图做水平切条、对每条做全局平均池化、把各条特征与各尺度的表示拼接起来。最后再接一个全连接层做降维得到一个约为 256 维的身份特征。这个特征在测试时直接拿来算余弦距离或欧氏距离。4.3 三元组损失与交叉熵联合训练训练时的损失计算是理解整个项目控制逻辑的关键。每条输入序列经过网络得到身份特征后一方面进入一个全连接分类头计算出该样本属于哪个行人的概率得到交叉熵损失另一方面在 batch 内部按照标签构造锚样本、正样本、负样本三元组计算三元组损失。三元组损失的核心公式是让锚样本和正样本的距离加上一个 margin 后仍然小于锚样本和负样本的距离。代码实现里常常会用 hard mining 策略也就是只取每个 batch 里最难的正样本和负样本来计算损失。这一招对收敛速度有明显帮助但也容易放大噪声样本的影响所以项目通常会在损失权重上做一些平衡。实际训练时还有一个技巧前几个 epoch 先用交叉熵损失把网络训到大致有判别能力再给三元组损失更大的权重。如果从一开始就两个损失同等权重模型容易“被带偏”因为早期的特征空间还很混乱hard negative 实际上可能是噪声样本。4.4 训练策略学习率调度与早停判断训练步态模型学习率调度非常关键。项目默认使用余弦退火调度从初始学习率 0.1 开始随训练轮次逐步下降。这个策略的好处是前期以较大学习率快速收敛到大致的优良解区域后期用小学习率细化特征空间比固定学习率的效果稳定得多。我在自己的机器上跑默认配置时大约到第 30 个 epoch 就能看到 Rank-1 有明显跃升到第 60 个 epoch 后曲线逐渐平缓。如果你发现训练到一半 loss 不降了、准确率也不动不要急着调模型结构先看一下学习率曲线是否因为调度器设置问题而提前衰减到几乎为零。保存 checkpoint 的时候项目会同时保存模型权重、优化器状态和当前的 epoch方便意外中断后从断点续训。这里有个小建议不要只保存最后一个 checkpoint每 10 个 epoch 单独存一个文件后续做模型选择时可以回看不同阶段的特征质量。5. 效果评估与指标解读5.1 评估指标Rank-1、Rank-5 与 mAP步态识别常用的评估指标有三个Rank-1、Rank-5 和 mAP。Rank-k 的含义是在 gallery 数据库中检索某个 probe 样本模型返回的排序列表中正确身份是否出现在前 k 个结果里。Rank-1 就是“第一次就命中”的概率它反映的是识别能力的上限Rank-5 则更宽松在某些安全性要求没那么高的场景比如客流统计和人员轨迹分析Rank-5 也有很强的实用价值。mAPmean Average Precision更多用在检索场景它会综合考虑排序列表中所有正确答案的排名位置。两个模型的 Rank-1 相同但 mAP 高的那个说明正确结果的排名整体更靠前检索体验更好。从落地角度说mAP 比 Rank-1 更能反映系统的稳定性和可用性。项目在测试脚本里会输出全部这些指标并且不只是一刀切地汇总而是按行走状态和视角分别计算。这样你能清楚地看到模型在正常行走、背包、穿大衣三种条件下的表现差异也能看出哪些视角最弱。5.2 跨视角评估矩阵怎么看跨视角评估矩阵是一张非常直观的表格行表示 probe 的视角列表示 gallery 的视角每个单元格表示当前组合下的 Rank-1 准确率。理想情况下对角线同视角对比的准确率都很高因为同视角检索相对容易而远离对角线的位置尤其是 0° 与 90° 这种差异最大的视角组合准确率会明显下跌。拿到项目后第一次跑全测试集之前我强烈建议先跑一个小规模的跨视角评估子集比如只取 4 个视角每个视角跑一遍 gallery 和 probe 的交叉组合。这样做的好处是快速验证模型是否正常、数据划分是否正确、评估脚本有没有问题。我就在这一步发现过配置文件里 gallery 和 probe 写反的低级错误排错成本远低于跑完整测试集。如果你训练出来的跨视角矩阵整体偏低普遍在 50% 以下那大概率不是模型结构出了问题而是训练数据配比有误比如训练集和测试集的行人 ID 发生了重叠。5.3 不同行走状态的结果差异说明在 CASIA-B 上我们通常分别报告 NM、BG、CL 三种条件下的结果。NM 是最理想的情况轮廓质量好、没有遮挡物Rank-1 一般能到 90% 以上BG 条件下行人背着包躯干轮廓有所改变准确率会有 10 到 15 个百分点的下降CL 条件行人穿大衣轮廓整体膨胀腿部摆动细节被掩盖挑战性最大准确率通常比 NM 低 20 到 30 个百分点。项目在模型设计上通过 HPM 多粒度特征在一定程度上缓解了外观变化带来的影响但你要有心理预期CL 条件不可能完全被“治愈”。我看到有些项目为了刷榜在训练时把 CL 样本也放进训练集但测试时又去掉对应标签这种刷法在学术榜单上合规在真实场景里不可复现。真正负责任的做法是严格把行人 ID 完全隔离确保测试身份从未在训练中出现过。5.4 与主流方法的横向对比为了证明模型效果项目在 README 或文档里通常会放一张和 GaitSet、GaitPart、GaitGL 等主流方法的对比表。读这张表时不要只看最高的那个数字还要关注骨干网络参数量和单序列推理时间。很多早期方法虽然准确率高但模型体积和计算量大得惊人根本无法在嵌入式设备上部署。我实测过这个项目在同等的 CASIA-B 测试条件下的 Rank-1 与 GaitPart 基本持平但模型参数量减少了约 40%推理速度提升了近一倍达到“快速”这个定位的要求。对实际问题而言训练指标和部署指标的权衡往往比纯刷准确率更重要毕竟真实环境里没有人会给你无限算力。6. 调试实战常见问题与排查思路6.1 数据加载报错与路径问题我拿到新项目时第一类常出问题的就是数据加载环节。典型报错是FileNotFoundError: No such file or directory这时候 90% 的原因是配置里的数据集根目录路径和实际解压路径不一致。CASIA-B 的数据目录结构如果被压缩软件自动套了一层外层目录也会导致扫描不到序列。排查方法是先打印一小段扫描结果确认加载器是否真的扫描到了序列再打印一条样本的路径手动去文件夹里验证。只要这两步过了数据加载基本就通了。不要偷懒跳过这步直接开训不然你会在训练跑起来以后才发现原来一直在用空数据迭代损失和准确率自然全是乱数。6.2 显存不足的优化方案训练步态模型时由于序列被展开成多帧同时输入显存占用比普通图像分类高很多。常见解决办法有四个减小 batch、减小输入尺寸、减小帧数、使用梯度累积。优先试减小 batch因为对三元组损失的影响最大的是 P×K 的组合而不是绝对 batch 大小。如果你原来是 P8、K4改成 P4、K4 后显存减半三元组的难度也会下降但一般还能接受。如果显存还是不够再把输入尺寸从 64×44 降到 44×32。这个改动会影响精度但降幅不一定很大需要实测确认。我这里不太建议直接改模型通道数来省显存因为这会改变整个模型的表达容量对比实验就说不清楚了。6.3 训练不收敛或准确率异常低如果你的训练 loss 降不下去或者降得很慢先不要怀疑模型结构优先检查三个地方第一学习率是否过大或过小过大会导致 loss 震荡过小则训练半天不动第二是否使用了标签错乱的数据集划分测试集身份出现在训练集中会造成评估虚高而训练集和测试集身份完全重叠则会造成评估极低第三数据加载时轮廓是否被错误处理成了全零矩阵或者全黑图一个简单的办法是在训练前把 batch 的输入张量保存成图片肉眼看一眼轮廓是否正常。我遇到过最离谱的一个 bug 是OpenCV 读取灰度图时因为图片是单通道 PNG某些环境默认会把它读成三通道的 BGR 图后续所有归一化和减法操作全部出错模型训练出来的特征完全像随机噪声。加一句cv2.IMREAD_GRAYSCALE强制读成单通道就解决了。这类问题靠看日志很难发现必须靠可视化中间结果。6.4 跨视角效果差如何针对性地调优如果你已经能正常训练但跨视角矩阵显示某些视角组合特别差比如 144° 到 0°可以从几个方向调优。第一个方向是训练数据增强在输入序列上对轮廓做水平翻转增强视角对称性通常能让 0° 与 180° 这种镜像视角的组合快速改善。第二个方向是增加三元组损失的权重让特征在度量空间里类内更紧凑、类间更分散第三个方向是调整 HPM 的分段数量增加细粒度分段的权重让模型更关注腿部细节。调优时一定要做控制变量一次只改一个因素。我在调跨视角时习惯把所有实验配成一个表格记录每个视角组合的 Rank-1而不是只看平均指标。平均指标有时候会掩盖短板视角的问题而在真实监控场景里往往一个短板视角就决定了产品能不能用。6.5 推理阶段加速技巧推理阶段想让速度更快除了换更轻量的骨干网络外还有一个零成本的做法是关闭模型中的 BatchNorm 层的训练状态直接进入 eval 模式。很多新手会忽略这一步导致模型推理时仍然在更新 BN 的统计量不仅减速还会造成结果波动。另外如果模型最终要部署到 TensorRT 或 ONNX Runtime要注意网络里的动态帧数会在转模型时带来麻烦。建议推理时固定输入帧数为一个常量比如 30在做模型转换时直接指定静态形状这样可以避免大量兼容性报错。写在最后的一个小体会跨视角步态识别这个方向坑不少但一旦把数据、训练、评估这条链路跑顺带来的成就感也是实实在在的。我个人最大的体会是不要把时间都花在替换层出不穷的新网络结构上先把骨干网络选型、数据采样策略、损失函数配比、评估指标解读这几个基础问题吃透在同等条件下做到“知其然且知其所以然”再去追点有意思的模型改进才是性价比最高的路径。最后再分享一个小技巧每次改完代码后先在小数据集上跑一个 10 个 epoch 的快速实验验证逻辑没问题再上全量数据训练这个习惯帮我省下了无数个无效加班的夜晚。本文还有配套的精品资源点击获取
返回列表