バッチ画像処理向け Python GUI フレームワークのメモ

OpenCV とかでバッチで画像処理とか, 画像処理のデータ解析(画像差分とか)したいが UI がほしい.
pytorch で GPU 画像処理(画像の 2D convolutionとか)や機械学習とか, 3D もやりたい...

native = 実行マシン
remote = リモートのサーバ

で, つよつよサーバで動かす場合のも考えます.

## 比較

| framwwork | Web based | Remote Linux | Remote Win/macOS | Comment |
|:-:|:-:|:-:|:-:|:-:|
| tk(ttkbootstrap)  | x | o  | -  | テーブル関係の UI が弱い. UI レイアウトがめんどい  |
| dearpygui  | x | -  | -  | UI 描画が OpenGL 使っているが, 3D 描画機能は無い. 描画が GL なので描画負荷が高い |
| PyQt | x | ? | ? | 未検証. OSS で使うには LGPL ライセンス |
| JupyterLab | o | o | o | 使える UI が ipywidgets などに限られる. UI 要素が増えると画面専有して使いづらい |
| StreamIt | o | o | o | 画像アノテーション系 widget があまりない |
| Gradio | o | o | o | Stable Diffusion で有名になった? 3D 表示簡単にできる  |
| Panel | o | o | o | 検索性が悪い... 玄人向け. FileSelector があるのがよい |
 

Remote Linux は X11 転送です. したがって OpenGL とかで GPU accelerated な 3D は基本使えないです

また, Jupyter 上で tk(ttkbootstrap)はうまく動きません(スレッド関係とかっぽい)

とりあえずは筆者のような要求の場合は,

web-based で Panel -> Gradio/StreamIt -> JupyteLab,
native で動くのでよければ dearpygui -> ttkbootstrap でしょうか..

## Tk(ttkbootstrap)

tkinter で画像処理系の GUI を作るメモ
https://qiita.com/syoyo/items/4899913556cb0d414103

レイアウト処理がめんどい, ライブリロード出来ない.
OpenCV 使うくらいであれあば pyinstaller で .exe でそこそこコンパクトに配布にできるのがよい.
(pytorch とか入れると 3GB くらいになる!)

ただテーブル関連の UI が貧弱です(標準ではセル編集とかできない)

サーバで動かすほどではなく, 極めて限られた UI で native で動くでよいのであれば一考かもはしれません.

autoreload はできませんが, jurigged と組み合わせではいけかも.

https://github.com/breuleux/jurigged

## dearpygui

DearPyGui で UI を作るメモ
https://qiita.com/syoyo/items/93a17db6a092da8f1fee

C++ で ImGui で GUI 書いているひとには向いているかも.
ただ 3D の表示はできません.

## JupyterLab

みんな大好き JupyterLab

でも ipywidgets で UI 増えると画面とってしまってつらい(+ あんまりうまく配置できない)です.

また, サーバ側のファイルブラウザはないっぽい.
(JupyterLab のメニューで頑張る手もあるが, 使いやすくは無いネ...)

## StreamIt

Livereload できます.

リモート側でのファイルブラウズ(ファイル選択)機能が標準ではありません.

https://github.com/streamlit/streamlit/issues/120#issuecomment-1248532008

でとりあえず対応でしょうか.

ディレクトリごとファイルアップロードなどがない.

ので大規模画像データをアップロードして処理みたいなことをしたい場合はなにか手を考えないといけません.

https://github.com/aidanjungo/StreamlitDirectoryPicker

あたりが使えるかも...?

multi-page 機能はええね.

## Gradio

Stable diffusion で有名になった?

ディレクトリ指定でのファイルアップロードできます.

https://gradio.app/docs/#file

リモート側でのファイルブラウズ機能はありません.

BabylonJS? あたりで WebGL で wavefront obj と glTF をぺろっと表示できるのはよい

https://gradio.app/how_to_use_3D_model_component/

最近 `gradio app.py` で起動である程度 live reload できるようになりました.

https://gradio.app/developing_faster_with_reload_mode/

以下の discussion はちょっと古いです.

https://github.com/gradio-app/gradio/discussions/643

一応素の .py で起動させて jurigged と組み合わせである程度 live reload も可能です.(UI コンポーネントの追加とか削除は反映されない)

## Panel


https://panel.holoviz.org

はげしく検索性がわるくてつらい...
意外と機能あります.

https://panel.holoviz.org/reference/index.html

ただ, 使い方がよくわかりません.

https://panel.holoviz.org/getting_started/index.html#editor-server

とあるのに, サンプルは Jupyter 前提で作られているため, 素の `.py` の例がなくてどうしたらよいかわからない.

### .py でコマンドライン動かす

https://panel.holoviz.org/reference/templates/Bootstrap.html

のように, 表示したい widgets に `.servable()` をつける必要があります.

`.servable()` していないと, エラー出さずに画面が真っ白になりとまどいます...
エラーがあっても画面が真っ白になります(一応ログにはエラーメッセージがでるが...)
また `.servable()` 抜いた場合は `--autoreload` での .py ファイルの自動リロードがされません.

玄人向けでちょっと開発しずらいですね. 

とりあえずぺろっと開発したいときは, Streamlit or Gradio 使ったほうがよいでしょう.


https://panel.holoviz.org/FAQ.html

Panel 自体はサーバではなくて widgets 集みたいな感じっぽい.
`panel serve` だと Bokeh(これも viz UI だが web サーバも兼ねている?)をバックエンドに使っています.
(`panel copy-examples` で落とせるサンプルコードには fastApi web サーバ(?)で動かす例もあるが...)

.py で Standalone で開発しておき, リリースでは Jupyter で動かす, みたいな使い方がいいのかもしれません(まあこれは Streamlit でもある程度できるが...)

FileSelector があってよいですが
https://panel.holoviz.org/reference/widgets/FileSelector.html

アップロード機能は貧弱です(ディレクトリ指定で一括アップロード対応してなさそう).

https://panel.holoviz.org/reference/widgets/FileInput.html

VTK https://panel.holoviz.org/reference/panes/VTK.html で WebGL で 3D 表示できて, 3D とか画像処理メインだと Panel いいかもしれません.

テーブルの UI も結構揃っている感じです.

使いこなせればいい感じになるかもはしれません.

### 3D(OpenGL, WebGL)

Web-bsaed なフレームワークだと, native では WebGL は使えるでしょう.


リモートの場合, OpenGL をオフスクリーンレンダリングで頑張る手があります.

https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/appendix/colab_gl.ipynb

ただ, この場合 nvidia や amd などで GPU offscreen rendering ができるようになっている必要があります.
(Mesa + LLVMpipe で pure CPU 実行もできるのかな?)

## 通信帯域がある上級者むけ

VNC/RDP あたりで画面まるっと転送してしまうのも手かも!

NVIDIA GPU の X11 headless setup + X11VNC/RDP 接続のメモ
https://qiita.com/syoyo/items/a14fa891b80bb82a4485

1 Gbps では辛いですが, 10 Gbps ですとそこそこ快適にできます. 

## その他

PySimpleGUI: 未検証 https://github.com/PySimpleGUI/PySimpleGUI デフォルトでは tk みたいに古臭い見た目です. 

## 参考情報

* https://towardsdatascience.com/gradio-vs-streamlit-vs-dash-vs-flask-d3defb1209a2