做视频理解的人,几乎都会遇到同一个转折:类别从“跑步、骑车、喝水”换成“正常行走、扶墙行走、拖着腿行走”时,模型的准确率会突然变得非常难看。类似问题在真实业务里非常普遍。比如判断一个人是不是在“投篮”,粗粒度任务可能已经能到 90% 以上;一旦要求区分“原地跳投、后仰跳投、勾手投篮”,模型立刻乏力。再比如做饭场景中“切丝”和“剁块”,在连续帧上的差别可能只是刀刃角度和手腕频率;康复评估系统要判断“抬手是否耸肩”,工业装配平台要确认“先插销再拧螺丝还是先拧螺丝再插销”,这些都属于典型的细粒度动作识别。
这个问题的本质并不是网络不够深,也不是视频帧不够多,而是特征表征被“摊得太开”。区分这一类动作,模型不仅需要识别出“胳膊在动”,还要能够捕获“哪个关节先启动、末端轨迹是什么、接触面在哪个位置”。如果所有类别都共用同一套深层特征,那些低频但决定差别的细节很容易被全局平均池化掉。Fine-Grained Action Recognition with Cross-Attentive Latent Sparse Experts 这个方向,真正想解决的正是这个瓶颈:怎样用有限的训练数据,为差异极小的动作类别分配差异化的计算路径,而不是简单把网络加宽加深。
这篇文章会围绕三个问题展开:细粒度动作识别到底难在哪里;Cross-Attention、Latent Sparse Experts 这类概念如何组织成一套完整思路;如果你要复现或迁移到自己的视频任务,应该怎么设计实验、怎么排错、有哪些工程坑需要提前避开。文末给出了一个可运行的 PyTorch 简化实现,用来把三个核心概念串起来跑通前向反向流程。