OpenPose 在 Nvidia Jetson TX1 上的安装实战:JetPack 3.1 定制内核、OpenCV 源码编译与 CUDA 架构适配
【免费下载链接】openposeOpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation项目地址: https://gitcode.com/gh_mirrors/op/openpose
OpenPose 官方并不正式支持 Jetson TX1,但社区成员 @dreinsdo 实测贡献了一套完整、可复现的安装流程,并整理成本文所依据的 installation_jetson_tx1.md 文档。本指南将完整还原这条从零开始的 TX1 安装路线:刷写 JetPack 3.1、把文件系统迁移到大容量 SATA 盘、定制内核以驱动外接 USB 摄像头、源码编译 OpenCV 3.4.0,再到修改 OpenPose 与 Caffe 的 Makefile 配置使其适配 TX1 的 CUDA 架构(compute capability 5.3)。读完本文,你可以在 TX1 上独立完成 OpenPose 的构建,并掌握在有限显存约束下通过分辨率参数调优获得可用帧率的实战方法。
背景:为什么 TX1 需要一套"非官方"安装流程
OpenPose 官方文档明确表示对 TX1 不做官方支持,社区成员 @dreinsdo 在 issue 中共享了其在 TX1 上的完整实测过程,官方仓库据此收录了本文档。整套流程之所以复杂,是因为 TX1 相比桌面 GPU 平台存在四个核心障碍:
| 障碍 | 表现 | 应对方案 |
|---|---|---|
| eMMC 存储空间有限 | 不足以容纳系统、工具链与模型 | 将文件系统迁移到 SATA SSD(如 120GB SSD) |
| 板载摄像头无法与 OpenPose 配合 | 采集不可用 | 定制内核,使用 USB 外接摄像头(如 PS3 Eye) |
| JetPack 3.1 自带 OpenCV 缺少 OpenPose 依赖 | 编译/运行期缺库 | 从源码重新编译 OpenCV 3.4.0 |
| OpenPose Makefile 与 TX1 的 CUDA 架构不兼容 | 默认 CUDA_ARCH 不含 TX1 的 compute 5.3 | 手工改写 Makefile 配置 |
大部分 USB 摄像头与 SATA 硬盘均可胜任上述替代方案,不限定于特定型号。
前置条件清单:
- Jetson TX1 板卡 + 一个 SATA 硬盘 + 一个 USB 摄像头(推荐 PS3 Eye)
- 可用的 Linux 主机用于运行 JetPack 刷机工具
- JetPack 3.1 环境:Ubuntu 16.04(L4T)、CUDA 8、cuDNN 6,以及系统预装的 OpenCV
- OpenPose 依赖:Caffe 及其全部依赖、GFlags(demo 与教程程序使用)
第 1 步:刷写 JetPack 3.1 并迁移文件系统到 SATA 盘
首先按照 JetPack 的官方安装指南为 TX1 刷写 JetPack 3.1。务必完整完成"OS 刷写"与"CUDA / cuDNN 安装"两个部分后再继续,否则后续编译会因缺少驱动与库而失败。
刷机完成后,执行文件系统迁移,参考 JetsonHacks 系列中针对 TX1 的 SATA 盘迁移文章操作,将根文件系统移动到 SATA 盘。该步骤的目的是绕开 TX1 板载 eMMC 的容量限制:Caffe、OpenCV 源码树、OpenPose 源码以及训练好的模型文件都需要占用数 GB 空间,eMMC 很容易吃紧。
第 2 步:定制内核:让外接 USB 摄像头可用
这一步的必要性来自实测结论:OpenPose 无法与 TX1 板载摄像头配合工作,因此必须换用 USB 摄像头。而要让 USB 摄像头(以 PS3 Eye 为例)在 TX1 上工作,需要在内核中启用对应驱动。整体流程综合了两篇 JetsonHacks 文章的做法(Build Kernel 与 ttyACM 模块、Sony PlayStation Eye 驱动)。
获取 JetsonHacks 的 TX1 内核构建脚本(
buildJetsonTX1Kernel的 v1.0-L4T28.1 版本 zip,即 JetPack 3.1 对应发行版)。注意不要直接 clone master 分支——master 上是最新的内核构建文件,与 JetPack 3.1 不兼容。解压后进入目录,运行脚本拉取内核源码。脚本会打开内核配置界面:
$ cd buildJetsonTX1Kernel $ sudo ./getKernelSources.sh在内核配置界面中找到你所使用摄像头的驱动,用复选框(check box,而非单选框 dot)选中后保存并退出。如果使用 PS3 Eye,需要启用对应的 ttyACM 与驱动模块;换成其他型号摄像头时,替换为对应驱动即可。
编译内核:
$ sudo ./makeKernel.sh- 用新编译的内核镜像替换当前内核:
$ sudo cp /usr/src/kernel/kernel-4.4/arch/arm64/boot/Image ($PATH_TO_EMMC)/boot/Image将$PATH_TO_EMMC替换为你的 eMMC 挂载路径。即使系统运行在 SATA 盘上,这一步也不能省略——Jetson 初始仍从 eMMC 启动并加载内核,所以新内核必须写到 eMMC 的 boot 分区才会生效。
第 3 步:源码编译 OpenCV(跳过 Python3 依赖)
JetPack 3.1 预装的 OpenCV 构建不完整,缺少 OpenPose 所需的依赖,因此需要从源码自行编译 OpenCV 3.4.0。参考 JK Jung 针对 Jetson TX2 的 OpenCV 3.4.0 安装步骤,原样照做即可,但有一处例外:省略 Python3 依赖的安装,即跳过下面三行:
$ sudo apt-get install python3-dev python3-pip python3-tk $ sudo pip3 install numpy $ sudo pip3 install matplotlib其余编译选项(如 CUDA 支持、V4L 等)保持原步骤不变。编译完成后,确保系统能找到新装的 OpenCV,再进入 OpenPose 安装环节。
第 4 步:安装 OpenPose:三处关键修改
安装的核心是修改三个文件。文档作者同时提供了修改后的文件版本可供直接替换,若采用该方式,需将两份 Makefile 配置统一改名为Makefile.config.Ubuntu16_cuda8_JetsonTX2。下面按逐文件修改的方式展开。
4.1 克隆源码
$ git clone https://gitcode.com/gh_mirrors/op/openpose $ cd openpose4.2 修改 OpenPose 的 Makefile 配置(CUDA 架构是重点)
用编辑器打开仓库中的 Makefile.config.Ubuntu16_cuda8_JetsonTX2:
$ gedit scripts/ubuntu/Makefile.config.Ubuntu16_cuda8_JetsonTX2对照当前仓库中该文件的现状(第 18 行 的OPENCV_VERSION := 3处于注释状态,第 33–39 行 的CUDA_ARCH仍是面向桌面 GPU 的 compute_30 至 compute_61 全集,且文件内并没有USE_CUDNN定义),需要做三处修改:
修改一:启用 OpenCV 3
取消注释OPENCV_VERSION一行:
OPENCV_VERSION := 3修改二:替换全部 CUDA_ARCH 为 TX1 架构
把文件中所有CUDA_ARCH :=行替换为下面这一行:
CUDA_ARCH := -gencode arch=compute_53,code=[sm_53,compute_53]这是整套流程中最关键的一步。Tegra X1 集成的 GPU 基于 Maxwell 架构,其 compute capability 为 5.3;而仓库默认的CUDA_ARCH集合(compute_30/35/50/52/60/61)并不包含 5.3,直接编译会因"不支持的 GPU 架构"失败。arch=compute_53,code=[sm_53,compute_53]同时生成 SASS(sm_53)与 PTX(compute_53)两种代码,兼顾运行与未来兼容。在本仓库 scripts 目录的全局检索中也确实不存在任何compute_53字样,进一步印证该替换是 TX1 平台独有的必要操作。
修改三:追加 cuDNN 开关
USE_CUDNN := 1文档作者特别注明:这一项是否必需尚未完全确认(未在去掉它的条件下重试过安装),保留开启是更稳妥的选择。
4.3 修正安装脚本中的路径调用 bug
用编辑器打开 install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh:
$ gedit scripts/ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh将第 44 行的:
executeShInItsFolder "install_openpose_JetsonTX2_JetPack3.1.sh" "./scripts/ubuntu/" "./"替换为:
executeShInItsFolder "./scripts/ubuntu/install_openpose_JetsonTX2_JetPack3.1.sh" "./" "./"从仓库中该脚本的实现(第 22–34 行)可以看出executeShInItsFolder的工作方式:cd $2进入脚本所在目录 →bash ./$1执行脚本 →cd $3回到工作目录。TX1 文档指出的问题在于原写法把"脚本所在目录"与"执行脚本时的当前工作目录"混在一起:install_openpose_JetsonTX2_JetPack3.1.sh内部依赖从仓库根目录执行(需要cp scripts/ubuntu/Makefile.example Makefile),若工作目录落在./scripts/ubuntu/下就会出错。对比同仓库 JetPack 3.3 版本的 install_caffe_and_openpose_JetsonTX2_JetPack3.3.sh,其写法正是executeShInItsFolder "./scripts/ubuntu/install_openpose_JetsonTX2_JetPack3.3.sh" "./" "./",与文档要求的修正后写法一致,可作为交叉印证。
4.4 分段安装:Caffe 编译前中断并同步修改其配置
启动安装脚本。脚本的整体执行逻辑(见 install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh)是:先通过git submodule update --init --recursive --remote拉取 Caffe 子模块,再执行 Caffe 的安装脚本,最后执行 OpenPose 的安装脚本。
bash ./scripts/ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh脚本首次运行时会 clone Caffe 仓库并下载相关文件。当 Caffe 开始编译时,立即用CTRL+C中断,然后修改 Caffe 仓库内的 Makefile 配置:
$ gedit 3rdparty/caffe/Makefile.config.Ubuntu16_cuda8_JetsonTX2对它做与 4.2 节完全相同的修改(OPENCV_VERSION := 3、CUDA_ARCH替换为 compute_53)。唯一差异是 Caffe 配置中的 CUDNN 开关默认已经开启,无需再追加。
为什么必须分两段?因为 Caffe 作为 git submodule 是在脚本运行时才被拉取到本地的,其 Makefile 配置只能等 Caffe 代码就位后再修改;而一旦编译已经开始,中途改配置不会生效,所以要在"编译刚开始但尚未大量产出产物"的时间点中断修改,再重新启动脚本让 Caffe 用新配置编译。
修改完成后,重新运行同一个安装脚本:
bash ./scripts/ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh这次脚本会完成全部剩余工作。OpenPose 部分由 install_openpose_JetsonTX2_JetPack3.1.sh 完成,其内部行为(第 45–58 行)包括:
- 复制
Makefile.example为Makefile,复制Makefile.config.Ubuntu16_cuda8_JetsonTX2为Makefile.config(即 4.2 节修改的配置在此刻生效); - 执行
make all -jnproc`` 全量并行编译 OpenPose; - 调用 models/getModels.sh 下载 BODY_25、COCO、MPI、face、hand 等所需的模型文件。
全部结束后,build/examples/openpose/openpose.bin即为可直接运行的 demo 可执行文件。
第 5 步:运行与性能调优
5.1 基础运行:降低网络分辨率换取可用帧率
TX1 的 GPU 算力与显存都很有限,要获得可接受的帧率,必须同时降低摄像头采集分辨率与网络推理分辨率:
./build/examples/openpose/openpose.bin -camera_resolution 640x480 -net_resolution 128x96camera_resolution 640x480:将摄像头采集分辨率从默认的 1280x720(见 include/openpose/flags.hpp 中camera_resolution的默认值说明)降到 640x480,减少上游输入数据量。net_resolution 128x96:网络推理输入尺寸。net_resolution要求为 16 的倍数(flags.hpp),128x96 满足该约束;在精度可接受的场景下,分辨率越低推理越快,这是 TX1 上获得流畅帧率的关键杠杆。默认的-1x368(16:9 画面下等效 656x368)对 TX1 来说负担过重。
补充说明:示例中camera_resolution使用单横线前缀,而 face/hand 参数使用双横线前缀,两种写法在 gflags 解析规则下等价,OpenPose 的 demo 命令行参数均由 include/openpose/flags.hpp 定义,运行openpose.bin --help可查看全部参数说明。
5.2 开启人脸 / 手部检测(注意显存上限)
在基础命令之上追加--face或--hand即可激活对应检测,并将对应网络的net_resolution从默认的 368x368 调低以匹配 TX1:
# Body and face ./build/examples/openpose/openpose.bin --face -face_net_resolution 256x256 # Body and hands ./build/examples/openpose/openpose.bin --hand -hand_net_resolution 256x256 # All body, face, and hands ./build/examples/openpose/openpose.bin --face -face_net_resolution 256x256 --hand -hand_net_resolution 256x256face_net_resolution与hand_net_resolution同样要求为 16 的倍数且为正方形(见 flags.hpp 与 flags.hpp),默认值均为 368x368。务必注意文档中的显式警告:face 与 hand 同时开启会触发内存不足(out of memory)错误——TX1 的共享内存带宽与容量无法同时支撑两个附加检测网络,实际使用时应二选一。
5.3 常用参数速查
以下参数默认值均可在 include/openpose/flags.hpp 中查证:
| 参数 | 默认值 | 说明 |
|---|---|---|
camera_resolution | -1x-1(等效 1280x720) | 摄像头采集分辨率,TX1 上建议 640x480 |
net_resolution | -1x368 | 姿态网络输入分辨率,须为 16 的倍数,TX1 上建议 128x96 |
face_net_resolution | 368x368 | 人脸网络输入,16 的倍数且为正方形,TX1 上建议 256x256 |
hand_net_resolution | 368x368 | 手部网络输入,约束同上 |
face | false | 是否开启人脸关键点检测 |
hand | false | 是否开启手部关键点检测 |
model_folder | models/ | 模型文件所在目录 |
注意事项与延伸阅读
- 外接摄像头是必要条件:当前流程下请始终使用 USB 摄像头(如 PS3 Eye),不要依赖 TX1 板载摄像头。
- 本方案由社区维护:文档作者明确说明 OpenPose 对 Jetson TX1 不做官方支持,本流程来自社区实测。若安装过程遇到问题,可在文档对应的 issue 帖中反馈交流。
- 脚本注释中的环境假设:仓库中的安装脚本(install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh)在开头注明其假设"刚刷写完 JetPack 3.1(Ubuntu 16、CUDA 8、cuDNN 6 与 OpenCV 已安装)",任何一项不满足都可能失败。
- 同系列文档:TX2 平台有两条更简化的官方社区安装路径,安装方式类似(均为一条脚本完成 Caffe + OpenPose),可参考 installation_jetson_tx2_jetpack3.1.md 与 installation_jetson_tx2_jetpack3.3.md,其中 JetPack 3.3 版还包含 Python 接口(pyopenpose)的构建说明。
- 后续使用:安装完成后,完整的 demo 参数与输出格式说明可进一步查阅 doc/01_demo.md 与 doc/02_output.md。
【免费下载链接】openposeOpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation项目地址: https://gitcode.com/gh_mirrors/op/openpose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考