☰
Ubuntu 20.04 上 OpenPose 1.7 编译与 Python 接口实战指南
2026/10/17 5:58:51 网站建设 项目流程

1. 为什么在 Ubuntu 20.04 上折腾 OpenPose 1.7 值得单独写一篇

如果你最近在做人体的姿态估计、动作分析、体育辅助训练或者交互式装置,大概率绕不开 OpenPose 这个名字。它算是这个方向里比较早把多人 2D 姿态估计做到实时可用的开源方案,CMU 那套自底向上的思路(先检测所有关键点,再聚类成不同的人)到现在看依然很有参考价值。而 1.7 这个版本,是很多人心里比较稳的一个节点——比早期版本在精度和速度上都有明显改善,又不像后面某些分支那样依赖一堆新框架,装起来相对可控。

但问题也恰恰出在“装起来”这三个字上。Ubuntu 20.04 是个分水岭式的系统版本,它自带的 GCC 9、CMake 3.16、Python 3.8,跟 OpenPose 1.7 当年开发时默认的那套工具链(GCC 7 左右、Python 3.6)存在不少代差。官方文档写得比较简略,很多坑只有真正编译过的人才知道。我前后在三台不同配置的机器上装过这个组合,从纯 CPU 到带独立显卡的都有,踩的坑基本能凑成一本小册子。

这篇东西就是把这些经验整理出来。我会从依赖准备、源码编译、模型下载,一直讲到 Python 接口怎么调、参数怎么设、常见报错怎么排查。目标很明确:让你在一台干净的 Ubuntu 20.04 上,尽可能少走弯路地把 OpenPose 1.7 跑起来,并且能用 Python 脚本调它的接口做自己的事情。不管你是刚接触姿态估计的新手,还是被编译错误折磨过的老手,应该都能从里面找到点有用的东西。

需要提前说明的是,下面所有操作都基于公开的开源工具和通用开发流程,涉及的命令和参数我会尽量解释清楚“为什么这么设”,而不是让你无脑复制。毕竟环境这东西,别人的机器能跑不代表你的也能跑,理解原理比记住命令重要得多。

2. 编译之前必须想清楚的几件事:环境、算力与取舍

2.1 先确认你的机器到底适合哪种编译方案

OpenPose 的编译选项非常多,但真正影响你后续使用体验的,其实就那么几个:用不用 GPU、用不用 cuDNN、Python 版本选哪个、要不要编译 3D 模块。这几个选择不是拍脑袋决定的,得看你机器的实际情况。

先看显卡。如果你有一块支持 CUDA 的独立显卡,那强烈建议走 GPU 路线,因为 OpenPose 在 CPU 上的推理速度实在感人——一张普通图片可能要好几秒,视频基本没法实时。但 GPU 路线要求你装对 CUDA 和 cuDNN 版本。OpenPose 1.7 官方推荐的是 CUDA 10.0 或 10.1 配 cuDNN 7.6 左右。Ubuntu 20.04 默认的驱动可能已经比较新,你需要确认驱动支持的 CUDA 版本能不能覆盖到 10.x。如果显卡太新(比如某些 30 系之后的卡),可能得用更新的 CUDA,这时候 OpenPose 1.7 的兼容性就要打个问号,需要额外打补丁。

再看 CPU 和内存。编译 OpenPose 是个体力活,尤其是开了 GPU 支持之后,编译过程会吃掉大量内存。我建议至少准备 8GB 内存,16GB 会更从容。如果内存不够,编译到一半被系统杀掉(OOM Killer)是常有的事,报错信息还特别隐晦,容易让人以为是代码问题。

最后是 Python 版本。Ubuntu 20.04 自带 Python 3.8,这个版本本身没问题,但 OpenPose 1.7 的 Python 接口在编译时会去找特定的 Python 开发库。如果你系统里同时装了 conda 或者多个 Python 版本,很容易出现“编译时找的是 A 版本,运行时用的是 B 版本”的错位,导致 import 失败。我的建议是,要么统一用系统自带的 Python 3.8,要么在 conda 环境里把 Python 开发头文件路径显式传给 CMake,别让它自己猜。

2.2 依赖安装:哪些包是必须的,哪些可以缓一缓

