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への影響を確認すること。

結果

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

転移学習の結果

2017年6月28日水曜日

OpenCV 3.3 のリリース予定が公表された。

マイルストーン


6/27日の会議メモでは、3.3のリリースは7月の中旬と記載されていたが、マイルストーンを見ると
3.3-rcが6/30日、3.3が7/7日に予定されている。

また、会議メモに

・Major news is that DNN Module is moving out of opencv_contrib
 joining the core of OpenCV in this uppcoming release 3.3

とあり、来るべき3.3のリリースにむけDNNモジュールをコアに移動したとのこと

早速マスターのモジュールを見てみるとDNNが2日前に作成されていた。

マスターブランチ core モジュール

今回DNNは、インテルの強力により、CPU、GPU上で効果的に動作するとのこと。

以上

2017年6月27日火曜日

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

学習経過

はじめに

VGG16のCNNを利容して、特徴量を作成し、新規に全結合層を定義して、分類を行う方法を試してみた。その時課題とし、参考にした2つのWEBページのプログラムの記載が異なっており、どちらが正しいか、判断できなかった。
その後、試行錯誤により、どちらが正しいか判別したので、それを記載する。

また、途中経過の精度と誤差を保持する手段がわかり、matplotlib で描画させてみたので、それも記載しておく。

見つかった課題

プログラムにより、特徴量を作成するジェネレータで指定するデータ量を、

1 バッチサイズ(16)で割る
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)

2 学習用データサイズそのままを指定している
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples)

とあり、どちらが正しいか判断つかなかった。

bottleneck_features_train の配列のサイズを表示されて見ると
1 が 2000個で 2 が 32000個だった。

それゆえ1の バッチサイズで割るほうが正しいと判断し、1のコードで再度計算を行った。

記録

1エポック終了ごとに、学習データ、検証データそれぞれの、精度と誤差の値を記録するには、
model.fit関数の戻り値をすればよい。

history = model.fit(....

また、上記データでグラフを描画するには、以下のようなコードを使用する。

  print(history.history.keys())

  plt.plot(history.history['acc'])
  plt.plot(history.history['val_acc'])
  plt.title('model accuracy')
  plt.ylabel('accuracy')
  plt.xlabel('epoch')
  plt.legend(['train', 'test'], loc='upper left')
  plt.show()

  plt.plot(history.history['loss'])
  plt.plot(history.history['val_loss'])
  plt.title('model loss')
  plt.ylabel('loss')
  plt.xlabel('epoch')
  plt.legend(['train', 'test'], loc='upper left')
  plt.show()

このプログラムの実行結果は、最初に掲載したグラフとなるが、今回明らかに過学習していることが分かる。

drop outの数を増やしてみたが結果は、ほとんど代わらなかった。

過学習の対策は、今後の課題とする。

以上

2017年6月25日日曜日

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

kaggle cat  特に意味はない

はじめに

表題のとおり、少ないデータで識別能力の高いモデルを作成してみる。オリジナルは、この記事。それと、オリジナルを参考にした "VGG16のFine-tuningによる犬猫認識" の記事を TensorFlow 1.2 + keras 2.0.5 上で再現を試みる

今回は、第2段としてBottleneck 特徴量を使用した分類を試してみた。

Bottleneck 特徴量は、VGG16のモデルを使用し作成するが、最終段の1000クラス分類用の全結合層は使用しない。代わって新たに、2クラス分類用に結合層を定義し直し、この部分のみ学習させることとなる。

新たに定義された全結合層

プログラムの構成

プログラムは2つのパートに分けられ、1つは、VGG16を使用し、ボトルネック特徴量を作成する部分である。抽出された特徴量は、ファイル名 bottleneck_features_train.npy で一旦保存される

また、検証用データの特徴量も合わせて計算され、ファイル名bottleneck_features_validation.npy で同様に保存される

もう一つは、定義した全結合層を、最初に作成したボトルネック特徴量のファイルを入力として学習する部分である。モデルの重みデータは、bottleneck_fc_model.h5 として保存される。

結果

プログラムは、オリジナルのプログラムを若干修正したもので試している。
今回学習は数分で終了した。検証用データの正答率は、89.7%であった。

学習結果  

課題

オリジナルでは、特徴量を作成するジェネレータで指定するデータ量を、バッチサイズ(16)で割っていたが、
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)

