Ubuntu 20.04 + RTX 3070 显卡下 OpenPose 环境搭建全攻略(含 Conda 虚拟环境避坑指南)
在计算机视觉领域,OpenPose 作为一款强大的实时多人姿态估计工具,被广泛应用于动作识别、运动分析等场景。对于拥有 NVIDIA RTX 3070 显卡的开发者来说,在 Ubuntu 20.04 系统下搭建 OpenPose 环境可能会遇到一些特有的挑战,尤其是当你想在 Conda 虚拟环境中运行它时。本文将带你一步步完成整个搭建过程,并重点解决那些可能让你头疼的问题。
1. 环境准备与依赖安装
在开始之前,确保你的系统已经安装了 NVIDIA 驱动和 CUDA 11.1。RTX 3070 显卡需要至少 CUDA 11.1 版本才能正常工作。你可以通过以下命令检查:
nvidia-smi nvcc --version接下来,我们需要安装一些基础依赖。虽然 OpenPose 官方文档建议不使用 Conda,但实践证明在 Conda 虚拟环境中也是可行的。首先创建一个新的 Conda 环境:
conda create -n openpose python=3.6.13 conda activate openpose安装必要的系统依赖:
sudo apt-get update sudo apt-get install -y build-essential cmake-qt-gui libopencv-dev对于 Caffe 相关的依赖,我们可以选择性安装:
sudo apt-get install -y libatlas-base-dev libprotobuf-dev libleveldb-dev \ libsnappy-dev libhdf5-serial-dev protobuf-compiler libboost-all-dev \ libgflags-dev libgoogle-glog-dev liblmdb-dev注意:如果你只打算使用 OpenPose 进行推理而不训练模型,可以跳过安装 liblmdb-dev。
2. 获取 OpenPose 源代码与 CMake 配置
克隆 OpenPose 官方仓库:
git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git cd openpose创建构建目录并启动 CMake GUI:
mkdir build cd build cmake-gui ..在 CMake GUI 中,我们需要进行以下关键配置:
- 设置源目录为 OpenPose 根目录
- 设置构建目录为刚创建的 build 目录
- 点击 "Configure" 按钮
- 在配置选项中:
- 启用
BUILD_PYTHON - 设置
GPU_MODE为CUDA - 对于 RTX 3070,你可能需要禁用
USE_CUDNN
- 启用
提示:禁用 CUDNN 是因为 Caffe 对 CUDA 11+ 的支持不完善,这会导致编译错误。
配置完成后点击 "Generate" 生成 Makefile。
3. 编译 OpenPose 与常见问题解决
开始编译过程:
make -j$(nproc)编译过程可能需要较长时间(30分钟到1小时不等),取决于你的硬件配置。在这个过程中,你可能会遇到以下问题:
问题1:CUDNN 不兼容错误
error: #error "CUDNN version >= 7.0 is required"解决方案:在 CMake 配置中禁用USE_CUDNN选项。虽然这会降低一些性能,但能保证编译通过。
问题2:显存不足错误
CUDA out of memory这是由于禁用 CUDNN 后,模型加载时会临时占用约 8GB 显存。对于 RTX 3070(8GB 显存)来说,这可能导致问题。解决方法有:
- 使用更小的模型(如
--model_pose BODY_25) - 降低输入分辨率(如
--net_resolution 320x176) - 在加载模型前关闭其他占用显存的程序
4. Python 接口安装与测试
编译完成后,我们需要将 Python 接口安装到 Conda 环境中。首先找到编译生成的 .so 文件:
ls build/python/openpose/你应该能看到类似pyopenpose.cpython-36m-x86_64-linux-gnu.so的文件。将其复制到 Conda 环境的 site-packages 目录:
cp build/python/openpose/pyopenpose.cpython-36m-x86_64-linux-gnu.so \ ~/anaconda3/envs/openpose/lib/python3.6/site-packages/创建符号链接并重命名:
cd ~/anaconda3/envs/openpose/lib/python3.6/site-packages/ ln -s pyopenpose.cpython-36m-x86_64-linux-gnu.so pyopenpose现在你可以在 Python 中导入 OpenPose 了:
import pyopenpose as op测试 OpenPose 是否正常工作:
./build/examples/openpose/openpose.bin --video examples/media/video.avi5. 性能优化与实用技巧
为了让 OpenPose 在 RTX 3070 上运行得更高效,这里有一些实用技巧:
分辨率选择:
- 对于实时应用,建议使用
--net_resolution 656x368 - 对于精度要求高的场景,可以使用
--net_resolution 1280x720
- 对于实时应用,建议使用
模型选择:
--model_pose COCO # 轻量级模型(18个关键点) --model_pose BODY_25 # 更详细的模型(25个关键点)多线程处理:
--num_gpu 1 --num_gpu_start 0 # 使用单个GPU --number_people_max 1 # 限制检测人数提高速度内存管理:
- 定期重启 OpenPose 进程以避免内存泄漏
- 使用
--disable_blending减少显存使用
对于 Python 开发者,这里有一个简单的使用示例:
import cv2 import pyopenpose as op params = { "model_folder": "models/", "net_resolution": "320x176", "model_pose": "BODY_25" } opWrapper = op.WrapperPython() opWrapper.configure(params) opWrapper.start() datum = op.Datum() imageToProcess = cv2.imread("input.jpg") datum.cvInputData = imageToProcess opWrapper.emplaceAndPop([datum]) print("Body keypoints: \n" + str(datum.poseKeypoints)) cv2.imshow("Output", datum.cvOutputData) cv2.waitKey(0)6. 高级配置与自定义模型
如果你需要更高级的功能,OpenPose 支持多种自定义配置:
手部和面部检测:
--hand --hand_net_resolution 320x320 --face --face_net_resolution 320x3203D 姿态估计:
--3d --number_people_max 1使用自定义模型:
- 将训练好的模型放在
models/pose/[model_type]/目录下 - 通过
--model_pose指定模型类型
- 将训练好的模型放在
对于想要在 Conda 环境中长期使用 OpenPose 的开发者,建议将以下内容添加到环境变量中:
export OPENPOSE_ROOT=/path/to/your/openpose export PYTHONPATH=$PYTHONPATH:$OPENPOSE_ROOT/build/python这样你就可以在任何位置导入 pyopenpose 模块了。