官方给的依赖列表挺长,但实际编译时,有些包如果缺失,报错会非常直接地告诉你缺什么,可以到时候再补。不过有几类依赖最好一开始就装齐,能省不少事。

基础编译工具链这块,build-essential、cmake、git、pkg-config是必须的。Ubuntu 20.04 自带的 CMake 3.16 对 OpenPose 1.7 来说够用,不用特意升级。GCC 版本要注意,系统默认的 GCC 9 在编译某些老代码时可能会报一些警告甚至错误,但 OpenPose 1.7 整体对 GCC 9 的兼容性还可以,我实测能编过。如果遇到奇怪的编译错误,可以考虑装个 GCC 8 并用update-alternatives切换,但这是下策。

图像和视频处理相关的库,libopencv-dev是重头戏。OpenPose 依赖 OpenCV 做图像读写和显示,Ubuntu 20.04 仓库里的 OpenCV 是 4.2 版本,跟 OpenPose 1.7 配合没问题。但要注意,如果你自己另外编译过 OpenCV,路径冲突会导致链接错误。我一般建议直接用系统包,省心。另外libboost-all-dev、libprotobuf-dev、protobuf-compiler、libgoogle-glog-dev、libgflags-dev这些也要装上,它们是 OpenPose 内部依赖的库。

有一个容易被忽略的包是libhdf5-dev,OpenPose 在读写某些模型文件时会用到。还有libatlas-base-dev或者libopenblas-dev,提供线性代数加速。这些包不大,但缺了之后编译到后期才报错,很浪费时间,不如一次性装好。

提示:安装依赖时建议先执行sudo apt update,确保包索引是最新的。如果公司或学校网络对某些源有限制,提前换好可用的镜像源,否则下载到一半卡住会非常难受。

2.3 显卡驱动、CUDA 与 cuDNN 的版本对齐逻辑

这部分是 GPU 路线的核心,也是最容易出问题的地方。很多人编译失败不是因为 OpenPose 本身,而是 CUDA 环境没对齐。

先理清依赖关系:显卡驱动决定了你最高能用的 CUDA 版本,CUDA 版本决定了你能配哪个 cuDNN,而 OpenPose 1.7 对 CUDA 和 cuDNN 有它自己的偏好范围。所以顺序是:先看驱动,再选 CUDA,最后配 cuDNN。

在 Ubuntu 20.04 上,你可以用nvidia-smi查看当前驱动版本和它支持的 CUDA 上限。比如显示 “CUDA Version: 11.4”,说明驱动至少能跑 CUDA 11.4,那装 CUDA 10.1 是没问题的(向下兼容)。但如果你装的是 CUDA 11.x,OpenPose 1.7 的 CMake 脚本可能识别不了,需要手动改一些变量,比较麻烦。所以我的建议是尽量往 10.0 或 10.1 靠。

cuDNN 的安装相对简单,下载对应 CUDA 版本的压缩包,把头文件和库文件复制到 CUDA 安装目录即可。但要注意权限问题,复制完最好sudo ldconfig刷新一下动态链接库缓存,否则编译时可能找不到 cuDNN。

还有一个坑是,如果你之前装过其他版本的 CUDA,系统里可能存在多个版本共存的情况。这时候nvcc --version显示的版本和实际编译时用的版本可能不一致。最稳妥的办法是在 CMake 里显式指定CUDA_TOOLKIT_ROOT_DIR,让它明确用哪个路径下的 CUDA。

3. 从源码到可执行文件:一次完整的编译流程拆解

3.1 获取源码与目录结构说明

OpenPose 的源码托管在公开的代码仓库上,直接用git clone拉下来就行。不过要注意,默认拉的是主分支,可能已经更新到比较新的版本。如果你明确要 1.7,需要切换到对应的标签。

git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git cd openpose git checkout v1.7.0

拉下来之后,先别急着编译,花两分钟看看目录结构,对后面排查问题有帮助。根目录下有几个关键文件夹:src是核心 C++ 代码,include是头文件,python是 Python 接口相关的封装,models是模型文件存放位置(初始是空的),3rdparty里放着一些第三方依赖(比如 Caffe 的修改版)。CMakeLists.txt是编译入口,后面所有配置都围绕它展开。

我习惯在编译前先看一眼CMakeLists.txt里关于 CUDA 和 Python 的部分,确认一下它默认找的路径和版本。虽然不一定改,但心里有数,出问题时知道去哪找。