aidiary さんのサンプルでは、学習用データサイズそのままを指定している
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples)

これのどちらが正しいのか判断できないので、修行が必要である。

2017年6月24日土曜日

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

オリジナルモデル

はじめに

表題のとおり、少ないデータで識別能力の高いモデルを作成してみる。オリジナルは、この記事
また、この記事をベースとした日本語版 VGG16のFine-tuningによる犬猫認識 の記事

最初に、日本語版をみて概要を掴み、オリジナルの記事に従って順番に試していくのがよいと思う。

この記事では、データのオーギュメンテーションの方法を最初に説明し、3段階のステップを踏んで、80%,90%,95%と正答率を向上さえてゆく。

オーギュメンテーションの方法は、別の機会とし、最初は、フルスクラッチのモデルを試してみた。
上部の画像は、モデルの構成を出力したのである。

準備

kaggleに登録し、ここから学習用データをダウンロードする

学習には、オリジナル記事の用なフォルダー構成と画像データを必要とする。
上記記事の作者がスクリプトを提供してくれているのでありがたく使用させていただいた。

画像の分類を終えたなら、オリジナルに掲載されている、コードをそのまま写経し実行する。

当方の構成では、最初のエポックをのぞき1回のエポックに11秒かかった。
50エポックにかかった時間は、約10分であった。正答率は79%となった。

学習時の正答率

このデモを実行しても、上記の用に学習の経過が表示されるだけであり、実行結果は、重みとして最後に保存される。
日本語版の記事では、途中の経過をhistoryに記録するように修正されている。

メモ

なお、オリジナルは、3月に修正されKeras 2.0のAPIにあわせて書き直されている。

Note: all code examples have been updated to the Keras 2.0 API on March 14, 2017. You will need Keras version 2.0.0 or higher to run them.


日本語版は、keras 1.2なので注意

第2段階は次回に

2017年6月22日木曜日

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

kaggle_cat 特に意味はない

はじめに

kerasの環境構築ができたので、指定したファイルのクラスを分類できるかを確認してみた。
今回、 "KerasでVGG16を使う" を参考にさせていただいた。

使用した環境
ubuntu            16.04.2
cuda            8.0.61
cudnn            5.1.10
TensorFlow-gpu     1.2.0
keras            2.0.5

変更点

実行に当たっては、 jupyter notebook を使用しているため、オリジナルから2点修正している

1 ファイル名は引数ではなく、直接埋め込み
    filename = "cat001.jpg"

2 日本語注釈に対応するため、utf-8 用の宣言を冒頭に挿入
    # -*- coding: utf-8 -*- 

さらに、結果に関しては、ラベル名と確率を整えて表示している。
    print result[1], "{0:.3f}".format(result[2])

結果

比較対象としてDarknet-GPUの結果を合わせ記載しておく

p27.png
kares
  king_penguin         1.000
  goose             0.000
  American_coot     0.000
  albatross         0.000
  black_swan         0.000

darknet
  99.99%: king penguin
  0.00%: killer whale
  0.00%: drake
  0.00%: toucan
  0.00%: magpie


p5.png

keras
  vacuum             0.163
  chain_saw         0.094
  parking_meter     0.094
  totem_pole         0.089
  space_shuttle     0.073

darknet
  7.67%: projector
  7.03%: paper towel
  4.99%: barbell
  4.00%: vacuum
  3.21%: loudspeaker

メモ

最初の実行時にVGG16のモデルデータが自動的にダウンロードされる。
 格納場所は、 ~/.keras/models の下

 ファイル名は、
 vgg16_weights_tf_dim_ordering_tf_kernels.h5

2017年6月20日火曜日

GPU版の Darknet で ImageNet 分類を試してみた。(I tried ImageNet classification with Darknet GPU version.)

アドバイス

はじめに

先週(GPU版の)Darknet で ImageNet 分類を試してみたが、失敗してしまいCPU版なら分類することができた
今日、親切な sounansu さんが対処方法を教えてくれ、その方法を試したところ解決したので、メモしておく。

対処

cfg/extraction.cfg ファイルの開き、2行目のsubdivisionsの値を大きくしてみた

[net]
batch=128
subdivisions=4
height=224
width=224
max_crop=320
channels=3
momentum=0.9
decay=0.0005

