Loading [MathJax]/extensions/Safe.js
MENU

Tensorflowの学習済みモデルをNCSのGraphバイナリーへ変換-MNISTの場合


Movidius NCS用graphバイナリ作成の手引き」の TensorFlowネットワークのコンパイルのための手引き の項を実際にやってみた例です。

この項ではMNISTを例に学習モデルを作成し、これを使ってGraphバイナリーの作り方を説明しています。

MNISTについて、それって何の場合はここもご参照ください

いきなりフレームワークからではなく、スクラッチから実装する場合です、これならCPUのみでも実行できます、でもCPUのみを使うのであればJetsonよりPCの方がいいでしょう。

クラシックですが、基礎を学べます。でも、より「今時」なものをやりたい向きには合いませんですね、ハイ。

 

やってみます。


学習モデルの作成

学習環境にNVIDIA GPUを使いたいところですが、WisteriaHillではそんなGPUを積んだPCなど持っていないので、NVIDIA Jetson Nanoを使ってみます。

秋月電子などでいろいろ揃えて15300円くらいで手に入ります(^^)。

 

ある程度の作業領域が必要なので、JetPack(英語) + Tensorflowのみのシンプルな構成にしておきます。

mnist_deep.pyのソースが公開されているのでこれを使いますが、このままでは結果を出力できません。

mnist_deep.pyのソースをそのまま実行すると以下のようなエラーになります。

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[10000,28,28,32]

Jetson NanoのGPUメモリーが不足するようです。

ソースの以下の部分にコードを追加し、Tensorflow側で必要な分GPUのメモリを確保します。

参照:TesnsorFlowガイド-> Using GPUs のAllowing GPU memory growth

 

with tf.Session() as sess:

config = tf.ConfigProto()
#config.gpu_options.allow_growth = True <--有効ではなかったです
config.gpu_options.per_process_gpu_memory_fraction = 0.4
with tf.Session(config=config) as sess:

ソースは以下のサンプルを参照

で、実行します。

$python3 mnist_deep.py

学習モデルが作成されます。


学習済みのモデルを使って、自分の手書き数字を認識してみます。

mnist_deep.pyを少々書き換えてmnist_deep_predict.pyを作成します。

修正は3点

1:import追加

 

 

2:引数追加

 

3:saver = tf.train.Saver()以下を削除して、下のコードと入れ替え

 

手書き数字の画像を例えば7.pngとすると

$python3 mnist_deep_predict.py –imagefile 7.png

 

たまに当たることもあります(^^)。

 

ソースは以下のサンプルを参照

 

 


手引きにあるように推論用にmnist_deep.pyを書き換えて、新しいソース(mnist_deep_inference.py)を作ります。

最初に作られたファイルを利用するので、新ソースは同じディレクトリーに置いておきます。

ソースは以下のサンプルを参照

で、実行します

$python3 mnist_deep_inference.py

 


Graphバイナリーの作成

NCSDKは現状Jetsonにインストールできません。まぁ、JetsonでMovidius NCSを使う意味もないですし。

バイナリーの作成はラズパイ3で行います。

Jetsonで作成された3つのファイルをコピーしておきます。

で、実行。

$mvNCCompile mnist_inference.meta -s 12 -in input -on output -o mnist_inference.graph

 


サンプル


Next

inference.graphを使って手書き数字の認識

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*