3.2 CMake 配置阶段:每个开关背后的意图

OpenPose 的编译配置是通过 CMake 变量控制的。官方提供了一个cmake文件夹,里面有一些预设的配置脚本,但直接跑可能会因为环境差异出问题。我一般手动执行 cmake 命令,把关键变量显式传进去。

进入源码目录,创建一个build文件夹并进去:

mkdir build && cd build

然后执行 cmake。下面是一个我常用的配置命令,针对 GPU + Python 接口的场景:

cmake .. \ -DGPU_MODE=GPU_MODE_CUDA \ -DBUILD_PYTHON=ON \ -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so \ -DPYTHON_INCLUDE_DIR=/usr/include/python3.8 \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.1 \ -DCMAKE_BUILD_TYPE=Release

逐个解释一下这些参数。GPU_MODE设为GPU_MODE_CUDA表示启用 CUDA 加速,如果没显卡就改成GPU_MODE_CPU。BUILD_PYTHON=ON是编译 Python 接口的关键,不开这个后面没法 import。PYTHON_EXECUTABLE、PYTHON_LIBRARY、PYTHON_INCLUDE_DIR这三个是告诉 CMake 用哪个 Python,路径要根据你系统实际情况填,用which python3和python3-config --includes可以查到。CUDA_TOOLKIT_ROOT_DIR显式指定 CUDA 路径,避免多版本混淆。CMAKE_BUILD_TYPE=Release表示编译优化版本,速度会快很多,调试阶段如果遇到崩溃想定位问题,可以改成Debug,但会慢不少。

执行完 cmake 后,终端会输出一大堆检查信息。重点看几个地方:CUDA 是否 found、cuDNN 是否 found、Python 版本是否是你指定的那个、OpenCV 版本是否正常。如果有 “NOT FOUND” 的字样,先别继续,回去把对应的依赖补上或者路径改对。

注意:如果 cmake 过程中报错说找不到某个包,优先检查pkg-config能不能找到它。有时候包明明装了,但.pc文件路径不对,CMake 就找不到。可以用pkg-config --cflags --libs 包名测试一下。

3.3 编译与安装:如何避免内存不足和链接错误

cmake 配置成功后,就可以开始编译了。直接用make -j会调用所有 CPU 核心并行编译,速度最快,但也最吃内存。如果你内存只有 8GB,建议用make -j4或者make -j2,牺牲一点速度换稳定。

make -j4

编译过程可能持续十几分钟到半小时不等,取决于机器性能。如果中途报错,终端会停在出错的地方。常见的错误有几类:一是找不到头文件,通常是某个依赖没装或者路径不对;二是链接错误,比如 “undefined reference to xxx”,一般是库版本不匹配或者链接顺序问题;三是编译器内部错误,这种比较少见,可能是内存不足导致的。

编译完成后,执行安装:

sudo make install

这一步会把可执行文件和库文件复制到系统目录。默认安装到/usr/local下。安装完成后,你可以试着运行一下示例程序,验证是否成功:

./examples/openpose/openpose.bin --image_dir examples/media/

如果能看到输出图片或者终端打印出处理信息,说明核心部分已经跑通了。

3.4 模型文件下载:为什么不能跳过这一步

OpenPose 的模型文件(也就是训练好的权重)体积不小,默认不包含在源码里,需要单独下载。官方提供了一个脚本models/getModels.sh,在源码根目录下执行即可:

sudo bash models/getModels.sh

这个脚本会下载 BODY_25、COCO、MPI 等不同关键点格式的模型。如果你只需要人体姿态估计,BODY_25 是首选,它定义了 25 个关键点,包括脚部和手部的部分点位,精度比 COCO 的 18 点更高。下载完成后,模型会放在models/对应子目录下。

这里有个坑:脚本下载的模型文件可能因为网络原因不完整,导致运行时加载失败。如果遇到 “Error loading model” 之类的报错,先检查模型文件大小是否正常,BODY_25 的 caffemodel 大概在 200MB 左右。不完整就重新下载。

另外,模型文件也可以手动下载后放到指定目录,路径结构要和脚本预期的一致。具体来说,models/pose/body_25/下应该有pose_iter_584000.caffemodel和对应的.prototxt文件。

