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の値が等しいものである。

以上