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

以上