4. Python 接口实战:从 import 到拿到关键点坐标

4.1 让 Python 找到 OpenPose:路径配置的两种方式

编译好 Python 接口后,你会在build/python/openpose/目录下看到生成的.so文件(比如pyopenpose.cpython-38-x86_64-linux-gnu.so)。这个文件就是 Python 模块的核心。但 Python 默认不会去这个目录找模块,所以需要配置路径。

最简单的方式是在脚本里临时添加:

import sys sys.path.append('/path/to/openpose/build/python')

把/path/to/openpose换成你实际的源码路径。这种方式适合快速测试,但每个脚本都要写一遍,比较烦。

另一种方式是设置环境变量PYTHONPATH:

export PYTHONPATH=/path/to/openpose/build/python:$PYTHONPATH

这样在当前终端会话里,所有 Python 脚本都能直接 import。如果想永久生效,可以把这行加到~/.bashrc里。不过要注意,如果你有多个 Python 环境,确保PYTHONPATH对应的 Python 版本和编译时用的一致,否则会报 “module compiled against a different Python version” 之类的错误。

4.2 初始化参数详解:每个参数都在控制什么

OpenPose 的 Python 接口通过一个Wrapper类来使用。初始化时需要传入一个参数字典,这些参数决定了模型加载、推理模式、输出内容等。下面是一个典型的初始化代码:

import pyopenpose as op params = { "model_folder": "/path/to/openpose/models/", "model_pose": "BODY_25", "net_resolution": "656x368", "number_people_max": 1, "render_pose": 1, "display": 0, } opWrapper = op.WrapperPython() opWrapper.configure(params) opWrapper.start()

逐个看这些参数。model_folder指向模型根目录,注意结尾要有斜杠。model_pose选BODY_25还是COCO,取决于你的应用场景,BODY_25 点位更多,适合需要脚部信息的场景。net_resolution是网络输入分辨率,格式是 “宽x高”,必须是 16 的倍数。这个值直接影响精度和速度:调大精度高但慢,调小速度快但可能漏检小目标。656x368 是个比较平衡的默认值,如果图片里人比较小,可以试试 736x416 或更高。

number_people_max限制最多检测几个人,设为 1 可以避免误检,也能提速。render_pose控制是否在输出图像上画骨架,1 是画,0 是不画。display控制是否弹窗显示,服务器上跑一般设为 0,避免没有图形界面时报错。

还有一个常用参数是keypoint_scale,控制关键点坐标的缩放方式。默认是 0,表示坐标是相对于输入图像原始尺寸的。如果设为 1 或 2,会归一化到 0-1 或 0-特定范围,看具体需求。

4.3 处理单张图片与视频流的代码骨架

初始化完成后,处理单张图片的流程很直接:读图、构造 Datum、传给 Wrapper、取结果。

import cv2 import numpy as np image = cv2.imread("test.jpg") datum = op.Datum() datum.cvInputData = image opWrapper.emplaceAndPop(op.VectorDatum([datum])) print("Keypoints shape:", datum.poseKeypoints.shape) print("Keypoints:", datum.poseKeypoints)

datum.poseKeypoints是一个三维数组,形状是(人数, 关键点数, 3),最后一维是(x, y, 置信度)。如果没检测到人,这个数组可能是空的或者形状异常,用之前最好判断一下。

处理视频流的话,思路是把每一帧当成一张图片来处理。可以用 OpenCV 的VideoCapture读帧,循环处理。但要注意,OpenPose 的推理速度如果跟不上视频帧率,会导致延迟累积。这时候可以考虑跳帧处理,比如每两帧处理一次,或者降低net_resolution。

cap = cv2.VideoCapture("test.mp4") while cap.isOpened(): ret, frame = cap.read() if not ret: break datum = op.Datum() datum.cvInputData = frame opWrapper.emplaceAndPop(op.VectorDatum([datum])) # 处理 datum.poseKeypoints cv2.imshow("Output", datum.cvOutputData) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

这段代码在本地有显示器的机器上能跑,如果是远程服务器,cv2.imshow会报错,需要把显示部分去掉,改成保存视频或者直接处理数据。

4.4 关键点数据的后处理:从坐标到可用信息

拿到poseKeypoints只是第一步,原始坐标本身意义有限,通常需要做一些后处理才能用于实际应用。比如计算关节角度、判断动作是否标准、跟踪某个人等。

