背景/问题
传统视频监控系统只能被动录像,无法自动分析人员动作。工厂园区需要监测员工是否违规越界,养老院需要识别老人跌倒,零售门店需要统计客户行为——这些场景都依赖人员行为识别技术。传统方法人工盯屏效率低、疲劳误判率高,而AI计算机视觉技术能够实时检测、识别和预警,将被动监控升级为主动智能。
然而,构建一套完整的行为识别系统并非易事,涉及视频流处理、姿态估计、行为推理、服务部署等多个环节。本文结合阿里云函数计算(Function Compute)等云原生服务,给出一个从算法设计到云端部署的完整方案,帮助开发者快速搭建可运行的人员行为识别Demo。
方案设计
系统整体采用端云协同架构,如下图所示:
graph TD
A[摄像头/视频文件] --> B[阿里云OSS存储]
B --> C[函数计算 FC 推理服务]
C --> D[行为识别模型]
D --> C
C --> E[(数据库/结果API)]
C --> F[告警通知]
- 数据接入层:摄像头视频流通过推流或本地上传方式存入阿里云OSS,也可以直接通过函数计算的HTTP触发器上传。
- 推理计算层:使用阿里云函数计算承载推理服务。函数计算按调用次数计费,支持自动弹性伸缩,无需手动管理GPU/CPU服务器。对于轻量级姿态识别,CPU实例即可满足实时性要求。
- 算法层:采用MediaPipe进行人体姿态关键点提取,通过计算关键点空间关系或结合LSTM等时序模型,实现行为分类。
- 输出层:识别结果(行为标签、置信度、时间戳)写入表格存储或通过API推送给业务系统,触发相应告警。
该方案的优势在于:无服务器运维、按量付费、自动扩容,尤其适合需要应对突发视频流量的场景。
实现步骤
1. 环境准备
pip install mediapipe opencv-python numpy
如果需要将模型包装成HTTP服务,可额外安装Flask或FastAPI。
2. 姿态关键点提取
MediaPipe提供预训练的人体姿态检测模型,可同时检测33个人体关键点(含左右肩膀、肘部、手腕、髋部、膝盖等)。每一帧图像送入模型后,返回每个关键点的归一化坐标 (x, y, z, visibility)。
3. 行为分类
本文示例采用关键点几何规则进行行为识别:通过计算关键点之间的角度和相对位置,判断当前人员是站立、举手还是弯腰。该方法无需GPU和训练数据,适合快速上手。对精度要求更高的场景,可替换为LSTM或Transformer模型,从关键点序列中学习时序行为模式。
4. 云上部署
将推理代码封装为Flask应用,并打包成函数计算的自定义镜像或Python Runtime。通过函数计算的HTTP触发器对外提供服务,视频文件可存储于OSS,函数内使用OSS SDK读取视频流,再将推理结果写入数据库。
代码示例
下面是一个可运行的行为识别推理脚本。它打开摄像头(或视频文件),逐帧提取姿态关键点,实时输出行为标签。
import cv2
import mediapipe as mp
import numpy as np
# 初始化 MediaPipe Pose
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
static_image_mode=False,
model_complexity=1,
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
mp_drawing = mp.solutions.drawing_utils
def get_angle(a, b, c):
"""计算三个关键点构成的角度(度数)
a, b, c 为 [x, y] 坐标,b 为顶点
"""
rad = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])
angle = np.abs(rad * 180.0 / np.pi)
if angle > 180.0:
angle = 360 - angle
return angle
def recognize_pose(landmarks):
"""基于关键点规则的行为识别
返回 'raising hand' / 'bending' / 'standing'
"""
# 常用关键点索引:
# 11左肩, 12右肩, 13左肘, 14右肘, 15左腕, 16右腕
# 23左髋, 24右髋, 25左膝, 26右膝
left_shoulder = [landmarks[11].x, landmarks[11].y]
right_shoulder = [landmarks[12].x, landmarks[12].y]
left_elbow = [landmarks[13].x, landmarks[13].y]
right_elbow = [landmarks[14].x, landmarks[14].y]
left_wrist = [landmarks[15].x, landmarks[15].y]
right_wrist = [landmarks[16].x, landmarks[16].y]
left_hip = [landmarks[23].x, landmarks[23].y]
right_hip = [landmarks[24].x, landmarks[24].y]
# 判断举手:腕部高于肩部 且 肘关节接近伸直(>150度)
left_angle = get_angle(left_shoulder, left_elbow, left_wrist)
right_angle = get_angle(right_shoulder, right_elbow, right_wrist)
if (left_wrist[1] < left_shoulder[1] and left_angle > 150) or \
(right_wrist[1] < right_shoulder[1] and right_angle > 150):
return "raising hand"
# 计算躯干倾斜角度:肩部中心 → 髋部中心 向量与垂直向下方向的夹角
shoulder_center = [
(left_shoulder[0] + right_shoulder[0]) / 2,
(left_shoulder[1] + right_shoulder[1]) / 2
]
hip_center = [
(left_hip[0] + right_hip[0]) / 2,
(left_hip[1] + right_hip[1]) / 2
]
vec = np.array(hip_center) - np.array(shoulder_center)
vertical = np.array([0, 1]) # 图像坐标系中向下为 y 正方向
cos = np.dot(vec, vertical) / (np.linalg.norm(vec) * np.linalg.norm(vertical))
angle = np.degrees(np.arccos(np.clip(cos, -1.0, 1.0)))
if angle > 30:
return "bending"
return "standing"
# 打开摄像头(如果要分析视频文件,可以改为 video_path)
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# MediaPipe 需要 RGB 输入
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = pose.process(rgb)
if results.pose_landmarks:
# 绘制骨骼关键点和连接线
mp_drawing.draw_landmarks(
frame,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS
)
# 识别行为
action = recognize_pose(results.pose_landmarks.landmark)
cv2.putText(frame, action, (10, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('AI Behavior Recognition', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
关键步骤说明
- 初始化姿态模型:
mp_pose.Pose(model_complexity=1)在CPU上也能达到较高FPS,适合实时视频。 - 关键点索引:MediaPipe Pose输出的33个关键点有固定顺序,本文使用了肩膀、肘部、手腕、髋部等索引。具体索引可参考官方文档。
- 角度计算:
get_angle利用反正切函数计算三点夹角,是判断关节状态的常用几何方法。 - 行为规则:
- 举手:腕部归一化Y坐标小于肩部Y坐标(图像Y轴向下,越小越靠上),且肘关节角度大于150度。
- 弯腰:肩部中心与髋部中心连线偏离垂直方向超过30度。
注意事项
1. 模型选择
基于规则的方法只能识别少数预设动作,且容易受遮挡、视角变化影响。生产环境建议使用时序行为识别模型(如LSTM+关键点序列、Action Transformer),并用真实业务数据训练。训练时可借助阿里云PAI-DSW等AI开发平台,利用GPU加速。
2. 性能优化
- 在函数计算中,推理服务应尽量减少冷启动影响。可使用
initializer预加载模型,并设置合理的实例并发度。 - 视频流处理可先降采样到合理分辨率(如512×512),降低时延。
- 如果同时处理多路视频流,建议接入消息队列削峰填谷。
3. 隐私与安全
人员行为识别涉及人脸、体态等敏感信息。落地时应:
- 对视频帧做脱敏处理(如模糊人脸区域);
- 数据在传输和存储时加密(阿里云OSS支持服务端加密);
- 遵守当地法律法规,明确告知监控区域人员。
4. 成本控制
函数计算按调用次数和资源使用量计费,适合低频或突发场景。若需7x24小时高并发处理,建议评估使用专用GPU实例或容器服务部署,以获得更高性价比。
总结
本文从工程角度介绍了AI人员行为识别系统的设计与实现。通过MediaPipe姿态估计提取关键点,结合规则或深度学习模型完成行为分类;借助阿里云函数计算和OSS,可以快速构建一套Serverless架构的智能识别服务。示例代码可直接运行,帮助开发者直观感受AI视觉技术的落地过程。后续可扩展的方向包括:跌倒检测、打架识别、越界告警等,欢迎开发者在此基础上继续探索。