2017年11月27日月曜日

Intel Movidius Neural Compute Stick の環境を準備した

Movidius NCS

はじめに

Movidius NCS を購入したのでubuntu 16.04に動作環境を作成した。
SDKのバージョンは、1.10.01.01を使用している。

ソースの取得

ここからソース一式をダウンロード
展開して、フォルダー名をncsdkに変更し、ncsdkに移動。

ビルド

make install

成功すると以下のメッセージが表示される

Successfully installed mvnc-1.10.1.0
NCS Libraries have been installed in /usr/local/lib
NCS Toolkit binaries have been installed in /usr/local/bin
NCS Include files have been installed in /usr/local/include
NCS Python API has been installed in /opt/movidius, and PYTHONPATH environment variable updated

Movidius を挿入

dmesgで認識されているか確認

usb 3-3: new high-speed USB device number 4 using xhci_hcd
usb 3-3: New USB device found, idVendor=03e7, idProduct=2150
usb 3-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-3: Product: Movidius MA2X5X
usb 3-3: Manufacturer: Movidius Ltd.
usb 3-3: SerialNumber: 03******

サンプルの実行

python版
~/ncsdk/examples/apps/hello_ncs_py$ make run

making run
python3 hello_ncs.py;
Hello NCS! Device opened normally.
Goodbye NCS! Device closed normally.
NCS device working.

c++版
~/ncsdk/examples/apps/hello_ncs_cpp$ make run

making hello_ncs_cpp
g++ cpp/hello_ncs.cpp -o cpp/hello_ncs_cpp -lmvnc
Created cpp/hello_ncs_cpp executable

making run
cd cpp; ./hello_ncs_cpp; cd ..
Hello NCS! Device opened normally.
Goodbye NCS!  Device Closed normally.
NCS device working.

コメント

環境構築時に多数のライブラリがインストールされ、環境が汚染された気がする。


以上

2017年11月20日月曜日

OpenCV の dnn の順方向のデータ伝搬に関して調べてみた。

はじめに

OpenCV のチュートリアルの解説では、順方向のデータ伝搬に関しては、

6 Make forward pass

        prob = net.forward("prob");                          //compute output

During the forward pass output of each network layer is computed, but in this example we need output from "prob" layer only.

と解説されている。

以前からこの最後のレイヤー名を指定するのは、レイヤー名を知っていることが前提であり、少し不便かと思っていた。

そこで、関数の説明を調べてみたら、モデルの最終レイヤーからの出力が欲しい場合、レイヤー名を指定しなくても(デフォルト値)問題ないことが分かった。

forward() [1/4]
Mat cv::dnn::Net::forward    (    const String &     outputName = String())

By default runs forward pass for the whole network.


試しに、caffe_googlenet.cpp で、

prob = net.forward();

に変更してみても、オリジナルと同等の結果を得られたことを確認した。

以上

OpenCV の dnn でレイヤー名を取得した。

はじめに

今回、レーヤーのクラス名を取得する getLayerNames() を試してみた。

関数の説明は、 ここ

サンプルソースの修正

caffe_googlenet.cpp の readNetFromCaffe のあとに、

    std::vector<String> lname = net.getLayerNames();
    for (int i = 0; i < lname.size();i++) {
        std::cout << i+1 << " " << lname[i] << std::endl;
    }

を追加。

ビルドして、実行すると

 ./caffe_googlenet
1 conv1/7x7_s2
2 conv1/relu_7x7
3 pool1/3x3_s2
4 pool1/norm1
5 conv2/3x3_reduce
6 conv2/relu_3x3_reduce
7 conv2/3x3
8 conv2/relu_3x3
9 conv2/norm2
10 pool2/3x3_s2



140 pool5/drop_7x7_s1
141 loss3/classifier
142 prob

Best class: #812 'space shuttle'
Probability: 99.9935%
Time: 23.7494 ms (average from 10 iterations)

のような表示となる。

以上

2017年11月13日月曜日

OpenCV master のスタイル変換サンプルプログラムでいくつかのモデルを試してみた。 その2

composition_vii

はじめに

前回のつづき。

今回は、同じ画像を題材に、eccv16 のモデルを適用してみた。

