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で試してみる。

2017年10月31日火曜日

OpenCV 3.3.1で ssd_mobilenet を試してみた。 (I tried SSD mobile net sample with OpenCV 3.3.1.)

ssd_mobilenet 検出結果

はじめに

OpenCV 3.3.1の dnnのサンプルに ssd_mobilenet_object_detection.cpp があったので試してみた。
オリジナルでは、カメラからの画像入力にたいして、検出と分類を行っているが、SSDのサンプルと同じように指定した画像ファイルを対象にするように修正した。

事前準備

ここから、モデル構成ファイル MobileNetSSD_deploy.prototxt と、モデルの Weight データ MobileNetSSD_deploy.caffemodel をダウンロードする。

実行

./ssd_mobilenet_object_detection --proto=MobileNetSSD_deploy.prototxt --model=MobileNetSSD_deploy.caffemodel --image=IMG_20170528_101542774s.png

結果

検出結果の画像は、表題に示したものである。
SSDと比較して遜色ないとの印象である。
処理時間は、SSDの約1/4である。


コンソールの出力は以下のようである。

Time: 89.1173 ms (average from 1 iterations)
Class: 19
Confidence: 0.996814
 422.718 119.067 793.871 352.956
Class: 19
Confidence: 0.996561
 275.497 142.484 423.741 342.062
Class: 19
Confidence: 0.938294
 164.96 159.205 280.469 331.535
Class: 19
Confidence: 0.856705
 18.797 171.8 159.573 321.132


以上

2017年10月30日月曜日

OpenCV 3.3.1で SSD を試してみた。 (I tried Single Shot MultiBox Detector sample with OpenCV 3.3.1.)

OpenCV 3.3.1のSSD検出結果

はじめに

3.3.1でSSDを試したところ検出結果が3.3.0と異なるので調べてみた。
3.3.0でのSSDのサンプルに関してはここ

準備

最初は、3.3.0で使用したサンプルのソースをそのまま使用したところ、警告が生じた。
モデルのロードと初期化が変更されており、createCaffeImporterは廃止されるとのこと

OpenCV 3.3.0

Ptr<dnn::Importer> importer;
importer = dnn::createCaffeImporter(modelConfiguration, modelBinary);

dnn::Net net;
importer->populateNet(net);

OpenCv 3.3.1

dnn::Net net = readNetFromCaffe(modelConfiguration, modelBinary);


あと、blobFromImageを3.3.1で記載されているように変更した。

