步态识别是生物特征识别领域的一个重要分支,它通过分析人行走时身体各部位的协调运动模式来完成身份确认。与指纹、人脸等静态特征不同,步态属于动态行为特征,具有非侵犯性、难以伪装和远距离可感知等优势。在安防布控、智慧养老和人机交互等场景中,摄像头可以在不干扰被测对象的情况下持续采集行走视频,经过预处理、特征提取和比对决策后输出身份标签。

步态数据的采集与预处理流程
一套实用的步态识别系统首先依赖稳定的图像采集端。通常在走廊、出入口等区域架设侧视或斜俯视摄像头,帧率保持在25到30帧每秒即可捕捉完整的行走周期。原始视频要经过背景减除得到人体剪影,常用高斯混合模型或基于深度学习的分割网络来完成。如果光照不均或存在阴影,还需做直方图均衡与形态学闭操作,确保 silhouette 边缘连续。
得到二值剪影序列后,还要做归一化与周期切分。由于每个人步频不同,系统会计算质心横向位移的自相关峰值来定位一个步态周期,并把该周期内的剪影缩放到固定画布。下面是一段用 Python 和 OpenCV 做背景减除的简化示例:
import cv2
# 创建背景减除器
bg_sub = cv2.createBackgroundSubtractorMOG2(varThreshold=25, detectShadows=False)
cap = cv2.VideoCapture('walk.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
# 生成前景掩码
mask = bg_sub.apply(frame)
# 形态学去噪
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
cv2.imshow('silhouette', mask)
if cv2.waitKey(30) == 27:
break
cap.release()
cv2.destroyAllWindows()
上述流程只是入门级处理。在真实监控里,还要应对多人穿插、目标短暂离开画面等异常。工程师往往结合目标跟踪算法,给每个行人分配固定 ID,再把同 ID 的剪影拼成连续序列送入后续模块,避免特征错位。
主流特征提取方法的原理对比
基于模型的方法把人体看成由骨架和关节组成的连杆模型,通过姿态估计网络输出每帧的关节坐标,再计算大腿与小腿夹角、肘部摆动幅度等几何量。这类方法对视角和衣着不敏感,但依赖精准的关键点检测,在低分辨率视频上容易失效。与之相对,基于表观的方法不解析身体结构,而是把剪影图当作整体纹理,用 3D 卷积或 Gait Energy Image 来压缩时间维度。
GEI 是最经典的表观表征,它把一个周期内所有二值剪影按像素平均,得到一张灰度图,亮处代表身体高频出现区域。GEI 计算极快,但会模糊瞬时动作。近年的 GaitSet 则把剪影集合当作无序输入,用集合池化提取稳定特征,在跨视角数据集上明显优于 GEI。下面的表格列出了三类方法的典型差异:
| 方法类别 | 输入形式 | 抗视角变化 | 计算开销 |
|---|---|---|---|
| 模型法 | 关节点坐标 | 较强 | 中等 |
| GEI表观法 | 平均能量图 | 较弱 | 低 |
| 深度学习集法 | 剪影集合 | 强 | 较高 |
选择哪种方案要看硬件条件与场景容忍度。社区边缘盒子若只有 CPU,可优先考虑 GEI 加度量学习;数据中心有 GPU 集群时,直接训练 GaitSet 或 GaitPart 能获得更好召回率。需要注意的是,模型法中的 pose_estimation 网络如果先在 COCO 上预训练,再微调到监控数据,能显著降低标注成本。
工程落地中的视角与泛化难题
同一个人在正侧面和斜后方摄像头下,剪影形状差异巨大,这是步态识别准确率下滑的主因。多摄像头布置虽能覆盖更多角度,但会带来时空对齐负担。常见做法是训练时引入视角编码向量,把摄像头参数作为条件输入网络,让模型隐式学习视角不变特征。测试阶段即便只有单视角,也能借助该编码推测其他视角下的表征。
跨场景泛化同样棘手。夏天穿裙子和冬天穿羽绒服会改变摆臂幅度,背包也会让肩部轮廓变宽。解决思路包括在训练集里做数据增强,随机给剪影贴附属物掩码;或者使用对抗训练,让判别器分不清样本来自哪个季节,从而逼出更本质的步态表达。以下片段展示如何对剪影做简单背包遮挡增强:
import numpy as np
def add_bag_mask(sil, w=20, h=40):
# sil: 二值剪影,0或1
out = sil.copy()
ys, xs = np.where(sil > 0)
if len(xs) == 0:
return out
# 在质心偏右区域叠加矩形模拟背包
cx = int(xs.mean()) + 10
cy = int(ys.mean())
out[cy-h//2:cy+h//2, cx-w//2:cx+w//2] = 1
return out
除了算法层,产品上也要设阈值策略。 gait_recognition 输出的相似度分数受距离影响,工程师通常按摄像头焦距和安装高度换算有效识别区,只在区内触发报警,减少误报。经过上述组合优化,现代系统在受限场景下的 rank-1 准确率可超过九成,但在完全无约束的街头环境仍待突破。
gait_recognitionbiometric_authenticationpose_estimation修改时间:2026-08-18 00:02:35