OpenPoseの動作環境の構築

解説

Jetson Orin Nano で、「画像から人の骨格の推定」の動作環境を構築する方法についてまとめます。

動作環境のベースとなる環境として、NVIDIA社から提供されているDockerイメージの中から、AIアプリケーション開発用のDockerイメージ「L4T JetPack」を利用します。

このページでは、OpenPose の動作環境を構築します。

前提

OpenPose の処理の中には、多くのメモリを必要とする処理、多くの計算能力を必要と処理もあります。またディスク容量は多いにこしたことはありません。
これらを踏まえ、以下を実施済みの状態の Jetson Orin Nano を前提とします。

ブートデバイスのNVMe SSDへの変更
Jetson Orin Nano の既定のブートデバイスは、SDカードです。SDカードは、読み書きの速度が速くはなく、また、ディスク容量も多くはありません。ブートデバイスをNVMe SSDに変更しておきます。
参考)
Jetson Orin Nano で日本語LLMを動かしてみた
Jetson Orin NanoのNVMe SSDを使ったOSイメージのセットアップ手順 #NVIDIA - Qiita
Jetson Orin Nano開発者キットでHシリーズNVMe SSDを使う! │ HAGIWARA Solutions
デスクトップ環境の無効化
デスクトップ環境は多くのメモリを必要としますが、OpenPose の動作においては必要ないので、無効化しておきます。
参考)
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita
その他サービスを無効化
カメラ機能を使うときに動くバックグラウンドサービス「nvargus-daemon.service」は必要ないので、無効化しておきます。
参考)
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita
スワップ領域の拡張
Jetson Orin Nano は既定では、ZRAMと呼ばれる領域に3.2Gほどのスワップ領域が作成されています。16GBのスワップ領域をNVMe SSD上に作成しておきます。また、ZRAMは無効化しておきます。
参考)
スワップ領域の確認と拡張 - hiramine.com
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita

使用した Jetson Orin Nano は、以下についても実施済みです。

Webカメラの接続
JetsonにWebカメラを接続しておきます。
Sambaのインストール と設定
別のマシンから、ファイル操作をできるようにしておくと、何かと便利なので、Sambaをインストールしておきます。
「/home/(ログインユーザー名)」のディレクトリをSamba共有しておきます。
参考)
Sambaのインストールと設定と接続

AIアプリケーション開発用のDockerイメージ

NVIDIA社から提供されているDockerイメージの中から、Jetsonに最適化されたAIアプリケーション開発用のDockerイメージ「L4T JetPack」を利用することとします。
(補足:
 機械学習開発用のDockerイメージ「L4T ML」の利用も選択肢となりますが、「L4T ML」はインストール済みのライブラリが多く、新たなライブラリのインストールの際に、ライブラリの互換性の問題が生じる可能性が高くなります。インストール済みのライブラリの少ない「L4T JetPack」を利用することとしました。)

提供元ページは以下です。
NVIDIA L4T JetPack | NVIDIA NGC

※L4T : Linux for Tegra の略です。Jetson Linuxのことです。Jetson Linuxは、以前は、Linux for Tegraという名称でした。Tegraとは、NVIDIA社のSoCシリーズの名前です。Jetsonシリーズは、NVIDIAのTegraを搭載しています。
※JetPack : Jetson モジュール上でハードウェア アクセラレーションを活用したエッジ AI 開発を行うための包括的なソリューションの名称です。
※ML : Machine Learningの略です。機械学習のことです。

コンテナ起動コマンド

機械学習用のDockerイメージ「L4T JetPack」の起動コマンドは、提供元ページに記載があり、以下です。


コマンドオプション解説

-it
インタラクティブモードで実行します
--rm
コンテナを終了したらコンテナを削除します。(コンテナを終了してもコンテナを削除したくない場合は、このオプションは外します)
--runtime nvidia
l4t-base コンテナの実行中に NVIDIA コンテナランタイムを使用します。
--network host
コンテナが Jetson ホストのネットワークとポートを使用できるようにします。

イメージのタグの確認

コンテナ起動コマンドの「<tag>」については、実行する Jetson Orin Nano の環境に合わせたタグを指定する必要があります。

まず、「OSバージョンの確認」等を参考に、Jetson Linux とJetPackのバージョンを確認します。
使用している Jetson Orin Nano の、Jetson Linux のバージョンは、 36.4.4 で、JetPackのバージョンは、 6.2.1 でした。

