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である。