初期値は1
値2では、out of memoryの発生する場所がかわり、値1の時より処理が進んでいた。
値3でも同様の、out of memoryが発生したが、さらに処理が進んでいた。
値4にしたところ、問題なく分類することができた。

結果


GPU
../work/p27.png: Predicted in 0.014197 seconds.
  99.99%: king penguin
  0.00%: killer whale
  0.00%: drake
  0.00%: toucan
  0.00%: magpie

CPU
./work/p27.png: Predicted in 4.877716 seconds.
  100.00%: king penguin
   0.00%: toucan
   0.00%: killer whale
   0.00%: albatross
   0.00%: anemone fish

ざっと350倍に速度が向上したが、スコアが若干異なっている。



GPU
../work/p5.png: Predicted in 0.016148 seconds.
  7.67%: projector
  7.03%: paper towel
  4.99%: barbell
  4.00%: vacuum
  3.21%: loudspeaker

CPU
../work/p5.png: Predicted in 6.501382 seconds.
  8.66%: dumbbell
  7.49%: toyshop
  5.21%: vacuum
  3.73%: projector
  3.64%: espresso maker

こちらは400倍に向上しているが、結果がまったく異なる。

CPU版 OpenPose のコンパイルと ドキュメントに関して (Compilation of CPU version OpenPose and related to OpenPose document)

ドキュメントより引用

はじめに

OpenPoseをCPU版のCaffe上で動作させようとしたが、GPU異存のコードがあることが分かり断念した経緯がある。

久しぶりにOpenPoseのGitHubを覗いてみたら気になる文字を見つけた。

modelsのフォルダーに    CPU rendering added の文字が

CPU rendering added

早速、OpenPoseのプロジェクト一式をダウンロードし、ソースを眺めてみると、確かに描画の関数が、GPU異存からCPUでの描画コードが追加されていた。

しかし、肝心のポーズの検出のところで、

            #ifndef CPU_ONLY
                spResizeAndMergeCaffe->Forward_gpu({spCaffeNetOutputBlob.get()}, {spHeatMapsBlob.get()});       // ~5ms
                cudaCheck(__LINE__, __FUNCTION__, __FILE__);
            #else
                error("ResizeAndMergeCaffe CPU version not implemented yet.", __LINE__, __FUNCTION__, __FILE__);
            #endif

を見つけてしまった。ここのコードは前回とまったく追加されていない。
優先順位が低いため、後回しにされていると考えよう。

OpenPose のドキュメント

ソースを覗いていたら、いくつかの説明用のドキュメントを見つけたのでメモしておく。

・リリースノート
 今は、1.0.0rc4予定のものとのこと
  CPU描画による3-5%速度向上

・コンパイルと、インストールの方法

・OpenPose Demoの概要
 デモプログラムの引数の説明

・OpenPose Libraryの概要

・OpenPose Demoの出力
 全体のボーン、顔特徴点、手のボーンのインデックス番号の説明

・OpenPose Libraryへのモジュールの追加

以上

2017年6月19日月曜日

Darknet CPU版で ImageNet 分類を試してみた。(I tried ImageNet classification with Darknet CPU version.)


ペンギン  
../work/p27.png: Predicted in 4.877716 seconds.
  100.00%: king penguin
   0.00%: toucan
   0.00%: killer whale
   0.00%: albatross
   0.00%: anemone fish

はじめに

Darknet は、 YOLO だけでなく、 ImageNet Classification や Nightmare などの機能も実現している。
前回は、 ImageNet Classification を試してみたが、残念ながら問題が生じたため実現できなかったが、今回GPU使用をあきらめ、CPU版で試したところ成功したので結果をまとめておく

分類の結果は、5位まで、名称と、確信度が表示される。なお1枚の画像(800x480)の処理時間は、約6秒である。

結果

画像の中で、一番スコアのよいオブジェクトが1位として示されるが、そのオブジェクトが画像内で必ずしも重要となるオブジェクトを示していないことが確認された。 

アニメ 壁画
../work/p8.png: Predicted in 6.397868 seconds.
 84.51%: half track
  3.55%: tank
  2.76%: bulletproof vest
  1.32%: military uniform
  1.20%: cannon



アニメ パネル

../work/p9.png: Predicted in 6.389466 seconds.
 66.33%: miniskirt
 13.29%: comic book
  4.42%: maillot (服 マイヨ?)
  2.65%: maillot
  1.11%: sock

