TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Python

PythonからC#へポインタ渡しする

C#からPythonへポインタ渡しするとは逆に、Python for .NETを使ってPythonからC#へポインタ渡しする方法について紹介する。 Python for .NET Python for .NETを使用すると、PythonからC#のコードを呼び出すことができる。 Pythonと同じプロセスで、.NETのラ…

C#からPythonへポインタ渡しする

以前に、Python for .NETを使用することで、C#とPythonを同一プロセスで動かせることを紹介した。C#からPythonへの呼び出し時に、引数と戻り値は、自動的にマーシャリングが行われる。 ここで、C#の型からPythonのネイティブな型に変換されるのは、スカラ型…

C#からPythonを呼び出す

以前にC#からPythonのディープラーニングフレームワークを呼び出すいくつかの方法を記事にした。 gRPCでC#とPythonを連携する - TadaoYamaokaの開発日記 SocketでC#とPythonを連携する - TadaoYamaokaの開発日記 TensorFlowのC#バインディング - TadaoYamaok…

高速なPythonのリバーシ(オセロ)ライブラリ

将棋で強化学習のアルゴリズムをいろいろ試そうとしたが、DQNが全く学習しないので、もう少し簡単なゲームを先に試そうと思う。 ということで、リバーシ(オセロ)で試すことにした。Pythonで使えるリバーシのライブラリがないか探したが良さそうなのが見つか…

matplotlibでグラフをインタラクティブに変更して見やすくする

matplotlibで複数系列の時系列グラフなどを表示した場合、グラフの線が太く重なっている箇所の詳細が把握しにくい。 特にJupyter Notebookでブラウザで表示している場合は、コードで見栄えを調整する必要がある。Jupyter QtConsoleで、「%matplotlib qt」とI…

Google ColabでUSIエンジン同士の対局を行う

Pythonの高速な将棋ライブラリcshogiにUSIエンジン同士の対局機能を追加した。先日、cshogiにJupyter Notebook上で盤面をSVGで表示できるようにしたが、その機能を使って対局中の盤面を表示するようにしている。 これによって、Google Colab上で、USIエンジ…

Prioritized Experience Replayのsum-treeの実装

つくりながら学ぶ!深層強化学習のPrioritized Experience Replayの実装は、説明をシンプルにするためReplay Memoryを線形で探索する実装が紹介されていた。 つまり、各transitionのTD誤差を優先度として、0からReplay Memoryの優先度の合計の間で、ランダム…

SocketでC#とPythonを連携する

先日、gRPCでC#とPythonを連携する方法について書いたが、Pythonで受信したProtobufのデータを処理すると実行速度に問題があることがわかった。 速度が必要なケースでは、Protobufの使用はあきらめた方がよさそうだ。今回は、シンプルにSocket通信でデータを…

gRPCでC#とPythonを連携する

C#のプログラムから機械学習などの処理をPythonで実装したい場合がある。 C#とPythonの連携方法について調べたところいくつか方法があったが、gRPCが良さそうだったので試してみた。 調べた方法 Python for .NET C#とPythonを直接連携させるには、「Python f…

Jupyter Qt ConsoleでPandasを見やすくする

個人的な備忘録です。Pythonを対話的に使う際、Jupyter Qt Consoleを主に使っている。 デフォルトだとウィンドウサイズの幅が81文字分しかないため、Pandasでhead()やdescribe()をすると、途中で改行されて見づらい。 Jupyter Qt Consoleのウィンドウの幅を…

ビルド済みChainerからソースビルド版に戻す

Chainer/CupyはWindowsは正式にサポートされていないが、問題なく動作する。 最近のバージョンでは、Windows向けにもビルド済みパッケージも提供されているので、以前は必要だったVisual Studioがなくてもインストールできる。先日、開発環境をVisual Studio…

Python環境をVisual Studio 2017に移行

Python3.5はVisual Studio 2015でビルドされているため、余計なトラブルを避けるためVisual Studio 2015を使い続けてきた。最近、Visual Studio 2015が起動して数分後に30秒くらい固まる現象が起きて、再インストールしたりしたが直らないので、しばらく我慢…

PythonでAlphaZero Shogiを実装する その3

技術書典6の本を執筆しながらAlphaZero Shogiを実装したPythonプログラムの修正も行っている。 プログラムの方はほぼ完成しているが、自己対局を数時間実行すると途中で評価済みのはずのノードが未評価になっているため例外になる問題が発生している。 原因…

高速なPythonの将棋ライブラリを作る

python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。 公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。しかし、機械学習の用途に使用しようと…

Chainer4系がAnaconda3 4.2.0で動かない件

4/17にChainer 4.0.0がリリースされましたが、Anaconda3 4.2.0では以下のエラーがでて動かなくなっていました。 >>> import chainer Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Anaconda3\lib\site-packages\chainer\__init__.py", </module></stdin>…

将棋AIの進捗 その11(マルチGPU対応)

