かずひとさんが画像処理を行う面白いプログラム「Image-Processing-Node-Editor」を公開されたようです。
英語ReadMEとかバグFixとかアレやコレや置いておいて、いったん初版公開👻
— 高橋 かずひと@DearPyGui駆け出しエンジニア (@KzhtTkhs) 2022年6月5日
最初はG-APIとか他仕様とか色々考えてましたが、
結局は、高橋さんの高橋さんによる高橋さんのためのオレオレツールとなりました👀https://t.co/jrkEtwR568 https://t.co/NTSTGbIT5h
Image-Processing-Node-Editorはdearpyguiをベースとしたエディタで、フィルタや物体検出などの各画像処理を入出力が可視化されたブロックとして扱うことができます。
画像処理ノードを線で繋いでいくのでもちろんコードを書く必要はありません。
作者は「処理の検証や比較検討での用途を想定」と説明していますが、カーネルエディタも作れば、画像処理の勉強になるのではないかと考えています。
このプログラムはGitHubで公開されており、すでに70以上のスターがついています。これからの開発に期待です。
私は、このプログラムに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)にあります。
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環境設定
- xserver (GUIをX11-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-unix:x11-forwarding設定
初期実行ファイル
なにも指定されていない場合は、Dockerfileで定義されたpython3 main.py
が/workspace
で実行されます。
開発する時は、アプリが勝手に起動すると困る場合があります。この場合は、別のアプリで上書きすることができます。
/bin/bash
を指定することで、ターミナルが入力ができるようになります。
PyPI編はまた次で。