BODY_25 的关键点索引是固定的,比如 0 是鼻子,1 是脖子,2 是右肩,5 是左肩,9 是右肘,12 是左肘,等等。具体索引表可以在官方文档里查到。知道索引后,就可以取特定点计算角度。比如算右肘弯曲角度,就是取右肩、右肘、右腕三个点,用向量夹角公式计算。

import math def calculate_angle(a, b, c): # a, b, c 是三个点的坐标 (x, y) ang = math.degrees(math.atan2(c[1]-b[1], c[0]-b[0]) - math.atan2(a[1]-b[1], a[0]-b[0])) return abs(ang)

置信度也要用上。如果某个关键点的置信度低于阈值(比如 0.1),说明这个点不可靠,计算角度时应该跳过或者标记为无效。否则会得到一些莫名其妙的结果。

还有一个常见需求是跨帧跟踪同一个人。OpenPose 本身不做跟踪,每帧独立检测。如果要做动作分析,需要自己加跟踪逻辑,比如用最近邻匹配或者卡尔曼滤波。这部分就超出 OpenPose 本身的范围了,但确实是实际项目中绕不开的。

5. 那些官方文档不会告诉你的报错与排查思路

5.1 编译期典型错误:从报错信息反推缺失依赖

编译 OpenPose 时最常见的错误是找不到某个头文件,比如fatal error: caffe/caffe.hpp: No such file or directory。这通常是因为 Caffe 的修改版没有正确编译或者路径没设对。OpenPose 自带了一个修改过的 Caffe,放在3rdparty/caffe下,编译时会自动处理。但如果之前系统里装过其他 Caffe,可能会冲突。解决办法是在 cmake 时加上-DBUILD_CAFFE=ON,强制用自带的。

另一个常见错误是 protobuf 版本冲突。Ubuntu 20.04 仓库里的 protobuf 版本可能比 OpenPose 预期的要新,导致编译时一些 API 不匹配。如果报错涉及 protobuf,可以尝试装一个旧版本的 protobuf,或者在 cmake 时指定-DPROTOBUF_INCLUDE_DIR和-DPROTOBUF_LIBRARY指向兼容版本。

还有一种错误是链接时找不到libopencv_xxx.so。这通常是因为 OpenCV 装了多个版本,链接器找到了错误的那个。可以用ldd命令查看生成的可执行文件依赖了哪些库,确认路径是否正确。

5.2 运行期报错:模型加载失败与显存不足

运行时报错里,模型加载失败是最常见的。错误信息可能是 “Could not open or find the model file” 或者 “Error parsing text-format NetParameter”。前者是路径问题,检查model_folder参数和实际文件位置是否一致。后者通常是模型文件损坏或者版本不匹配,重新下载模型试试。

显存不足是 GPU 路线的另一个大坑。OpenPose 默认会占用不少显存,如果同时跑其他 GPU 任务,很容易 OOM。报错信息可能是 “CUDA out of memory” 或者直接程序崩溃。解决办法有几个:降低net_resolution、减少number_people_max、关掉不需要的模块(比如手部关键点检测很吃显存)。如果还是不够,只能换显卡或者用 CPU 模式。

还有一个隐蔽的问题是 cuDNN 版本不匹配。有时候编译能过,但运行时调用 cuDNN 函数会报错,比如 “CUDNN_STATUS_NOT_INITIALIZED”。这通常是因为运行时加载的 cuDNN 版本和编译时用的不一致。检查LD_LIBRARY_PATH里 cuDNN 库的路径,确保和编译时一致。

5.3 Python 接口的版本错位与路径陷阱

Python 接口报错往往比较隐晦。最常见的是ImportError: dynamic module does not define module export function,这通常是因为 Python 版本不匹配。编译时用的 Python 和运行时用的 Python 必须是同一个版本,包括小版本号。比如编译时用 3.8.10,运行时用 3.8.5,一般没问题,但 3.8 和 3.9 之间就不行。

另一个坑是sys.path里存在多个pyopenpose模块。比如你之前装过另一个版本的 OpenPose,它的.so文件还在路径里,Python 可能加载了错误的那个。解决办法是打印pyopenpose.__file__看看实际加载的是哪个文件,然后清理掉多余的。

