OpenPose是一个开源的实时多人姿态估计库,由卡内基梅隆大学的研究团队开发。它能从图像或视频中检测人体关键点(如关节、面部特征点等),并构建出完整的人体骨架模型。这个工具最初发布于2017年,现已成为计算机视觉领域最流行的姿态分析工具之一。
注意:虽然OpenPose支持多人检测,但在密集人群场景下性能会明显下降,这是所有姿态估计算法面临的共同挑战。
我最早接触OpenPose是在2018年做健身动作分析项目时。当时测试了多个开源方案,发现OpenPose在准确率和实时性上达到了很好的平衡。它的最大优势是能在普通消费级GPU上实现接近实时的多人检测——这在当时是突破性的。
OpenPose的工作流程可以分为三个阶段:
最新版OpenPose(1.7.0)支持:
实测发现,在GTX 1080Ti上处理640x480图像时:
推荐使用Ubuntu 18.04/20.04系统,安装步骤:
bash复制# 1. 安装依赖
sudo apt-get install build-essential cmake git libopencv-dev
# 2. 克隆仓库
git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose
cd openpose
# 3. 安装Caffe(OpenPose修改版)
git submodule update --init --recursive
cd 3rdparty/caffe
git apply ../../ubuntu/18.04/caffe.patch
cd ../..
# 4. 编译安装
mkdir build && cd build
cmake -DBUILD_PYTHON=ON ..
make -j`nproc`
Windows用户可以直接下载预编译版本,但自定义模型时需要自行编译。
Python接口最简单的调用方式:
python复制import openpose as op
params = {
"model_folder": "models/",
"hand": True, # 启用手部检测
"face": True # 启用面部检测
}
op_wrapper = op.WrapperPython()
op_wrapper.configure(params)
op_wrapper.start()
datum = op.Datum()
image_to_process = cv2.imread("test.jpg")
datum.cvInputData = image_to_process
op_wrapper.emplaceAndPop([datum])
# 输出结果
print(datum.poseKeypoints) # 身体关键点坐标
print(datum.handKeypoints) # 手部关键点
cv2.imshow("Output", datum.cvOutputData)
我在健身房管理系统项目中应用OpenPose实现了:
关键算法片段:
python复制def calculate_knee_angle(hip, knee, ankle):
"""计算膝关节弯曲角度"""
thigh = hip - knee
shin = ankle - knee
cosine_angle = np.dot(thigh, shin) / (np.linalg.norm(thigh) * np.linalg.norm(shin))
return np.degrees(np.arccos(cosine_angle))
结合手部关键点开发的空中手势控制:
通过修改models/getModels.sh可以下载不同大小的模型:
body25:最重但最准确(~200MB)body_135cm:轻量版,适合近距离拍摄body_101b:最轻量版(~50MB),牺牲部分精度C++接口支持异步处理模式:
cpp复制op::Wrapper opWrapper;
opWrapper.start();
while(1) {
auto datumProcessed = opWrapper.emplaceAndPop(image);
// 处理结果...
}
修改net_resolution参数显著影响性能:
656x368:平衡精度与速度320x176:速度优先1280x720:精度优先实测数据(GTX 1660 Super):
| 分辨率 | FPS | 内存占用 |
|---|---|---|
| 320x176 | 28 | 1.2GB |
| 656x368 | 15 | 2.8GB |
| 1280x720 | 6 | 4.5GB |
解决方案:
--tracking 1启用跟踪算法--scale_number减少多尺度检测当长时间运行时可能出现内存增长:
Datum对象--disable_multi_thread排除线程问题对于部分遮挡的肢体:
--part_candidates保留低置信度检测通过多视角OpenPose检测:
基于时序关键点数据:
结合服装分割算法:
我在实际项目中发现,OpenPose的精度对于紧身衣物效果较好,但宽松服装会导致关键点偏移。这时需要结合轮廓检测进行校正。另一个经验是,对于亚洲人种的面部检测,可能需要微调关键点权重,特别是内眼角位置。