Mat inputBlob = blobFromImage(preprocessedFrame, 1.0f, Size(), Scalar(), false); (SWAP RGBのフラグをfalseにしている

実行

./ssd_object_detection -proto=deploy.prototxt -model=VGG_VOC0712_SSD_300x300_iter_120000.caffemodel -image=IMG_20170528_101542774s.png

結果

OpenCV 3.3.0 SSD検出結果

オブジェクトの検出結果が表題の画像の様に、3.3.0の時と異なる。

3.3.1のソースをよく見ると、
preprocess()内の35行のコメントに
//SSD accepts 300x300 RGB-images
とあり、SSDでは、画像のチャンネルの並びは、RGBの順番にしないといけない。

しかし、3.3.1のソースでは、SWAP RGBのフラグをfalseにしており、ここは、SWAPすべきなので、3.3.0のように
Mat inputBlob = blobFromImage(preprocessedFrame)
が正しいと思われる。

SAPWをtrueにしたところ、3.3.0と同じ結果となった。

以上

2017年10月29日日曜日

OpenCV dnn モジュールで Inception モデルでクラスの分類を行った。(I classified images with Inception model in OpenCV dnn module.)

#439 'pelican' 42.998%

はじめに

サンプルのdnnフォルダーに含まれているtf_inception.cppを試してみた。
tf_inception.cpp は、 Tensorflow の モデルを読み込み分類を行うデモである。
このデモでは、inception を対象としている。

事前準備

モデルデータをここからダウンロードし、ZIPファイルを展開する。

実行

サンプルプログラムをコンパイルし、以下の様にコマンドラインから入力を行う。

./tf_inception --model=tensorflow_inception_graph.pb --image=space_shuttle.jpg --i_blob=input --o_blob=softmax2 --c_names=imagenet_comp_graph_label_strings.txt

結果


Output blob shape 1 x 1008 x 91198400 x 0
Inference time, ms: 148.885
Best class: #234 'space shuttle'
Probability: 99.9972%

白鳥の画像も試してみたが、認識対象に含まれていないためペリカンと判定された
imagenet_comp_graph_label_strings.txt を調べてみると、 #421にblack swanが登録されているので、黒鳥なら認識できると思う(アイコンの画像にした国鳥の写真が見つからない)

データに関して

imagenet_comp_graph_label_strings.txt
ファイルの中はクラスの名前である。
全部で1001行のファイルであり、最初の行はdummyと記載されている。

出力のBlobの形式はsoftmax2の出力でるがどのような並びかは不明。

以上

2017年10月26日木曜日

OpenCV 3.3.1 で変更されたdnnモジュールのAPI (Changed API of dnn module in OpenCV 3.3.1)

自動着色のサンプル結果 本文と関係なし

はじめに

3.3.1のdnnモジュールのサンプルのソースを眺めていたとこを、いくつかのサンプルで冗長な記述があり、短縮で切るのではないかとAPIをみていたら3.3の時から若干変更されているAPIをみつけた。




3.3の説明
3.3.1の説明

見比べると分かるが、最後の bool crop = trueが追加されている。

説明

blobFromImage は、OpenCV の Mat 型を入力とし、dnn モジュールの入力として使用できるように型の変換を行うAPIである。

3.3では、本来の型変換に加えて、

  • 値のスケールを変換する機能、
  • 入力画像のサイズを指定のサイズに変更する機能
  • 入力画像の値から平均値に相当する値を減算する機能
  • 入力画像のRchとBchを入れ替える機能
が提供されていた。
3.3の説明では、縦横の比が同じになるように、中心からCropされていた

( input image is resized so one side after resize is equal to corresponing dimension in size and another one is equal or larger. Then, crop from the center is performed.)

3.3.1では、デフォルトでは、Cropであるが、最後のパラメータをfalseにすることにより、入力画像の大きさを強制的に指定サイズに変換することができる。

それゆえ、いくつかのサンプルでは、事前にresizeを使用して入力画像のサイズをモデルの入力画像の大きさに変換を行うコードを使用しているが、3.3.1では、入力画像をそのままblobFromImage() に渡し、最後のパラメータをfalseにすればよい。

uchar から double に型変換を行い、255で割ることでスケールを0-1に変換する処理を使用しているサンプルや
平均値を Mat から減算しているサンプルなどもあるが、これらはすべて blobFromImage においてパラメータを指定するだけでよい。

以上

2017年10月25日水曜日

OpenCV 3.3.1 がリリースされた (OpenCV 3.3.1 was released)

急いでいたのかリリース日が修正されていない


先週リリース予定だった3.3.1がようやくリリースされた。

リリース情報

ドキュメント

変更点


今回は、opencv_dnnの改良と機能拡張がメイン

・顔検出のサンプルが追加、普通のPCで20-50FPSの速度
・FP16をサポートしたが、まだ計算はできない
・テキスト検出、着色のためにいくつかのレイヤーを追加



以上


2017年10月18日水曜日

Windows10 上で OpenCV master の DNN サンプルプログラムを試してみた。(I tried the DNN sample program of OpenCV master on Windows 10)

実行結果

はじめに

OpenCV 3.3.1 相当と思われるmaster版のソースをWindows上でビルドした。
開発環境は、Visual Studio 2015 を指定し、共有ライブラリを作成した。
最近では、共有ライブラリを一つにまとめることが楽になったと感じる。

事前準備

Windowsコンソールタイプを指定してプロジェクト caffe_googlenet を作成する。
caffe_googlenet.cppをサンプルと入れ替える。

また、
  • bvlc_googlenet.caffemodel
  • bvlc_googlenet.prototxt
  • synset_words.txt
  • space_shuttle.jpg
をソースのフォルダーにコピーする。

プロジェクトには専用のプロパティシートを追加し、インクルードファイルとlibファイルのパスを設定しておく

ソースの変更

サンプルプログラム caffe_googlenet.cpp には、

#pragma comment(lib, "opencv_world330.lib")

の1行を追加する。

ビルドと実行

リリース版でビルドした後、リリースフォルダー内のexeファイルをソースのあるフォルダーにコピーする。
Windowsコンソールアプリを起動し、ソースのあるフォルダーに移動する。

caffe_googlenet.exe を実行する。

結果は、冒頭の画面ダンプ画像のようになる。

以上

2017年10月17日火曜日

OpenCV master の DNN の Coloriozation を試してみた。(I tried the Coloriozation sample program of DNN of OpenCV master.)

着色画像

はじめに

今週リリースが予定されている OpenCV 3.3.1 相当のmaster ブランチの dnn モジュールには
Darknet の Yoloが追加されたことがメインの話題と思われが、caffe をベースとした、転移学習の結果と思われる colorization のデモも追加されている。

残念ながらくわしい情報はないが、サンプルソースを手がかりに試してみた。
なお、サンプルはC++ではなくパイソンである。

事前準備

モデルの構成ファイル、 weight に加えて追加で学習したweightのファイル(npyフォーマット)の3つのデータが必要である。

このデータは、オリジナルのGitHubにアクセスしここからダウンロードすることになる。
なお、サンプルでは、 models/colorization_release_v2.prototxt と記載されているがこのようなファイルはないので、 models/colorization_deploy_v2.prototxt を代わりに使用している。

実行

3つのファイルをサンプルプログラムと同じフォルダーに保存し、以下のコマンドを実行する

python colorization.py --input p30.png

結果

3枚の画像が表示される。

1枚目 オリジナル
2枚目 白黒画像

3枚目は 着色画像である(表題)

補足

このモデルでは入力画像は一旦224x224にリサイズされ着色処理が行われる。

その後、オリジナルの画像サイズに戻して表示するのが正しい方法と思われるが、固定サイズになっているので修正が必要である。


C++に同等の関数が準備されているので、これをベースに書き直すことは可能かと思われる。
以上

2017年10月16日月曜日

dlib Ver 19.7がリリースされていた

ひさしぶりにdlibのページをみてみたら9/7にVer 19.7がリリースされていた。

変更点のページ

個人的には、気になる点は2点

・顔の5点の特徴点検出モデルの提供
・98fpsで動作する車検出用の deep learning 機能

あとで試してみる


2017年10月14日土曜日

各タイプの Yolo v2の実行速度を比較してみた。(I compared the execution speed of each type of Yolo v2.)

Yolo V2 OpenCV検出結果 本文と関係なし

OpenCV版がどれくらいの速度なのか、サンプルプログラムの検出実行の前後をtickmeterで計測した。
t.start();
cv::Mat detectionMat = net.forward("detection_out");
t.stop();

本来10回くらい計測し平均をとる方がばらつきは少ないが、1回のみの計測値を記す。 
比較対象の入力は同じ電気機関車の画像である。上記でない。前の記事を参照


Yolo v2 OpenCV CPU
240.021 ms
Class: 6 (train)
Confidence: 0.696404

Class: 6 (train)
Confidence: 0.838492

Class: 7 (truck)
Confidence: 0.251813

Class: 2 (car)
Confidence: 0.579142

Class: 2 (car)
Confidence: 0.527116

Class: 2 (car)
Confidence: 0.373341



Yolo v2 GPU
Loading weights from ../work/yolo.weights...Done!
../work/train1.png: Predicted in 0.067898 seconds.
train: 68%
truck: 28%
car: 25%
car: 50%
car: 55%
car: 61%
train: 86%

Yolo v2 CPU
Loading weights from ../work/yolo.weights...Done!
../work/train1.png: Predicted in 11.672127 seconds.
train: 68%
truck: 28%
car: 25%
car: 50%
car: 55%
car: 61%
train: 86%

結果

速度

GPU > OpenCV >> CPU

OpenCVは一部最適化されていて、CPU版は、最適化されていないと思う

初期化時間(モデルとWeightの読み込みと初期化時間)

OpenCV >> GPU = CPU

精度

Yolo v2 GPU と Yolo v2 CPU の信頼度は同じであるが、OpenCV版とはことなる

以上

OpenCV 2.4.13.4がリリースされた (OpenCV 2.4.13.4 was released)



リリースページ

メモ

リリースノートがないので変化点は不明である
2.4.13.3のソースとの差分を調べればわかるが、2.4.13.4をさわる機会が少ないので、調査はしない

Yolo v2 (OpenCV版)の検出結果の出力に関して調べている。I am investigating the output of detection result of Yolo v2 (OpenCV version).

サンプルファイルの中を覗いてみた。

予測は、OpenCVのdnnクラスのAPI forwardを使用している。

サンプルでは以下の様に記載されている

cv::Mat detectionMat = net.forward("detection_out");    //compute output

結果は、Mat型 detectionMat に格納されている。

detectionMatのサイズは、[85 x 845]である
これをrowsの数繰り返し、信頼度がしきい値を越えているかの判定し、越えている場合、描画している

85の内容

1    領域中心X座標
2    領域中心y座標
3    幅 0-1
4    高さ 0-1
5     信頼度
6    クラスID 1の信頼度

85    クラスID 80の信頼度

プログラムでは、std::max_element を使用しID 1から ID 80の最高の値のindexを計算

845の内容

845 = 13 x 13 x 5

Yolo 9000 原文

This modified YOLO predicts detections on a 13 × 13 feature map.

13 x 13 は grid数だが 5の意味は不明


入力画像

サイズは、416x416に固定(原文に記載)

分かり次第追記予定

2017年10月12日木曜日

OpenCV masterで dnn のサンプル (Darknet Yolo v2) を試してみた。 その2 (I tried Darknet Yolo v2 sample with OpenCV master. part 2)

yolo2 の実行結果

はじめに

最新のOpenCVのマスターにDarknet Yolo v2がマージされたので試してみた。
昨日は、付属のdogの画像を試してみた。今回は手持ちの電気機関車の画像で試してみた。

オリジナルのYolo2の記事はここ

実行

./yolo_object_detection -cfg=yolo.cfg -model=yolo.weights -image=train1.png -min_confidence=0.24

結果

下記はコンソールの出力である
注:クラスIDのあとのクラス名は手動で追記したものである。

Class: 6 (train)
Confidence: 0.696404
 103.023 146.634 222.658 213.241

Class: 6 (train)
Confidence: 0.838492
 189.994 33.6445 604.202 362.722

Class: 7 (truck)
Confidence: 0.251813
 594.013 162.351 671.968 223.86

Class: 2 (car)
Confidence: 0.579142
 611.289 183.193 687.641 268.964

Class: 2 (car)
Confidence: 0.527116
 654.074 187.276 764.84 275.665

Class: 2 (car)
Confidence: 0.373341
 717.057 192.397 790.009 303.311

オリジナルのDarknetでは、領域とクラス名が画像に重ねて描画されたためわかりやすいが、
OpenCVのサンプルでは領域しか描画されないので、結果が正しいかの判断がつきにくい

コンソールにクラスIDと信頼度、それと、信頼度の下に4つの数字が出力される。
4つの数字は、それぞれ、左上X,左上y、右下x、右下yの座標である
(ソースでは、xLeftBottom, yLeftBottom, xRightTop, yRightTop の変数が使用されているが間違いと思う)

クラス名への変換:

クラスIDに1を加算した値と

https://github.com/pjreddie/darknet/blob/master/data/coco.names
のファイルの記載されているIDの値が等しいものである。

以上

2017年10月11日水曜日

OpenCV masterで dnn のサンプル (Darknet Yolo v2) を試してみた。 その1 (I tried Darknet Yolo v2 sample with OpenCV master. part 1)

Yolo v2検出結果

はじめに

dnnのサンプルは、複数個 opencv/samples/dnn/のフォルダーに格納されている。
2017/10/11 の master branch には、Darknet Yolo v2のサンプル yolo_object_detection.cpp が追加されている

Darknet Yolo に関しては、単独のフレームワークを試したことがある。
こことかこことかここ
あといくつかあるので、興味があれば、左上の検索窓で調べて見てください

また、昨年のAdvent Calenderでは、OpenCVとの連携も記述したことがある。

ビルド

masterも素直に、ビルドできた。また、サンプルもこれまでのサンプル同様 普通のOpenCVのプログラムのビルドを同様にできる

事前準備

ここから、モデル、weight、サンプル画像をダウンロードして、yolo_object_detectionと同じフォルダーに保存する。

実行

yolo_object_detection -cfg=yolo.cfg -model=yolo.weights -image=dog.jpg -min_confidence=0.24

最後のパラメータは、しきい値に相当するもの、大きくすると検出対象が減少する。

結果
プログラムを実行すると検出結果の領域が、オリジナルに重ねて描画される
オリジナルは、線幅1の緑色だが、線幅2のシアンに変更している

コンソールには、検出されたクラスのIDと座標が描画される。

検出結果

クラスIDからクラス名への変更は、サンプルに追加する必要がある。

以上

来週中にOpenCV 3.3.1 がリリースされる予定とのこと (OpenCV 3.3.1 will be released this or next week.)


久しぶりに Meeting note を見てみたら、今週の議題2に
2. We will release OpenCV 3.3.1 this or next week.
と記載されている。

今週末ぐらいにリリースされるのでは見ている。

内容は今のmaster branchとほぼ同じと見ているので、あとでマスターをビルドしてみる。

議題3には、OpneCL対応が記載されており、DNNモジュールがHalideや従来のOpenCLよりよくなったとのこと。
とはいえ、cuDNNにはまけているが、改良すべき点はわかっているとのこと。

議題4は、DNNモデル入力部が、FP16をサポートしたとのこと、
他のOpenCVを対応させるのは困難のため、FP32に変換して、実行するとのこと
これによりモデルデータ量が削減される。いくつかのモデルで試した結果は、検出精度の差はない

追加

Meeting note には、記載がないが、master branchのmodulesを見てみると

dnn:    Merge pull request #9705 from AlexeyAB:dnn_darknet_yolo_v2

というコメントを見つけた。

Added DNN Darknet Yolo v2 for object detection #9705

を見てみると、説明が記載されている。

サンプルもあるので、あとで試してみる(試してみた

以上

2017年10月3日火曜日

Ubuntu 上の Deep learning の環境を更新した。


 各ツールが更新されたので、まとめて更新した。
 cudaはCUDA 9.0がリリースされているが、TensorFlowが対応していないためCUDA 8.0を使用している

各ツールのバージョンのメモ

CUDA
 nvcc -V
 nvcc: NVIDIA (R) Cuda compiler driver
 Cuda compilation tools, release 8.0, V8.0.61

cuDNN
 ls /usr/lib/x86_64-linux-gnu/libcu*
 /usr/lib/x86_64-linux-gnu/libcudnn.so.6.0.21

TensorFlow
 pip list | grep tensorflow
 tensorflow-gpu (1.3.0)
 tensorflow-tensorboard (0.1.5)

Keras
 pip list | grep Keras
 Keras (2.0.8)

Jypyter Notebook
 jupyter --version
 4.3.0

以上

2017年8月9日水曜日

OpenCV 3.3.0で dnn のサンプル (SSD) を試してみた。 その3 (I tried Single Shot MultiBox Detector sample with OpenCV 3.3.0. part3)

 
SSD検出結果

はじめに

dnnのサンプルは、複数個 opencv/samples/dnn/のフォルダーに格納されている。

これまでに、1000クラスを分類する caffe_googlenet.cpp、対象領域を検出する fcn_semsegm.cpp を試してみた。
今回は、オブジェクトの検出と分類を行う SSD: Single Shot MultiBox Detector を試してみた。ファイル名は、ssd_object_detection.cpp である。

準備

cfgファイルと、weightファイルの取得方法に関して、helpメッセージに記載があり、SSD: Single Shot MultiBox Detector の git hub のページから好きなモデルを選択して、ダウンロードを行う

今回は、PASCAL VOC models07+12: SSD300 を選択した。

ダウンロードされる、ファイル名とサイズは、models_VGGNet_VOC0712_SSD_300x300.tar.gz(93M)
である。

ダウンロード後に展開して、SSD_300x300 フォルダーから、
VGG_VOC0712_SSD_300x300_iter_120000.caffemodel deploy.prototxt を取り出し、実行フォルダーにコピーする。

ソースは、若干修正し、実行時間の計測と、検出結果をわかりやすくしている。

入力画像は、300x300にリサイズされ、検出されるが、検出結果の座標は、相対的な割合が得られるので、オリジナルの画像でも対応する場所に4角形が描画されている。

実行結果

ビルドしたプログラムは、以下の用に実行させる。

コマンドライン
 これは、冒頭の電車の画像を対象画像に指定しており、実行結果は、4つのオブジェクトの領域と、信頼度が出力されたものである。



こちらは、いつものスペースシャトルで試したものである。


課題

検出したオブジェクト名の取得方法が分からないので継続して調べてみる。

以上

OpenCV 3.3.0で dnn のサンプル (semantic segmentation) を試してみた。 その2 (I tried semantic segmentation sample with OpenCV 3.3.0. part2)

セグメンテーションの結果

はじめに

dnnのサンプルは、複数個 opencv/samples/dnn/のフォルダーに格納されている。

前回の、caffe_googlenet.cpp は、1000クラスの分類のサンプルである。
今回は、fcn_semsegm.cppを試してみた。

ファイル名からして、セグメンテーションを行うサンプルと思われるが、
ソースコード内には、一切の説明用のコメントが記載されていない。

準備

weightファイルの取得方法に関して、helpメッセージに記載があり、ここからダウンロードする。
サイズが512Mと巨大である。

モデルデータは、ファイル名 fcn8s-heavy-pascal.prototxt で検索してみると
opencv/samples/data/dnn/ のフォルダーに格納されていることがわかった。

また、識別結果と、描画用の色データに関しては、pascal-classes.txt に記載されており、
これも上記同様に opencv/samples/data/dnn/ のフォルダーに格納されている

実行結果

入力画像は、512x512にリサイズされ、対象物別に塗りつぶされる。
冒頭の画像の用に、trainと判断されている部分は、電車の領域をカバーしている。



CPUのみで処理してるの、処理時間は数秒要している。

また、実行時に
If the message turns out to be larger than 2147483647 bytes, parsing will be halted for security reasons.
のようなweightファイルのサイズの制限に引っかかっているとおもわれ、解消するには、ヘッダーを調査する必要がある。

識別対象と色 

pascal-classes.txtの内容

background 0 0 0
aeroplane 128 0 0
bicycle 0 128 0
bird 128 128 0
boat 0 0 128
bottle 128 0 128
bus 0 128 128
car 128 128 128
cat 64 0 0
chair 192 0 0
cow 64 128 0
diningtable 192 128 0
dog 64 0 128
horse 192 0 128
motorbike 64 128 128
person 192 128 128
pottedplant 0 64 0
sheep 128 64 0
sofa 0 192 0
train 128 192 0
tvmonitor 0 64 128

関連あると思われる記事はこちら 

FCNのCaffe実装でセグメンテーションデモを試してみた
FCN(Fully Convolutional Network)の覚え書き
Semantic segmentation

2017年8月8日火曜日

OpenCV 3.3.0で dnn のサンプルを試してみた。 (I tried dnn sample program with OpenCV 3.3.0)

左右反転画像

はじめに

OpenCV 3.3.0がリリースされたので、目玉機能であるdnnを試してみた。
サンプルプログラムは、rcの時と同一であることが確認されたので特に問題がないかと思われた。
rcのときに話は、ここ。  ビルド方法、使用方法は特にかわりはない

実行結果

rcと同じく添付されているスペースシャトルの画像を認識させてみた。
処理時間は、なぜかrcと比較して遅くなっている。
結果の確率の値は、同じである。



3.3.0での処理時間(rcでは24.5msec)

実験
 サンプル画像を冒頭のように左右に反転させた画像をためしてみた。ファイルを指定する場合は、引数にファイル名を指定すればよい。処理時間は、代わらず。同等の確率をえた。



サンプルプログラムの概要 補足

入力画像を設定
net.setInput(inputBlob, "data");

予測実行
Mat prob = net.forward("prob");

"data", "prob"はどうやらレーヤーへの入出力の名前と思われる。



APIに関しての説明はここ

今回使用したモデルファイルの最初と最後を見てみると、それぞれ、"data", "prob"と定義されている。
先頭

最後



2017年8月7日月曜日

OpenCV 3.3.0 を ubuntu 16.04 64bitでビルドした (built OpenCV 3.3.0 on ubuntu 16.04 64 bit)

はじめに

7月中旬に予定されていたリリース日より遅れ、8/4にようやく正式版がリリースされた。
今回の目玉は、RCで述べられているようにdnnモジュールが、contribからcoreに移動したことである。

その他は、リリースノートに記載されている。
3.3.rcのビルドに関しては、ここに記載している。

この時CPUの最適のオプションがよく分からなかった。
今回何も指定せずデフォルトでためしたところ、以下のように設定されている。


--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3
--       requested:                 SSE3
--     Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2
--       SSE4_1 (2 files):          + SSSE3 SSE4_1
--       SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
--       FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
--       AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
--       AVX2 (7 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2

Baseline はmustの機能であり、CPUがここで指定したアーキテクチャをサポートしていないと、プログラムは実行されない。

Dispatched code generation は、CPUがここで指定したアーキテクチャをサポートしている場合、Dispatchにより最適化のコードが実行されるとのこと

これまで何度もビルドしている設定なので、問題ななく終了した。ただ、tbbのpchが使用できない警告は多々表示されるが、問題ないので放置している。

以上

2017年7月10日月曜日

OpenPose1.0.0がリリースされたので手検出機能 を試してみた。(I tried hand detection of OpenPose1.0.0 that was released a few days ago)

手の検出結果(背景を人と誤検出)

はじめに

昨日に、予定されていたOpenPose 1.0が正式にリリースされ、顔特徴点検出機能に加えて、手の検出機能が追加された。1.0.0のリリースノートは、こちら

プログラムは、github から master を一式ダウンロードして、展開する。

ビルドに仕方の基本的な作業は、ここここに書いたものと同じであり、今回は手関連に関して記載する。

モデルデータの取得

models ディレクトリに移動し、getModels.sh を実行し、モデルを取得する。今回 modelの下には、poseとfaceのフォルダーに加えてhandが追加されている。
hand フォルダーには、getModels.shにより、

wget http://posefs1.perception.cs.cmu.edu/OpenPose/models/hand/pose_iter_102000.caffemodel

のコマンドが実行され、約141Mモデルデータが取得される。

サンプルプログラムの修正

手特徴点検出に対応しているのは、
exsamples/openpose/openpose.cpp
だけのようである。

このファイルをエディタで開き、100行目をfalseからtrueに変更する

 // OpenPose Hand
 DEFINE_bool(hand,                       true,

また、検出結果の画像を保存するフォルダーを149行に追加しておく

 DEFINE_string(write_images,              "../work/test"
      
保存ディレクトリは、たまたまテスト対象の画像を保存しているフォルダーと同じにしているが、ここは、何でもよい

ファイルを保存後makeを行う。

デモプログラムの実行

./build/examples/openpose/openpose.bin --image_dir ../work/test/

これにより、../work/testに保存されている画像すべて検出対象となる。
結果は一瞬画面に表示され、上記フォルダーに保存されている。

停止させるには、スペースキーを押す。helpは、hキーを押せばよい

この画像では、残念ながら未検出

補足


cudaコード
NVCC src/openpose/face/renderFace.cu
NVCC src/openpose/pose/renderPose.cu
NVCC src/openpose/pose/bodyPartConnectorBase.cu
NVCC src/openpose/hand/renderHand.cu
NVCC src/openpose/core/nmsBase.cu
NVCC src/openpose/core/maximumBase.cu
NVCC src/openpose/core/resizeAndMergeBase.cu

以上

2017年7月3日月曜日

OpenCV 3.3.0-rc で dnn を試してみた。 解決済み (I tried dnn with OpenCV 3.3.0-rc. solved)

812 'space shuttle' 99.9828%

はじめに

OpenCV 3.3.0-rcでcoreに移動した dnn モジュールを試してみようとチュートリアルのプログラムを動作させようとしたが、ドキュメント内のリンク先が見当たらなかった。それゆえ、3.2.0 contribのサンプルを使用してみたが、APIが変更されておりサンプルプログラムをコンパイルできなかった。

上記内容をまとめて、OpenCV の Issue として報告したところ、早速対応作が記載されたので、試してみた。

修正内容

1 caffe_googlenet.cpp
 2 bvlc_googlenet.prototxt
 3 synset_words.txt

サンプルプログラムと、2、3を取得し、 bvlc_googlenet.caffemodel と space_shuttle.jpg を同じフォルダーにおき、コンパイルを行う。

caffe_googlenet を引数なしで、実行すると、space_shuttle.jpg 画像データの内容の分類を行う。結果は、 99.9828% でスペースシャトルと判定している。

実行結果

サンプルの概要

サンプルプログラムは、判定対象の画像ファイルのパスを引数にすることができる。

Caffe モデルとweightの読み込み
Net net = dnn::readNetFromCaffe(modelTxt, modelBin);

入力された画像は、前処理で、224x224にリサイズされ、平均値をひかれ、 Mat型のinputBlob に変換される。
Mat inputBlob = blobFromImage(img, 1, Size(224, 224),Scalar(104, 117, 123));

入力画像を設定
net.setInput(inputBlob, "data");

予測実行
Mat prob = net.forward("prob");

最高確率を有するクラスIDとその確率を取得
getMaxClass(prob, &classId, &classProb);

後処理
クラスIDから、クラス名への変換

以上

OpenCV 3.3.0-rcのmakeのオプションを見てみた。


特に意味はありません。

はじめに

ccmakeでオプションを見てみたら、知らないものが追加されていたので、3.2.0の内容と比較し、追加されたものを拾ってみた。
項目は、”OpenCV 3.3.0-rcで追加されたCMakeフラグ” に記載されているものと同じである。(一部省略している)

比較したファイルは、ルートのフォルダーに置かれている、CMakeLists.txt である。

3.3.0-rc で追加されたもの

OCV_OPTION(WITH_CPUFEATURES        "Use cpufeatures Android library"        ON   IF ANDROID)
OCV_OPTION(WITH_HALIDE            "Include Halide support"                OFF)
OCV_OPTION(WITH_MFX                "Include Intel Media SDK support"        OFF   IF (UNIX AND NOT ANDROID) )
OCV_OPTION(WITH_ITT                "Include Intel ITT support"                ON   IF (NOT APPLE_FRAMEWORK) )
OCV_OPTION(BUILD_IPP_IW            "Build IPP IW from source"                NOT MINGW IF (X86_64 OR X86) AND NOT WINRT )
OCV_OPTION(BUILD_ITT            "Build Intel ITT from source"            NOT MINGW IF (X86_64 OR X86) AND NOT WINRT AND NOT APPLE_FRAMEWORK )
OCV_OPTION(OPENCV_CXX11            "Enable C++11 compilation mode"            OFF )
OCV_OPTION(ENABLE_GNU_STL_DEBUG    "Enable GNU STL Debug mode (defines _GLIBCXX_DEBUG)"        OFF IF ((NOT CMAKE_VERSION VERSION_LESS "2.8.11") AND CMAKE_COMPILER_IS_GNUCXX) )
OCV_OPTION(ENABLE_BUILD_HARDENING    "Enable hardening of the resulting binaries (against security attacks, detects memory corruption, etc)" OFF)


3.2.0から削除されたもの

OCV_OPTION(ENABLE_SSE        "Enable SSE instructions"        ON
OCV_OPTION(ENABLE_SSE2        "Enable SSE2 instructions"        ON
OCV_OPTION(ENABLE_SSE3        "Enable SSE3 instructions"        ON
OCV_OPTION(ENABLE_SSSE3        "Enable SSSE3 instructions"        OFF
OCV_OPTION(ENABLE_SSE41        "Enable SSE4.1 instructions"    OFF
OCV_OPTION(ENABLE_SSE42        "Enable SSE4.2 instructions"    OFF
OCV_OPTION(ENABLE_POPCNT    "Enable POPCNT instructions"    OFF
OCV_OPTION(ENABLE_AVX        "Enable AVX instructions"        OFF
OCV_OPTION(ENABLE_AVX2        "Enable AVX2 instructions"        OFF
OCV_OPTION(ENABLE_FMA3        "Enable FMA3 instructions"        OFF      

上記の代わりに3.3.0-rcで追加されたCPUまわり
# ========================= CPU code generation mode =========================
CPU_BASELINE
CPU_DISPATCH



追加された制御文

if(ANDROID AND WITH_CPUFEATURES)
  add_subdirectory(3rdparty/cpufeatures)
  set(HAVE_CPUFEATURES 1)
endif()

# --- Halide ---
if(WITH_HALIDE)
  include(cmake/OpenCVDetectHalide.cmake)
endif()

# ----------------------------------------------------------------------------
# Code trace support
# ----------------------------------------------------------------------------
if(CV_TRACE)
  include(cmake/OpenCVDetectTrace.cmake)
endif()

if(OPENCV_CXX11)
status("    C++11:" "YES")
endif()

CPUまわりは、正しく設定しないと高速化できないので、引き続き調べてみる
以上

2017年7月2日日曜日

OpenCV 3.3.0-rc で dnn を試してみた。 (I tried dnn with OpenCV 3.3.0-rc.)

dnn サンプル画像

はじめに

3.2では、contrib の扱いであった dnn モジュールが、3.3 では、coreに移動されるので試してみた。

サンプルの説明は、ここ に記載されているが 、まだ、周辺が整備されていないため、ソースとモデルデータが 404 not found となる。

サンプルコードの予定地

モデルデータの予定地

weightデータは、ダウンロードできる

しかたがないので、3.2 cotribのサンプルを試してみた

結果

caffe_googlenet.cpp:53:18: error: 'Blob' is not a member of 'cv::dnn'
 void getMaxClass(dnn::Blob &probBlob, int *classId, double *classProb)


3.2 contrib から API が変更されているようであり、本家のリリースを待つしかない
7/3 解決

メモ

dnn.cpp を覗いてみると、 blob という名の Mat に変更されていると思われる。

OpenCV 3.3.0-rc をubuntu 16.04 64bitでビルドした (built OpenCV 3.3.0-rc on ubuntu 16.04 64 bit)

tag 3.3.0-rc

はじめに

昨日OpenCV 3.3.0-rc版がリリースされていたので、試しにビルドしてみた時のメモ書き
makeのconfigrationgは3.1の時のものを使用している。
ソースは、ここからダウンロードし展開する。

zipファイルのサイズは、85M

展開後にbuild フォルダーを作成し、移動する。
cmakeのオプションを指定し、その後makeを行った。

3.1同様にTBB関連で多くの警告が表示される。



/usr/include/stdc-predef.h:59:1: warning: /home/opencv/opencv-3.3.0-rc/build/modules/core/precomp.hpp.gch/opencv_core_RELEASE.gch: not used because `TBB_USE_GCC_BUILTINS' is defined [-Winvalid-pch]

ビルドは問題なく通った。
ビルド後、ccmake でオプションを見てみると、見慣れないものが多数あり、役割が不明である。

補足(23:00追加)
早速、atinfinity さんがまとめを作られた。
OpenCV 3.3.0-rcで追加されたCMakeフラグ

メモ

build/libを覗いてみると、バージョンが3.2のままになっている。

libのバージョン

Keras 上で ResNet50 を使用して分類を試してみた。(I tried classification using ResNet50 on Keras.)


30.0%   steam_locomotive
20.1%   passenger_car
9.3%   toyshop
8.6%   electric_locomotive
8.5%   freight_car

はじめに

kerasの環境構築ができたので、指定したファイルのクラスを分類できるかを確認してみた。
前回は、モデルにVGG16を使用したが、今回は、ResNet50を使用した。

使用した環境は、前回と同じである。

変更点

VGG16のソースから2点修正した。
kerasのアプリケーションをVGG16からresnet50に、モデルにはResNet50を指定する。

from keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions

model = ResNet50(weights='imagenet')

結果

トーマスを試してみる。VGG16の結果は、

12.8%   pencil_sharpener
11.8%   forklift
6.4%   projector
5.3%   espresso_maker
2.6%   loudspeaker

 とうまく認識されなかったが、ResNet50では、蒸気機関車と認識されるようになった。

残念ながら横長の画像では、




28.3%   vacuum
13.9%   gas_pump
7.6%   totem_pole
4.8%   knee_pad
2.7%   pay-phone
と残念な結果であった。

メモ

weightは、最初の実行時に自動的にダウンロードされ、~/.keras/models の下に格納される。

 ファイル名は、
 resnet50_weights_tf_dim_ordering_tf_kernels.h5
 でサイズは、約103Mである。

2017年6月29日木曜日

少数のデータで強力な分類能力を有するモデルを作成してみる。 その3 (Building powerful image classification models using very little data. Part3)

kaggle 猫 特に意味はない

はじめに

ボトルネック特徴量を全結合層で分類することで90%の精度が出たが、過学習が発生した。
いくつかのパラメータを変えてみることで、一応値が落ち着いた。

パラメータの変更点

過学習を防ぐために、バッチサイズを16から100に変更した。
また入力画像のサイズを150から160に変更した。
これにより、ボトルネック特徴量は、4x4x512から5x5x512へと拡大した。
このパラメータで実行したところ、下記のようになり、落ち着いたものとなった。

ボトルネック特徴量の学習結果

第3ステップ

第3ステップとして、CNN 層のパラメータも学習するように、転移学習を試してみた。
ソースは、オリジナルのものをコピーしたが、 Keras 2 対応と記載されているが、2ヶ所間違いがある。

75行目
model.add(top_model)
は、エラーとなるので、
model = Model(inputs=base_model.input, outputs=top_model(base_model.output))
に修正する。

また、110行めの
model.fit_generator(
    train_generator,
    samples_per_epoch=nb_train_samples,
    epochs=epochs,
    validation_data=validation_generator,
    nb_val_samples=nb_validation_samples)

の引数は、

samples_per_epoch=nb_train_samples // batch_size
nb_val_samples=nb_validation_samples // batch_size

のようにbatch_sizeで割る必要がある。

注意点

・全結合層の初期値は、第2ステップの結果を使用したほうが精度がよい
・学習率を小さくし、SGD を使用したほうがよい
・ステップ2と同じモデルを採用し、ステップ2の重みを使用しているので、ステップ2を変更した場合、3への影響を確認すること。

結果

グラフを見ると 過学習と思われるので、これも何らかの対策が必要であろうと思われる。

転移学習の結果