还有一种情况是ImportError: libcaffe.so.1.0.0: cannot open shared object file。这说明 Python 能找到pyopenpose,但它依赖的 Caffe 库找不到。需要把 OpenPose 编译出的库路径加到LD_LIBRARY_PATH里,或者用sudo ldconfig刷新系统库缓存。

提示:排查 Python 接口问题时,可以在脚本开头加几行打印,输出sys.version、sys.path、pyopenpose.__file__,这些信息能快速定位大部分路径和版本问题。

5.4 性能调优:让推理速度再快一点

如果一切跑通了,但觉得速度不够理想,可以从几个方面调优。首先是net_resolution,这是影响速度最直接的参数。在精度可接受的范围内尽量调小,比如从 656x368 降到 368x368,速度能提升不少。但要注意,分辨率太低会导致小目标检测不到。

其次是number_people_max,如果你只关心一个人,设为 1 能省掉不少后处理时间。还有scale_number和scale_gap参数,控制多尺度检测的层数,层数越多精度越高但越慢,一般设 1 或 2 就够了。

GPU 方面,可以开cudnn_benchmark让 cuDNN 自动选最快的卷积算法,但第一次运行会慢一点。还可以用--num_gpu指定用哪块显卡,多卡机器上可以指定空闲的那块。

CPU 方面,如果只能用 CPU 模式,可以开--num_threads指定线程数,一般设为物理核心数。但 CPU 模式的提升空间有限,真要实时还是得靠 GPU。

6. 把 OpenPose 用在实际项目里的一些个人体会

6.1 什么场景适合用它,什么场景该换方案

OpenPose 的优势在于多人检测和相对成熟的生态,如果你需要同时分析多个人,或者需要手部、面部关键点,它是个不错的选择。但它的缺点也很明显:模型比较大,推理速度在轻量级设备上不够看,而且 1.7 版本之后官方维护节奏变慢,新硬件支持需要自己折腾。

如果是单人姿态估计,而且对速度要求高,其实可以考虑一些更轻量的方案,比如基于 MobileNet 的轻量姿态模型,在移动端也能跑得动。如果是 3D 姿态,OpenPose 也有 3D 模块,但配置更复杂,精度也有限,不如直接用专门的 3D 姿态方案。

我的建议是,把 OpenPose 当成一个原型验证工具,快速验证想法。如果效果满足需求,再考虑优化或者换更高效的方案。不要一上来就死磕它的性能,那样容易陷入无休止的调参。

6.2 数据精度与稳定性的取舍经验

实际用的时候,关键点抖动是个很烦人的问题。即使人站着不动,检测出的关键点也会有小幅跳动。如果直接拿原始坐标做动作判断,很容易误判。解决办法是对坐标做平滑,比如用滑动平均或者卡尔曼滤波。滑动平均简单,但会引入延迟;卡尔曼滤波效果好,但调参麻烦。

置信度阈值也要根据场景调。默认的 0.1 比较宽松,会保留很多不可靠的点。如果做精确分析,可以调到 0.3 甚至 0.5,过滤掉低质量检测。但调太高会导致某些帧完全检测不到人,需要权衡。

还有一个经验是,尽量保证输入图像质量。光照不足、遮挡严重、分辨率太低,都会显著影响检测效果。如果条件允许,在预处理阶段做一下图像增强,比后期调参有效得多。

6.3 后续可以继续扩展的方向

跑通基础功能之后,可以往几个方向扩展。一是结合目标检测做区域限定,比如只分析画面中某个区域内的人,减少误检。二是把关键点数据存下来做时序分析,比如统计一段时间内的动作频率、幅度变化。三是和 Unity 或 Web 端结合,做交互式应用,比如体感游戏或者虚拟试衣。

如果对精度要求更高,可以尝试自己训练模型,用特定场景的数据微调。OpenPose 支持自定义训练,但需要准备标注数据,工作量不小。另一个方向是模型压缩和加速,比如用 TensorRT 做推理优化,能显著提升 GPU 上的速度,但转换过程需要一些工程经验。

我个人在实际项目里的体会是,OpenPose 最大的价值是让你快速看到姿态估计能做什么,而不是它本身有多完美。真正落地时,往往需要根据具体需求做大量定制和优化。把它当成起点,而不是终点,心态会好很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询