トーマス

../work/p5.png: Predicted in 6.501382 seconds.
  8.66%: dumbbell
  7.49%: toyshop
  5.21%: vacuum
  3.73%: projector
  3.64%: espresso maker

電車

../work/p30.png: Predicted in 6.546478 seconds.
 67.88%: electric locomotive
 23.53%: passenger car
  8.54%: streetcar
  0.02%: trolleybus
  0.02%: freight car

例のマリオカート

../work/p12.png: Predicted in 6.518403 seconds.
 99.92%: go-kart
  0.07%: lawn mower (芝刈り機)
  0.01%: racer
  0.00%: golfcart
  0.00%: tricycle


大道芸

../work/p11.png: Predicted in 6.533132 seconds.
 66.37%: maze
  5.51%: go-kart
  3.21%: unicycle
  2.46%: sundial
  1.54%: jinrikisha

以上

2017年6月15日木曜日

Darknet で ImageNet 分類を試してみたが、失敗した。(I tried ImageNet classification with Darknet, but it failed.)

エラーメッセージ

はじめに

Darknet は、 YOLO だけでなく、 ImageNet ClassificationNightmare などの機能も実現している。

ImageNetは、1000クラスの分類用の画像データセットであり、Darknetは、このデータを学習に使用して、いくつかの学習済みモデルを提供している。

提供されているモデルは以下のものである。詳細は、説明ページの下段に記されている。


学習済みモデル

今回は、 ImageNet Classification を試してみたが、残念ながら問題が生じたため実現できなかった。
6/20 解決しました。

事前準備

wget http://pjreddie.com/media/files/extraction.weights

でモデルデータを取得する

実行コマンド

./darknet classifier predict cfg/imagenet1k.data cfg/extraction.cfg ../work/extraction.weights ../work/dog.jpg

実行結果は、画面上部の用なエラーが生じて中断される。

GPUボードは、GeForce GTX 1050Ti 8G を使用しているが、8Gでは、メモリが少ないと想像される。

学習の時は、バッチサイズを小さくするなど、何らかの対策が考えられたが、inferenceなのでメモリの減らす方法は浮かばない。

念のために他のモデル(darknet19、darknet19_448)でも試してみたが、いずれも、CUDA Error: out of memory で中断されてしまう。

以上

2017年6月14日水曜日

再 dlib 19.4 を ubuntu 16.04 上にインストールした。(I installed dlib 19.4 on ubuntu 16.04.)

レナのdlibの結果

はじめに

5/14日に書いた記事を再度書いてしまった。顔特徴点検出に関して記載しているので、消さないでおく。

顔特徴点検出機能で有名な dlib を ubunut 16.04上にインストールしたのでその手順をまとめておく。

ダウンロード
ここから右下の Download Dlib ボタンを押し、ファイルをダウンロードする
dlib-19.4.tar.bz2  ファイルサイズ約9M

展開してフォルダーを移動する
mkdir build;
cd build;

make作業

makeの事前準備としてOpenBlasをインストールしておく
 sudo apt-get install libopenblas-dev liblapack-dev

最初にAVSのパラメータを付与してcmakeを行うが、説明とことなりAVSは無視されているようだ。

 cmake .. -DUSE_AVX_INSTRUCTIONS=1

CMake Warning:
  Manually-specified variables were not used by the project:

    USE_AVX_INSTRUCTIONS



makeの実行
make -j4

顔特徴点検出用の辞書データ取得

 wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

 データサイズは 61M
ファイルの展開
 bzip2 -d shape_predictor_68_face_landmarks.dat.bz2


サンプルのビルド

顔検出のサンプルビルド

g++ -std=c++11 -O3 -I.. ../dlib/all/source.cpp -o face_detection.bin -lpthread -lX11 -ljpeg -DDLIB_JPEG_SUPPORT ../examples/face_detection_ex.cpp

顔特徴点検出のサンプルビルド

g++ -std=c++11 -O3 -I.. ../dlib/all/source.cpp -o face_landmark_detection.bin -lpthread -lX11 -ljpeg -DDLIB_JPEG_SUPPORT ../examples/face_landmark_detection_ex.cpp

デモプログラムの実行

顔検出

./face_detection.bin ../../work/2008_001322.jpg

顔特徴点検出