続いて、環境に合わせたタグを、提供元ページ「NVIDIA L4T JetPack | NVIDIA NGC」から確認します。
2025年8月13日現在、Jetson Linux のバージョン 36.4.4 のタグは存在しないため、Jetson Linux のバージョン 36.4.0 のタグ「r36.4.0」を使用します。

コンテナにマウントするホスト側のディレクトリの作成

作業用ディレクトリを作成します。作成したディレクトリは、コンテナにマウントします。

以下のコマンドを実行し、ディレクトリを作成します。今回はユーザーのホームディレクトリ下に「work-l4t-jetpack-openpose」というフォルダを作成することとしました。
(機械学習用のDockerイメージ「L4T JetPack」(l4t-jetpack)を利用した「OpenPose」(openpose)の動作環境が構築されたコンテナの作業用(work)のディレクトリ)


ホストのディレクトリをコンテナにマウントしてコンテナを起動するコマンドの書式は以下です。

コンテナ起動スクリプトファイルの作成

コンテナ起動コマンドは文字数が多いので、実行する際にタイピングするのが少し面倒です。短い文字数のタイピングで実行できるようにスクリプトファイル化します。

今回は「docker-run-openpose.sh」というスクリプトファイルを作成することとしました。

「docker-run-openpose.sh」というスクリプトファイルを作成し、内容を以下のようにします。


コマンドオプション解説

-it
インタラクティブモードで実行します
--runtime nvidia
l4t-base コンテナの実行中に NVIDIA コンテナランタイムを使用します。
--network host
コンテナが Jetson ホストのネットワークとポートを使用できるようにします。
--device /dev/video0
コンテナが、Jetson ホストのWebカメラを使用できるようにします。
--volume ${HOME}/work-l4t-jetpack-openpose:/work
ホストの「${HOME}/work-l4t-jetpack-openpose」ディレクトリをコンテナの「/work」ディレクトリとしてマウントします。
--name l4t-jetpack-openpose-dev
起動したコンテナに「l4t-jetpack-openpose-dev」という名前を付けておきます。後ほどDockerイメージ化するときに付けた名前を使用します。
起動したコンテナ上で、OpenPoseの動作環境を構築し、Dockerイメージ化し再利用します。そのために「--rm」オプションは付けません。
nvcr.io/nvidia/l4t-jetpack:r36.4.0
起動するコンテナの元となるイメージとして、「nvcr.io/nvidia/l4t-jetpack:r36.4.0」を指定します。タグは実行する Jetson Orin Nano の環境に合わせたタグにします。

以下のコマンドを実行し、スクリプトファイルに実行権限を付与します。

コンテナの起動

以下のコマンドを実行し、「L4T JetPack」コンテナを起動します。


初回のコンテナ起動は、コンテナイメージのダウンロードと解凍が行われるため、時間を要します。

コンテナが起動すると、Terminalでの表示が「root@ホスト名:/#」に変わり、コンテナ上での作業になります。

以降の作業は、指定がない場合は、コンテナ上での作業です。

テキストエディタ Nano のインストール

以下のコマンドを実行し、テキストエディタ Nano をインストールしておきます。

Flask のインストール

OpenPose を動かす前に、OpenPose の動作結果を確認するための環境を構築します。

Jetson は、デスクトップ環境を無効化しています。画像処理の結果を、別のマシンのブラウザから確認できるようにします。
PythonのWebアプリケーションフレームワーク「Flask」をインストールします。

以下のコマンドを実行し、Pipをインストールします。


以下のコマンドを実行し、Flask をインストールします。

Webカメラからの画像の取得の動作確認

以下のコマンドを実行し、作業用ディレクトリに移動します。


「hello-webcam.py」ファイルを作成し、ファイルの内容を以下のようにします。


以下のコマンドを実行し、Flaskウェブサーバーを起動します。


同一ネットワーク上のPCのブラウザアプリ(ChromeやEdge)から、
http://[Jetson Orin Nano のIPアドレス]:5000
もしくは
http://[Jetson Orin Nano のホスト名]:5000
にアクセスします。

Webカメラの映像が表示されます。


「ctrl + c」を押下し、Flaskウェブサーバーを終了します。

OpenPose のクローン

以下のコマンドを実行し、git をインストールします。


以下のコマンドを実行し、OpenPoseをクローンします。

make準備

以下のコマンドを実行し、cmakeをインストールします。


以下のコマンドを実行し、OpenPoseのmakeのための依存ライブラリをインストールします。

