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まわりは、正しく設定しないと高速化できないので、引き続き調べてみる
以上