./face_landmark_detection.bin ../../work/shape_predictor_68_face_landmarks.dat ../../work/COCO_val2014_000000000395.jpg

関連ページ

 OpenCVで顔向き推定を行う

以上

2017年6月13日火曜日

いろいろな画像で OpenPose の顔特徴点検出機能を試してみた。(I tried face keypoint detection of OpenPose with various images)

レナで試した結果

はじめに

OpenPoseの顔特徴点検出機能をいくつかの画像で試した結果を記録したものである。
特徴点検出に関わるパラメータは、サンプルに記載されているデフォルトの値を使用している。

いくつかの画像で試してみた結果、顔特徴点の検出のロバスト性は高くないと思われるが、パラメータの調整により、ロバスト性を高めることが可能かと思われる。

最初に選んだ画像でまったく検出されていなかったので、ビルドに失敗したかと思い、何度も手順を繰り返してしまった。

関連するパラメータ

現時点では、顔特徴点検出に関わるパラメータは、 openpose.cpp の83行めだけである。

 DEFINE_string(face_net_resolution,      "368x368",

 説明では、320x320に変更すると検出速度が向上するとかかれている。逆に大きくすることで、速度を犠牲にし、精度が向上すると思われる。

メモ

GPUのメモリ不足のためのか、時折検出結果の画面が表示されない場合がある。
検出結果のファイルは保存されている。

ダメな例

銅像
アニメパネル

 一部検出

人のパネル
レゴ人形
以上

OpenPose の顔特徴点検出機能 を試してみた。(I tried face keypoint detection of OpenPose)

検出結果

はじめに

数日前に、追加が予定されていた顔特徴点の検出機能がリリースされた。
github から master を一式ダウンロードして、展開する。
基本的な設定は、ここに書いたものと同じであり、ここでは顔関連に関して記載する

モデルデータの取得

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

wget http://posefs1.perception.cs.cmu.edu/OpenPose/models/face/pose_iter_116000.caffemodel

によりモデルデータが取得される。

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

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

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

 DEFINE_bool(face,                       true,

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

 DEFINE_string(write_images,             "../work/test"


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

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

デモプログラムの実行

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

これにより、../work/testに保存されている画像すべて検出対象となる
結果は一瞬画面に表示される。停止させるには、スペースキーを押す
helpは、hキーを押せばよい

以上

2017年6月9日金曜日

Darknetのサンプルのソースを覗いてみた。(I looked into the sample source of Darknet.)

YOLO v2の結果 特に意味はない

はじめに

特定の引数を与えて、examples 内の darknet を起動させることで、YOLOを実行させることができる。説明では、

 ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

を実行するよう記載されている。一方、中段では、detect の引数は、下記と同じ結果になると説明されている。

 ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg

そこでサンプルプログラム内でどのような処理が行われているか、簡単に追ってみた。


第1引数がdetectの場合

内部では、下記の用な処理により、引数を追加し、関数test_detectorを呼び出している。
しきい値、結果の保存ファイル、フルスクリーンの指定がオプションである。

        float thresh = find_float_arg(argc, argv, "-thresh", .24);
        char *filename = (argc > 4) ? argv[4]: 0;
        char *outfile = find_char_arg(argc, argv, "-out", 0);
        int fullscreen = find_arg(argc, argv, "-fullscreen");
        test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);

  cfg/coco.data は、固定の値

第1引数、第2引数がdetector testの場合

引数そのままで、関数
 run_detector(argc, argv);
 を呼び出している

それぞれの関数の実態は、
darknet-master/examples/detector.c
に定義されている。

関数の実態

test_detector()

関数内で再度パラメータを準備、ネットワークや重みを読み込み、最後に
network_predict(net, X);
で検出を行っている。

run_detector()

与えられたパラメータを解析し、最後に第2引数を調べ、test_detectorを呼び出している。

    if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);

YOLOの検出と分類機能に特化すれば、これらのソースから不要なコードを削除でき、すっきりさせることができそうである。

以上

TensofFlow版のSSDを試してみた。(I tried SSD (Single Shot MultiBox Detector) with TensorFlow)

検出結果

はじめに

SSD (Single Shot MultiBox Detector)は、特定の物体の検出と分類を同時に行うアルゴリズムである。
どのようなアルゴリズムかは、スライド SSD: Single Shot MultiBox Detector が参考になる

本来Caffeをベースに開発されたが、諸事情によりTensorFlow版を試してみた。
ベースのTensorFlowの環境は
 cuda 8
 cuDNN 5.1
 Tensorflow 1.1
である。

ソースの取得と展開

ここから一式をダウンロードする。

展開すると
SSD-Tensorflow-masterというフォルダーが作成される。

モデルデータの展開

./checkpoint に移動し、ssd_300_vgg.ckpt.zipを展開する

準備

notebooksに移動し、ssd_notebook.ipynb を修正する。

65行目の
from notebooks import visualization を
import visualization に変更する

また、オリジナルのCaffeから
run_jupyter.sh、jupyter_notebook_config.py をコピーする。

 jupyter_notebook_config.py は /root/.jupyter/ に
 run_jupyter.sh は /opt/SSD-Tensorflow-master/notebooks/ に

起動

./run_jupyter.sh --allow-root
を実行するとJupyter Notebookが起動する。

ssd_notebook.ipynb を選択し、cell から Run All を実行する。

ラベル名

補足このデモでは、検出結果がindexで表示されているので正解なのか分かりにくい

ラベルを探してみると
SSD-Tensorflow-master/datasets/pascalvoc_common.py
のファイルに20クラスが定義されている。   

VOC_LABELS = {
    'none': (0, 'Background'),
    'aeroplane': (1, 'Vehicle'),
    'bicycle': (2, 'Vehicle'),
    'bird': (3, 'Animal'),
    'boat': (4, 'Vehicle'),
    'bottle': (5, 'Indoor'),
    'bus': (6, 'Vehicle'),
    'car': (7, 'Vehicle'),
    'cat': (8, 'Animal'),
    'chair': (9, 'Indoor'),
    'cow': (10, 'Animal'),
    'diningtable': (11, 'Indoor'),
    'dog': (12, 'Animal'),
    'horse': (13, 'Animal'),
    'motorbike': (14, 'Vehicle'),
    'person': (15, 'Person'),
    'pottedplant': (16, 'Indoor'),
    'sheep': (17, 'Animal'),
    'sofa': (18, 'Indoor'),
    'train': (19, 'Vehicle'),
    'tvmonitor': (20, 'Indoor'),
}

rclasses の値を取得し、
print VOC_LABELS[index]
でクラス名を表示できる。

上記デモ画像は、
2、7、12でそれぞれ、自転車、車、犬と正解である。

2017年6月8日木曜日

Intel版 OpenCV についてのメモ

インテルの説明図から引用

 

はじめに

OpenCVのブランチプロジェクトの1つとしてIntel版のOpenCVがある。

Intel版のOpenCVは、Intel Computer Vision SDK に含まれている。
OpenCV 3.2版のビルド済みのものが提供されいる。

サポートOS 64bit
Ubuntu* 14.04
CentOS* 7.2

顔検出用のAPI

説明はここ (6/9 リンク先修正)

・Face Detection
・Blink Detection
・Smile Detection
・Face Recognition

サンプルコード (6/9 追加)

ここに顔を検出し、IDを付与し追跡するサンプルコードが掲載されている。

 fd->setTrackingModeEnabled(true);
 fr->setTrackingModeEnabled(true);

顔検出クラスと、顔識別クラスに追跡用の関数が準備されている。

スターガイド

ここからダウンロード
事前の準備と、インストール手順が記載されている。

メモ
OSのバージョンが違うし、NVIDIAのドライバーとコンフリクトが生じないか不明である。

2017年6月7日水曜日

YOLO v2 でいろいろな画像を試してみた。(Detected bones of various images with YOLO v2)

1 例のマリオカート

はじめに

YOLO v2がビルドできたので、検出能力を試すためのに、OpenPoseで使用した同じ画像を対象に、人の検出がどれくらいできるのか試してみた。
比較対象のOpenPoseは、ここ

使用例

重みデータとサンプル画像は、workファイルに格納されている。

./darknet detect cfg/yolo.cfg ../work/yolo.weights ../work/dog.jpg

実行すると、画面表示とともに、predictions.jpgとしてファイルに検出結果が保存される。

検出例

説明をクリックすると別が面に大きな画像が表示されます。
2 大道芸
3 人のパネル
4 アニメパネル
5 銅像
6 レゴ人形
7 トップハム・ハット卿とトーマス
8 アニメパネル2
9 アニメ壁画