えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

Image-Processing-Node-EditorにDockerfileを追加しました

かずひとさんが画像処理を行う面白いプログラム「Image-Processing-Node-Editor」を公開されたようです。

Image-Processing-Node-Editorはdearpyguiをベースとしたエディタで、フィルタや物体検出などの各画像処理を入出力が可視化されたブロックとして扱うことができます。

画像処理ノードを線で繋いでいくのでもちろんコードを書く必要はありません。

作者は「処理の検証や比較検討での用途を想定」と説明していますが、カーネルエディタも作れば、画像処理の勉強になるのではないかと考えています。


このプログラムはGitHubで公開されており、すでに70以上のスターがついています。これからの開発に期待です。

github.com


私は、このプログラムにDockerfileとPyPI化のためのファイル追加を行いました。

ここでは、Dockerfileの使い方と簡単な説明を行います。


Docker・Dockerfileとは

DockerとはLinuxのコンテナ技術を活用した仮想環境構築ツールです。DockerfileとはDocker上で動く仮想コンテナを構築するための定義ファイルです。

VirtualBoxなどの仮想マシンと異なり、DockerはOSとコンピュータリソースが共通化されているため、素早い環境構築や起動・終了、リソースの流用が簡単に行えます。

他の仮想環境と同様にLinuxのバージョンや環境の影響を受けない・与えないので、アプリケーションを起動するためのコマンドがDockerを内部で呼び出して実行することもあります。


私のノートPCはUbuntu22ですが、残念ながらonnxruntimeなどのいくつかのパッケージがまだ対応していません。そこで、Dockerfileを作成して、Ubuntu20を仮想的に再現することで動かすことにしました。


実行方法

とても簡単です。

事前準備

  • 事前に管理者権限で動くDocker(NVIDIAの場合は、nvidia-docker2が必須です)
  • X11-forwardingの /etc/ssh/sshd_config が "XForwarding yes"になっているかの確認
    • Windowsの場合は、別のアプリケーションを使用するため、設定が異なります。
  • USB接続が可能なWebカメラ
    • /dev/video0 に接続されているものとします

以下は、Ubuntu環境におけるコマンド

# ビルド
git clone https://github.com/Kazuhito00/Image-Processing-Node-Editor.git
cd Image-Processing-Node-Editor/
docker build docker/nvidia-gpu -t ipn_editor

# 実行
xhost +
docker run --rm -it --privileged --device /dev/video0:/dev/video0:mwr -e DISPLAY=$DISPLAY -v $(pwd):/workspace --gpus all -v /tmp/.X11-unix:/tmp/.X11-unix ipn_editor


Dockerfile

DockerfileはGitHub(Image-Processing-Node-Editor)にあります。

nvidiaとありますが、NVIDIA-GPUがなくても動作します。

GitHubにあるDockerfileを以下に示します。

FROM python:3.8.13

# Add timezone ----------------------------------------------------
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV DEBIAN_FRONTEND=noninteractive

# NVIDIA -------------------------------------------------------------
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

# xserver ------------------------------------------------------------
RUN apt update && apt -y upgrade && \
apt install -y xserver-xorg && \
apt -y clean && \
rm -rf /var/lib/apt/lists/*

# PyPI environment ---------------------------------------------------
RUN pip install --upgrade pip

# For error avoidance
RUN pip install --upgrade cython numpy

RUN pip install \
opencv-python==4.5.5.64 \
onnxruntime-gpu==1.11.1 \
dearpygui==1.6.2 \
mediapipe==0.8.10 \
protobuf==3.20.0 \
filterpy==1.4.5 \
lap==0.4.0 \
cython-bbox==0.1.3 \
rich==12.4.4

WORKDIR /workspace
CMD ["python3", "main.py"]

流れとしては、Python3.8 (Ubuntu20)上に次の流れで環境を構築していきます。

  • タイムゾーンの設定(xserverでの処理待ち防止)
  • NVIDIA-GPUの場合のGUI環境設定
    • NVIDIA-GPUでなくても取り除く必要はないです
  • xserver (GUIX11-Forwardingするのに必須)
  • Python-pipの環境構築
    • Cythonとnumpyのみ、先行でインストールする必要があります。
  • CMDの設定により、Docker実行直後のアプリ起動設定(アプリの終了後にシャットダウン)


xserverまでの流れはほとんど共通化できそうです。


実行

実行の際は、結構長いコマンドになります。それぞれ解説します。


コマンド:docker run --rm -it --privileged --device /dev/video0:/dev/video0:mwr -e DISPLAY=$DISPLAY -v $(pwd):/workspace --gpus all -v /tmp/.X11-unix:/tmp/.X11-unix ipn_editor


Dockerはdocker run [オプション] 実行コンテナ名 [初期実行ファイル]で実行されます

オプション

  • --rm:終了後にコンテナを削除して実行前に戻す。
  • -it:標準入力のための最小限の設定(iとtはそれぞれ意味がある)
  • --privileged: すべてのデバイスへのアクセス権限を付与
    • 後述する--deviceをすべてカバーしているので、どちらかはいらない。(セキュリティ的にはよくない)
  • --device /dev/video0:/dev/video0:mwr:--privilegedがない場合に/dev/video0を入力デバイスとして設定
  • -e DISPLAY=$DISPLAY:x11-forwarding設定・xサーバの指定
  • -v $(pwd):/workspace:ファイルのマウント先。この場合は、現在のディレクトリをDockerコンテナ内の/workspaceにマウント
  • --gpus all: NVIDIA固有の設定。GPUをすべて認識させる。
  • -v /tmp/.X11-unix:/tmp/.X11-unixx11-forwarding設定


初期実行ファイル

なにも指定されていない場合は、Dockerfileで定義されたpython3 main.py/workspaceで実行されます。

開発する時は、アプリが勝手に起動すると困る場合があります。この場合は、別のアプリで上書きすることができます。

/bin/bashを指定することで、ターミナルが入力ができるようになります。


PyPI編はまた次で。