OpenPoseのビルド設定

以下のコマンドを実行し、buildディレクトリを作成し、作成したディレクトリに移動します。


以下のコマンドを実行し、OpenPoseのビルド設定をします。


コマンドオプション解説

-DUSE_CUDNN
cuDNNライブラリのサポートありでビルドします。
-DCUDA_ARCH=Manual
GPUアーキテクチャをマニュアル指定します。
-DCUDA_ARCH_BIN=87
GPUアーキテクチャとして、Jetson Orin Nano のGPUアーキテクチャーを指定します。
-DBUILD_PYTHON=ON
Pythonモジュールを生成します。

モデルのダウンロード等があり時間を要します。(時間は、ネットワーク環境等に依存します)

OpenCV 4系 対応のためのソースコードの修正

2025年10月06日現在、OpenPoseのソースコードは、OpenCV 3系 と互換性があり、OpenCV 4系とは互換性に一部問題があります。

参考)OpenCV のバージョン確認。
以下のコマンドを実行し、OpenCV のバージョンを確認します。

「4.8.0」と出力されました。OpenCV 4.8.0 がインストールされています。

以下のコマンドを実行し、OpenCV 4系対応のためのソースコードの修正をします。


コマンド解説

cp ファイルパスA ファイルパスB
修正対象ファイルをバックアップします。
sed -i 's/文字列A/文字列B/g' ファイルパス
「ファイルパス」のファイル中の「文字列A」を「文字列B」で置換します。

OpenPose のビルド

以下のコマンドを実行し、OpenPose をビルドします。


コマンドオプション解説

-j$(nproc)
コンパイルを並列実行するプロセス数を指定します。$(nproc)で、現在のマシンの CPU コア数を指定します。

コンパイル、ビルド等があり時間を要します。

以下のコマンドを実行し、ビルド結果の配置をします。


以下のコマンドを実行し、ビルド結果のパス設定をします。


次回以降のコンテナ起動時にも適用されるように、「/root/.bashrc」ファイルの末尾に、以下を追記します。(ファイル名の先頭には、「ドット」がひとつあります)

OpenPose の動作確認

以下のコマンドを実行し、作業用ディレクトリに移動します。


「hello-openpose.py」ファイルを作成し、ファイルの内容を以下のようにします。


以下のコマンドを実行し、Flaskウェブサーバーを起動します。


同一ネットワーク上のPCのブラウザアプリ(ChromeやEdge)から、
http://[Jetson Orin Nano のIPアドレス]:5000
もしくは
http://[Jetson Orin Nano のホスト名]:5000
にアクセスします。

Webカメラの映像と、姿勢を推定した結果が表示されます。


「ctrl + c」を押下し、Flaskウェブサーバーを終了します。

コンテナの終了

以下のコマンドを実行し、コンテナを終了します。


コンテナが終了すると、Terminalでの表示が「ユーザー名@ホスト名:/~$」に変わり、ホスト上での作業に戻ります。

以降の作業は、指定がない場合は、ホスト上での作業です。

コンテナのイメージ化

以下のコマンドを実行し、コンテナをイメージ化します。

l4t-jetpack-openpose-dev : イメージ化するコンテナの名前
l4t-jetpack-openpose:v1 : 作成するイメージの名前「l4t-jetpack-openpose」、タグ「v1」。

不要となったコンテナの削除

以下のコマンドを実行し、不要となったコンテナを削除します。

l4t-jetpack-openpose-dev : 削除するコンテナの名前

作成したイメージを用いてコンテナの起動

コンテナ起動スクリプトファイル「docker-run-openpose.sh」を以下の内容に修正します。

コンテナを終了したらコンテナを削除するように「--rm」オプションを追記します。
コンテナに名前を付ける「--name」オプションは削除します。
起動するコンテナの元となるイメージを、「l4t-jetpack-openpose:v1」に変更します。

以下のコマンドを実行します。


構築した OpenPose の動作環境のコンテナが起動します。

コンテナでの作業を終了するには「exit」コマンドを実行します。

関連ページ

MediaPipe

MediaPipeの動作環境の構築
MediaPipeによる人の骨格の推定
MediaPipeによる手の形の推定
MediaPipeによる顔の形の推定

OpenPose

OpenPoseの動作環境の構築 - 【本ページ】
OpenPoseによる人の骨格の推定
OpenPoseによる手の形の推定
OpenPoseによる顔の形の推定