モデルのサイズは、約25Mぐらいである。
提供されているモデルは、以下の4個である。

  • the_wave.t7
  • starry_night.t7
  • la_muse.t7
  • composition_vii.t7

結果

表題の画像は、composition_viiのモデルを摘要したものである。

以下残りの3つの摘要結果を示す。

the_wave
starry_night
la_muse

モデルの違い

fast-neural-style のアルゴリズムなどここに概略が記載されている。

eccv16 は、オリジナルの論文で使用されたモデルのようである。

instance normalization は、派生の様であり、 

This simple trick significantly improves the quality of feedforward style transfer models.

との説明されている。

参考

Instance Normalization (全てのサンプルから、平均を引いて、標準偏差で割る)

2017年11月10日金曜日

OpenCV master のスタイル変換サンプルプログラムでいくつかのモデルを試してみた。(I tried several models with style conversion sample program of OpenCV master version.)

the_scream

はじめに

スタイル変換がうまくできたので、残りのモデルをダウンロードして試してみた

instance_norm の意味は置いておいて試してみた
モデルのサイズは、約15Mぐらいである。
800x450画素の画像の変換に、約400-450msecかかっている

提供されているモデルは、以下の6個である。
  • candy.t7
  • feathers.t7
  • la_muse.t7
  • mosaic.t7
  • the_scream.t7
  • udnie.t7

結果

昨日の画像は、 la_muse のモデルを適用したものである。

表題の画像は、the_screamのモデルを適用したものである。

以下残りの4つの適用結果を示す。

candy
feathers
mosaic
udnie


以上

OpenCV masterでスタイル変換を試した。(I tried style conversion with OpenCV master.)

スタイル変換画像

はじめに

OpenCV maste の dnn sampleにスタイル変換が追加されていたので、OpenCV 3.3.1で試してみたが、ダメだった。

仕方なく、master(11/07) を取得し、OpenCV をビルドし、サンプルを試して見たところ、いくつか問題が生じたが、表示させることができた。

事前準備は、前回とおなじである。

実行

python fast_neural_style.py --input=p30.png --model=models/instance_norm/la_muse.t7 --median_filter=3

変換結果にメディアンフィルターをかけた方の見栄えがよかったので、 --median_filter=3 を追加している。

800x450のサイズで、処理時間は約360msecである。

課題

結果は、表題の画像のようになった。指定したモデルの影響を受けているが、モデルの元の画像の対応が分からないので、オリジナルを調べてみる。

以上

2017年11月6日月曜日

OpenCV 3.3.1でスタイル変換を試したがダメだった。(11/09修正)

はじめに

masterでは、dnnのサンプルが、追加、修正されていたので、OpenCV3.3.1にそのまま取り込んで利用できるのではと期待を持って試してみた。

今回は、新たに追加されたスタイル変換をためしてみた。
pythonのソースはここ

2017/11/09追記
modelファイル名の指定を間違っていた。修正したが3.3.1では対応していないことに変わりなく、実行できなかった。

事前準備

https://github.com/jcjohnson/fast-neural-style/blob/master/models/download_style_transfer_models.sh
のスクリプトを実行しtorch形式のモデルデータを取得する

実行

python fast_neural_style.py --input=train1.png --model==models/eccv16/starry_night.t7
--modelのファイル名の指定を間違っている

2017/11/09 訂正
python fast_neural_style.py --input=train1.png --model=models/eccv16/starry_night.t7

結果

残念ながら3.3.1では、エラーとなった。

OpenCV Error: Unspecified error (cannot open <=models/eccv16/starry_night.t7> in mode r ) in THDiskFile_new, file /home/opencv/opencv-3.3.1/modules/dnn/src/torch/THDiskFile.cpp, line 497

修正後のエラーメッセージ
The function/feature is not implemented (Unknown nn class "nn.SpatialReflectionPadding") in readTorchObject, file /home/opencv/opencv-3.3.1/modules/dnn/src/torch/torch_importer.cpp, line 896


masterのソースを見てみると

torch_importer.cpp    Layers for fast-neural-style models:

とgit の コメントがあり、ソースを差し替えないと動作しないことが確認された。

そのうちmasterで試してみる。