絵のない技術書スマートフォン用の表示で見る絵のない技術書この広告は、90日以上更新していないブログに表示しています。0.4259負けたMovidiusで動かすmvNCProfileで推論の時間だけ測定できた。images)1枚当たり134msとのことつまり、画像のロードには4msくらいしかかかってないちなみに、パラメータ数は83MまとめInceptionV3をファインチューニングして、それを別のネットワークに蒸留したものをMovidiusで動かせるようになった。nets.mobilenet_v1.mobilenet_v1()をするときに、得られるstu2_end_pointsにはmobilenetの詳細が入ってる。これの中身を見るといろいろ分かる。ep2['Predictions'].shape)気になるやつらのシェイプを確認して、自分が指定した出力層の数になってたら、そのやつらには読み込ませない。checkpointということは、根本的に保存した時点でこの変数が抜けていたようだ。おおもとのファイルでもtf.global_variables()にして保存した。mbnet_struct/truediv別のエラーになった。divに対応していないのだろうか?前者は事前に255で割って入力することにした。後者は使ってなかった。InceptionV3ImageNetで学習済みのInceptionV3をCaltech101にFine-Tuningする。http://ronny.rest/blog/post_2017_10_13_tf_transfer_learning/やってみる。Layerのマクロみたいなもの。比較的簡単に書けるようになる。V1)方法ここに書いてある。https://movidius.github.io/ncsdk/tf_modelzoo.htmlソースを落としてくる。https://github.com/tensorflow/models.git学習済みのチェックポイントを落としてくる。inception_v3_2016_08_28.tar.gzGraphDefファイルを出力。--output_file=inception_v3.pbグラフのフリーズ。--output_node_name=InceptionV3/Predictions/Reshape_1コンパイル。'checkpoint_management'動かない。https://github.com/tensorflow/tensorflow/issues/22019いつも通りパッチを当てる。tf.train.checkpoint_exists(input_checkpoint)):無事にfrozenなのが出力された。0.02438097447156906------------------------------------------------------------問題なく動作した。http://download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_0.5_160.tgzなんか重みをダウンロードしたらmobilenet_v1_0.5_160_frozen.pbも入ってた。あとはコンパイルするだけ。インプット/アウトプットノードの捜索.pbファイルからノードを探す。https://ncsforum.movidius.com/discussion/683/tensorflow-conversion-toolkit-error-output-node-not-foundコードは添付。ReshapeおそらくこのinputとMobilenetV1/Predictions/Reshape_1であろう。コンパイルここまでは素直に来たのでコンパイル。-on=MobilenetV1/Predictions/Reshape_1やっぱり終わらないエラーとの闘い。eval:いつも通り/usr/local/bin/ncsdk/Controllers/TensorFlowParser.pyが悪さをしている説。input_data})今日も元気にパッチを当ててみる。20161無事に通った?なんか出力が少なすぎる。0.022390704602003098------------------------------------------------------------なんか2%以上ずれてるけど、まぁ正しく動いてるっぽい。動かしてみる実際に画像を入力して動かしてみる。images)無事に動いた。ZooにあるデータならMovodiusで使える。NCSDKはMovidius用にモデルを変換・チェックするためのコンパイラと、モデルを利用して推測を行うためのAPIを含むSDKのこと。v2ではAPIの関数が異なるため互換はない。NCSDKをTensorFlowから使う方法TensorFlowでプログラムを書く。TensorFlowからモデルを開いて編集をして、もう一度保存する。保存したモデルをMovidius用のgraphにコンパイルする。graphをMovidiusに転送して実行する。3で行う場合にはそれぞれ4時間程度かかる。v2)ncsdk-*/examples/tensorflow/inception_v3にInception-V3のExampleがある。ファイル構成Makefileinception-v3.pyrun.pycategories.txtinputsize.txt動作makeでinception-v3.pyとmvNCCompileが呼び出される。inception-v3.pyは学習済みのInception-V3モデルのダウンロード、ckpt.metaファイルの保存を行う。モデルはtensorflow.contrib.slim.netsからダウンロードされる。mvNCCompileはckpt.metaからgraphファイルを作り出す。runでrun.pyが呼び出される。run.pyではgraphファイルをMovius上にロードして一枚の画像の推論を行い、結果を出力する。guitarの出力が得られた。detected!と表示されることがある。表示された場合にはpredictにかかる時間が長くなる。複数回続けて実行すると電力不足のためかシステムが落ちる。自作のTensorFlowモデルをMovidius用にコンパイルするためには、ソースコードの編集を行いMovidius用にする必要がある。tf.train.Saver()を使って学習済みネットワークを保存するこれによって、****.index****.data-00000-of-00001****.metaの3つのファイルが生成される。次に、生成された学習済みモデルをもう一度開いてMovidiusでコンパイルが可能なモデルを出力する。accuracyなど学習用のコードを削除するこられの変更をしたコードで、保存したモデルをrestoreで開き、またsaveする。これによって、****_inference.index****_inference.data-00000-of-00001****_inference.metaの3つのファイルが生成される。コンパイルmvNCCompileコマンドを使って保存した****.metaファイルをgraphファイルに変換する。nodeの名前を入れる。実行結果TensorflowのExampleにあるdeep_mnist.pyを試した。rangeファイル変換までは問題なく動くが、コンパイル時にmvNCCompile内でIndexErrorを起こして止まってしまう。配列の要素を確認せずにアクセスしていることが原因。ライブラリの書き換え/usr/local/bin/ncsdk/Controllers/TensorFlowParser.pyを編集して、回避する。やってよいのかどうかは不明。have_first_input(strip_tensor_id(node.outputs[0].name)):これによってmvNCCompileは通って、graphファイルも生成されるようになった。(v1)実際にどうさせてみる。以下、特筆なしの場合、APIはv1を使用。images)正しくない結果が出力された。1~9までの9枚で確認する。images)なぜか4と7が100%"8"だと認識されて、それ以外は100%"2"だと認識される。images)やはり4と7が100%"8"だと認識されて、それ以外は100%"2"。一度最初から学習deepmnist.pyをjupyter-notebookで実行。Accuracyは0.939で正しく学習できている。出力ファイルが正しく保存されていることを確認。-1MNIST_data/checkpointconv4movidius.ipynbdeepmnist.ipynbmnist_model.data-00000-of-00001mnist_model.indexmnist_model.metaoutput/さらに、Movidius用に保存しなおし。-1MNIST_data/checkpointconv4movidius.ipynbdeepmnist.ipynbmnist_inference.data-00000-of-00001mnist_inference.indexmnist_inference.metamnist_model.data-00000-of-00001mnist_model.indexmnist_model.metaoutput/コンパイルを実行。mnist_inference.graphRPIでMovidiusでpredictしてみる。images)やはり変わらず。nanase)でやってみる。images)やっぱり何かおかしい。Piだから起きている訳ではない。問題はmvNCCompileで生成されたgraphファイルなのでは?Tensorflowで保存したファイルが正しいかを確認する。jupyter-notebook上で、mnist_modelからrestoreしてpredictさせてみる。0.9477問題なくpredictできている。mvNCCompileに入れているファイルが正しいかどうかを確認するこれが正しく動いていれば、問題はmvNCCompile。突っ込んだファイルがダメか。jupyter-notebook上で、mnist_inferenceからrestoreしてpredictさせてみる。0.9477こちらも問題なくpredictできている。問題はmvNCCompile周辺mvNCCheckでモデルの確認をしてみるmvNCCheckを使って、モデルの確認を行う。0.013088561594486237------------------------------------------------------------Result(Movidiusの出力)とExpected(TensorFlowの出力)がほぼ同じであることから、正しく動作していると考えられる。いうことは、問題なのは推論に使っているNCAPIのほう?mvNCCheckを使って認識してみるmvNCCheckに-iオプションを付けることで自分で画像ファイルを指定して入力することができる。いい加減TensorFlowParserはリストにアクセスする前に要素数をチェックしていただきたい。204行目のdebug=Trueを有効化して、shapeを表示つするように追記。rangeの結果を得る。784]であることがわかる。0.1059(略)のように正しく実行される。784]で、エラーが起きたときと同じである。入力してからreshapeして28x28にしてた。784])で入力したいが、TensorFlowParserは最低でも4次元はないとお気に召さないらしい。内部で乱数生成しているときには何にも起きないのなんで?とりあえず、問題のparse_img()の定義を探してみる。channel_swap=None):/usr/local/bin/ncsdk/Controllers/MiscIO.pyにあるらしい。channel_swap=arguments.channel_swap)となっている。呼び出しの変数をどうしたらいいのか知りたいので、parse_img()を追いかける。Falseどうやらnew_size[2](配列の3番目)はカラーチャンネルを確かめているらしい。いうわけでint(shape[1])は今回は1となる。引数のpath(呼び出し側ではimage)は画像ファイルへのパスを表している。y)のみなので、1次元追加することで3次元としている。カラーチャンネル数)となる。次にresizeの指定にnew_size[2]とnew_size[3]を使っている。呼び出し側で、int(shape[1])とint(shape[2])となるわけだが、int(shape[1])はグレースケールか否かを表しているのでは?newsizeが使われているのはこの2か所のみ。y)になるように軸を入れ替えする。shape)となっているから、最終的にはinput_dataのshapeは(1,784)のもとの形となるべき。これらの情報から引数の予想を立てる。new_image以外に入るべき値はそのままでよい。カラーチャンネル数)のようになっているであろうと想像がつく。y]の形にして入力している。shape[1]]となる。Falseの時にxの値を見てgreyscaleを判断してしまう。new_size[2]ではなく、new_size[1]書き換える。1と新しいエラーが出る。784)'とエラーが出る。これやる意味あるのか?別にmvNCCheckで画像を与えなくてもよくない?PythonでのAPI追いかけるべきでは?mvNCCheckのランダムでgraphは正しいと思ったけど、そもそも出力されたグラフがおかしかったら、tensorflowでやったやつもおかしな結果を出力するのではDAY2やっぱり4次元にしたところで入力は2次元なので入力できない。これでほかの画像は入力できないし、ほかのネットワークにも対応できない。no.290")実行してみる。0.494139------------------------------------------------------------やっぱりほとんどの数字が2だと出力される。mvNCCheckからの場合には確率は100%ではない。PythonAPIから呼び出しても、mvNCCheckから呼び出しても同じ結果が返ってくる。いうことは変換したgraphファイルがおかしいということがわかる。mvNCCompileに渡したファイルか、mvNCCompileのどちらかが間違えている。deep_mnistのサンプルをgithub上のコードでやってみるdeep_mnistのサンプルがgithub上にあった。https://github.com/ashwinvijayakumar/ncappzoo/tree/mnist/tensorflow/mnist動く。mvNCCompileのパッチを元に戻しても大丈夫。自分で用意したgraphとJPEGにしても動く。ほうはIndexError)ただ、Intelのサンプルは確実に間違えていた。黒地に白字で学習させてたのに、推論の時に白地に黒字の画像でやっていた画像を読み込んだ後に255で割るのを忘れていたmvNCCheckに画像を読み込ませる機能は動かないずっと、おかしな出力だと思っていたものは正しい出力であった。(動作した方法・ソースコード)3つの問題を解決することができた。入力がおかしいmvNCCompileの書き換え/usr/local/bin/ncsdk/Controllers/TensorFlowParser.pyの290行目付近を編集して、配列の要素を確認してからアクセスるようにする。have_first_input(strip_tensor_id(node.outputs[0].name)):これで、mvNCCompileは通るようになる。mvNCCheckの書き換え/usr/local/bin/ncsdk/Controllers/MiscIO.pyの250行目付近を編集。False/usr/local/bin/ncsdk/Controllers/TensorFlowParser.pyの270行目付近を編集。