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 と組み合わせではいけかも.
dearpygui
DearPyGui で UI を作るメモ
https://qiita.com/syoyo/items/93a17db6a092da8f1fee
C++ で ImGui で GUI 書いているひとには向いているかも.
ただ 3D の表示はできません.
JupyterLab
みんな大好き JupyterLab
でも ipywidgets で UI 増えると画面とってしまってつらい(+ あんまりうまく配置できない)です.
また, サーバ側のファイルブラウザはないっぽい.
(JupyterLab のメニューで頑張る手もあるが, 使いやすくは無いネ...)
StreamIt
Livereload できます.
リモート側でのファイルブラウズ(ファイル選択)機能が標準ではありません.
でとりあえず対応でしょうか.
ディレクトリごとファイルアップロードなどがない.
ので大規模画像データをアップロードして処理みたいなことをしたい場合はなにか手を考えないといけません.
あたりが使えるかも...?
multi-page 機能はええね.
Gradio
Stable diffusion で有名になった?
ディレクトリ指定でのファイルアップロードできます.
リモート側でのファイルブラウズ機能はありません.
BabylonJS? あたりで WebGL で wavefront obj と glTF をぺろっと表示できるのはよい
最近 gradio app.py
で起動である程度 live reload できるようになりました.
以下の discussion はちょっと古いです.
一応素の .py で起動させて jurigged と組み合わせである程度 live reload も可能です.(UI コンポーネントの追加とか削除は反映されない)
Panel
はげしく検索性がわるくてつらい...
意外と機能あります.
ただ, 使い方がよくわかりません.
とあるのに, サンプルは Jupyter 前提で作られているため, 素の .py
の例がなくてどうしたらよいかわからない.
.py でコマンドライン動かす
のように, 表示したい widgets に .servable()
をつける必要があります.
.servable()
していないと, エラー出さずに画面が真っ白になりとまどいます...
エラーがあっても画面が真っ白になります(一応ログにはエラーメッセージがでるが...)
また .servable()
抜いた場合は --autoreload
での .py ファイルの自動リロードがされません.
玄人向けでちょっと開発しずらいですね.
とりあえずぺろっと開発したいときは, Streamlit or Gradio 使ったほうがよいでしょう.
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
アップロード機能は貧弱です(ディレクトリ指定で一括アップロード対応してなさそう).
VTK https://panel.holoviz.org/reference/panes/VTK.html で WebGL で 3D 表示できて, 3D とか画像処理メインだと Panel いいかもしれません.
テーブルの UI も結構揃っている感じです.
使いこなせればいい感じになるかもはしれません.
3D(OpenGL, WebGL)
Web-bsaed なフレームワークだと, native では WebGL は使えるでしょう.
リモートの場合, OpenGL をオフスクリーンレンダリングで頑張る手があります.
ただ, この場合 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 みたいに古臭い見た目です.