GPUが2つになったので、dlshogiをマルチGPUに対応させました。ニューラルネットワークの計算要求をキューにためてミニバッチで推論を行う仕組みにしていたので、キューをGPUごとに用意して、探索スレッドを一方のキューに対応させて、キューを監視してニュ…

C/C++からPythonをマルチスレッドで使う

C/C++からPythonの処理をマルチスレッドで使うには、C/C++側でもGILの制御が必要になる。マルチスレッドでGILを取得せずにPythonの処理を呼び出すとメモリ例外などで異常終了する。Pythonの仮想マシンはスレッドセーフではなくマルチスレッドでは動かせない…

WindowsにAnaconda3でPython 3.6をインストールする

以前はChainerとTensorflowがPython3.6に対応していなかったため、Anaconda3のPython3.5系を使用していた。 現在は、ChainerもTensorflowもPython3.6に対応しているため、Python3.6に入れ替えを行った。Anaconda | Individual Edition から、Python 3.6 vers…

PythonからC++を呼び出してnumpyを使う

将棋でディープラーニングを試しているが、Pythonで入力データの加工を行うと処理速度が問題になっている。そこで、PythonからC++で作成したモジュールを呼び出して、その中でnumpyのオブジェクトの加工を行いたい。 PythonからC++の呼び出しはオーバーヘッ…

TF-IDFを使ってFAQに回答する

とある理由からBotについて調べています。最近はAIを使ったBotもありますが、古典的な方法として、あらかじめ質問と回答を用意しておき、ユーザが入力した質問と類似度の高い質問を選んで回答する方法があります。TF-IDFがその代表的なアルゴリズムになりま…

3Dモデルから学習データを生成する その2(トゥーンレンダリング)

前回に続きBlenderを使用してMMDの初音ミクの3Dモデルから、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。BlenderでMMDのモデルを読み込むとそのままでは、シェーディングが有効になっており、レンダリングを行うと陰影のある画像となる。 …

Free-Form Deformationでテクスチャを変形する

前回までの日記で、OpenGLでテクスチャ(2D画像)を平面に描画する方法と、ベジエ曲面を描画する方法について記述した。 この2つを組み合わせて、テクスチャの変形を行う。テクスチャの変形には、自由形状変形(FFD: Free-Form Deformation)という手法を使う。 …

Pythonでベジエ曲面を描く

前回の日記でPythonでベジエ曲線を描いたが、今回はベジエ曲面(Bezier patches)を描く。ベジエ曲面は、以下の式で表される。 は、前回の日記で説明したバーンスタイン(Bernstein)多項式である。は、平面上に格子状に配置した制御点で、m, nは、それぞれu軸、…

Pythonでベジエ曲線を描く

Free-Form Deformation(FFD)を使用して2D画像の変形を行おうと試みているが、FFDはベジエ(Bezier)曲面で表される座標系を使用して変形する。 そこで、ベジエ曲線を復習を兼ねてmatplotlibで描画してみる。ベジエ曲線を2次元に拡張するとベジエ曲面となる。 …

WindowsのPythonでOpenGLを使う

写真の線画化を、iBUG 300-Wの300枚の画像に試してみたけど、あまりきれいな線画が生成できなかった。 学習データの生成には他のアプローチを試したい。 Live2Dのような方法で、線画のキャラクタの向きや表情のバリエーションを増やせないかと考えている。 L…

Surfaceのカメラでリアルタイムに顔器官検出を行う

以前日記に書いたdlibを使った顔器官検出をSurfaceのカメラを使ってリアルタイムに行ってみました。 import sys import dlib import cv2 if len(sys.argv) != 2: print("realtime_shape_predictor.py model") exit() model = sys.argv[1] predictor = dlib.s…

SurfaceのカメラをPythonからリアルタイムに使う

SurfaceのカメラをPythonからリアルタイムに使うには、OpenCVを利用して以下のように記述する。 import cv2 video_capture = cv2.VideoCapture(1) while True: ret, frame = video_capture.read() cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == o…

TensorFlowをGPUを有効にしてWindowsでビルドする

※公式からWindowsバイナリが提供されたため、この記事の内容はほとんどの人には不要です。TensorFlowはビルドツールのBazelがWindowsに対応していないため、Windowsではビルドができなかった。Bash on Windowsを導入することで、Ubuntuのパッケージをバイナ…

顔認識用の学習データを準備する際の小技

画像から顔画像のみを切り出して、顔認識用の学習データを準備したい。画像データが大量に必要になるので、data augmentationで実行時に動的に増幅することを考慮する。data augmentationとして、回転、拡大縮小、平行移動をアフィン変換で行う。切り出した…

dlibをWindowsにインストールする(補足)

前の日記で、WindowsのAnacondaでインストールしたPythonにdlibをインストールする方法を記載したが、jpegライブラリが有効になっていないため、サンプルが実行できなかった。解決方法が見つかったので、その方法を記す。Bash on Windowsでは、dlib公式のペ…