PythonをC#/C++どちらから呼び出すのが良いか?
背景
- Deep Learningで Pythonを利用しながら、GUIはWindows Visual Studioで簡単にデザインしたい。
- 使い方としては特に画像の扱い。画像セットとアノテーション情報をGUIで分析確認する等の使い方も想定したい。
- ゆくゆくはDeep LearningのDeploy寄りのツールとして。
- Pythonコードの推論部だけをC++等で記述して、Deployを効果的に行えるようなSoftware構成を検討したい。
- Deep Learningやコーディングを勉強中であり、調査しながら良い形を模索したい。
検討1:Python環境の呼び出しやすさの観点では?
No | GUI構築 | Python呼び出し方法 | Note |
---|---|---|---|
1 | C# | 追加ライブラリ無しでOKの模様 | Microsoftの例としてAnaconda環境。その他のPython環境も使えるらしい。 |
2 | C++ | Boost.Pythonが必要? | No1とやれることは似通っているようにみえる。PythonからC++(逆方向)もできる。 |
3 | C#(.net) | pythonnet | Python3.5までの対応の模様。 |
4 | C# | IronPython | IronPythonは動かないという情報が多い。 |
5 | 任意 | PythonをWebAPI化(Flask?) | 引数→出力 以上の連携が楽になる。サーバーを別立てした構成が立てやすくなるはず。 |
-
No1 現状の結論としてはこれをやってみたい。
- Inter-process communication between C# and Python
- 非常に単純明快に書かれており、すぐにでも出来そうに感じられる。
- Python側の動作がおよそどんなものになるのか、試してみたいところ。
- matplotlibのグラフは問題なく出すことが出来るか?(別ウィンドウ、疎結合で可)
- C#はGUIに閉じて、MVVM的な考え方で行きたいので、そもそも、そんなに確認事項が無い気がする。
-
No2
- Boost.PythonでC++からPythonの関数を呼び出す
- No1同様に難しくは無さそう。
- Boost.Pythonが使いやすいものなのか?
- PythonからC++を呼び出してnumpyを使う
- 逆の呼び出しパターンの記事
- やはり、
Boost.Python
を使うみたい。
- Boost.PythonでC++からPythonの関数を呼び出す
-
No3
- Pythonから.NETを呼び出す方法とついでにその逆も
- Python3.5までの動作らしいとの情報。
- Pythonから.NETを呼び出す方法とついでにその逆も
- No5
- Using C# to call Python RESTful API Web Services with Machine Learning Models
- Flaskを使って、PythonをWebAPI化すればよい様だ。
- 直接関係ないような気もするものの、
Tensorflow Serving
とかonnx runtime
とかも出てきている。 - 必要になったら考えよう。
- Using C# to call Python RESTful API Web Services with Machine Learning Models
検討2:GUIの観点では?
-
前提
- 前提として C# or C++?で考えている。
- Pythonでは
Kivy
を多少触ってみた。少し触った感じではあるが、Windowsであれば、Visual Studioのデザイナーには敵わない気がする。 - C#はほとんどやったことないが、C++が書けるというほど使ってきたわけでもない。
-
予定
- C#のGUIに対する期待感 > C++ GUIの期待感。
- C++はC++/CLIを扱わなければいけないので厄介という記事があったり。
結論
- No1のフレームワークで進めてみたい。
- C#の勉強に。
- Deep Learning 検討用の、自前画像ビューアに。
- (蛇足)OpenCVも使いたい。
- C#だとOpenCVSharpなるラッパーを使うのが普通?ということに初めて気が付く。
- OpenCVSharpって何だろう、という漠然とした不安。(知らないだけ)
- こんな実装もありかな? と勝手に想像して、C#選択のブロック要因とまでは考えないようにする。
- GUI側で簡単に何かしたいとき、OpenCVSharpを使えば良い。
- 本格的に処理をしたいとき、Python側でOpenCVを使い、結果をGUI側でビューすることでの連携はできそう。
- OpenCVSharpがデファクトだったりするのかもしれない。