cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCV3.4.2で始める浅いディープラーニング (その4 セマンテックセグメンテーション)

(編集中)

2.example_dnn_segmentation.exe

意味づけ領域塗分け

Use this script to run classification deep learning networks using OpenCV.
Usage: example_dnn_classification.exe [params]

--backend (value:0)
Choose one of computation backends: 0: automatically (by default), 1: Halide language (http://halide-lang.org/), 2: Intel's Deep Learning Inference Engine (https://software.intel.com/openvino-toolkit), 3: OpenCV implementation
-c, --config
Path to a text file of model contains network configuration. It could be a file with extensions .prototxt (Caffe), .pbtxt (TensorFlow), .cfg (Darknet)
--classes
Optional path to a text file with names of classes.
-f, --framework
Optional name of an origin framework of the model. Detect it automatically if it does not set.
-h, --help
Print help message.
--height
Preprocess input image by resizing to a specific height.
-i, --input
Path to input image or video file. Skip this argument to capture frames from a camera.
-m, --model
Path to a binary file of model contains trained weights. It could be a file with extensions .caffemodel (Caffe), .pb (TensorFlow), .t7 or .net (Torch), .weights (Darknet)
--mean
Preprocess input image by subtracting mean values. Mean values should be in BGR order and delimited by spaces.
--rgb
Indicate that model works with RGB input images instead BGR ones.
--scale (value:1)
Preprocess input image by multiplying on a scale factor.
--target (value:0)
Choose one of target computation devices: 0: CPU target (by default), 1: OpenCL, 2: OpenCL fp16 (half-float precision), 3: VPU
--width
Preprocess input image by resizing to a specific width.

実行例

ENet

Enet-model-best.netというファイルはあるのだけれど、使い方が分からない・・・。

FCN8s

example_dnn_segmentation.exe --model=fcn8s-heavy-pascal.caffemodel --config=fcn8s-heavy-pascal.prototxt --scale=1.0 --width=500 --height=500 --mean=0 0 0 --input=dog416.png

f:id:cvl-robot:20180719220835p:plain

classesに与える適切なファイルが分からない。色分けは21色でされるのに、おそらく対応するラベルファイルのobject_detection_classes_pascal_voc.txtの登録数が20なので数が合わないとして無視される。仕方ないので、segmentation_classes_pascal_voc.txtをobject_detection_pascal_voc.txtのコピーとして作って、頭に一行「Unlabeled」を足す。

example_dnn_segmentation.exe --model=fcn8s-heavy-pascal.caffemodel --config=fcn8s-heavy-pascal.prototxt --scale=1.0 --width=500 --height=500 --mean=0 0 0 --input=dog416.png --classes=segmentation_classes_pascal_voc.txt

f:id:cvl-robot:20180719225943p:plain

OpenCV3.4.2で始める浅いディープラーニング (その5 クラス分類)

(編集中)

3.example_dnn_classification

物体のクラス分類

Use this script to run classification deep learning networks using OpenCV.
Usage: example_dnn_classification.exe [params]

--backend (value:0)
Choose one of computation backends: 0: automatically (by default), 1: Halide language (http://halide-lang.org/), 2: Intel's Deep Learning Inference Engine (https://software.intel.com/openvino-toolkit), 3: OpenCV implementation
-c, --config
Path to a text file of model contains network configuration. It could be a file with extensions .prototxt (Caffe), .pbtxt (TensorFlow), .cfg (Darknet)
--classes
Optional path to a text file with names of classes.
-f, --framework
Optional name of an origin framework of the model. Detect it automatically if it does not set.
-h, --help
Print help message.
--height
Preprocess input image by resizing to a specific height.
-i, --input
Path to input image or video file. Skip this argument to capture frames from a camera.
-m, --model
Path to a binary file of model contains trained weights. It could be a file with extensions .caffemodel (Caffe), .pb (TensorFlow), .t7 or .net (Torch), .weights (Darknet)
--mean
Preprocess input image by subtracting mean values. Mean values should be in BGR order and delimited by spaces.
--rgb
Indicate that model works with RGB input images instead BGR ones.
--scale (value:1)
Preprocess input image by multiplying on a scale factor.
--target (value:0)
Choose one of target computation devices: 0: CPU target (by default), 1: OpenCL, 2: OpenCL fp16 (half-float precision), 3: VPU
--width
Preprocess input image by resizing to a specific width.

実行例

GoogLeNet

example_dnn_classification.exe --model=bvlc_googlenet.caffemodel --config=bvlc_googlenet.prototxt --scale=1.0 --width=224 --height=224 --mean=104 117 123 --classes=classification_classes_ILSVRC2012.txt

f:id:cvl-robot:20180719214207p:plain

SqueezeNet

example_dnn_classification.exe --model=squeezenet_v1.1.caffemodel --config=squeezenet_v1.1.prototxt --scale=1.0 --width=227 --height=227 --mean=0 0 0 --classes=classification_classes_ILSVRC2012.txt

今日のOffice付きノートPC

他社のPCに比べて、Officeの値段分だけ安い印象。プライムセールで買うと少し安かった。マイクロソフトのハードウェアは素晴らしい、ハードウェアは。

OpenCV3.4.2で始める浅いディープラーニング (その6 その他のexample)

(編集中)
順番がいきなり(その6)になってますが、気にしないでください。
その他のexampleの実行方法を確認していきます。

4.example_dnn_openpose.exe

人体の骨格認識をしてくれます。入力は2次元画像で、出力も2次元です。

A sample app to demonstrate human or hand pose detection with a pretrained OpenPose dnn.
Usage: example_dnn_openpose.exe [params]

-h, --help (value:false)
print this help message
--height (value:368)
Preprocess input image by resizing to a specific height.
-i, --image
(required) path to image file (containing a single person, or hand)
-m, --model
(required) model weights, e.g. hand/pose_iter_102000.caffemodel
-p, --proto
(required) model configuration, e.g. hand/pose.prototxt
-t, --threshold (value:0.1)
threshold or confidence value for the heatmap
--width (value:368)
Preprocess input image by resizing to a specific width.

実行例

example_dnn_openpose.exe --model=openpose_pose_coco.caffemodel --proto=openpose_pose_coco.prototxt --image=googlenet_0.png

f:id:cvl-robot:20180719211646p:plain

5.example_dnn_colorization.exe

グレースケールの画像の自動色付け。

This sample demonstrates recoloring grayscale images with dnn.
This program is based on:
http://richzhang.github.io/colorization
https://github.com/richzhang/colorization
Download caffemodel and prototxt files:
http://eecs.berkeley.edu/~rich.zhang/projects/2016_colorization/files/demo_v2/colorization_release_v2.caffemodel
https://raw.githubusercontent.com/richzhang/colorization/master/colorization/models/colorization_deploy_v2.prototxt

Usage: example_dnn_colorization.exe [params]

-h, --help (value:true)
print this help message
--image (value:space_shuttle.jpg)
path to image file
--model (value:colorization_release_v2.caffemodel)
model weights
--opencl
enable OpenCL
--proto (value:colorization_deploy_v2.prototxt)
model configuration

実行例

example_dnn_colorization.exe

f:id:cvl-robot:20180719210619p:plain

6.example_dnn_text_detection.exe

文字検出。日本語も。

Use this script to run TensorFlow implementation (https://github.com/argman/EAST) of EAST: An Efficient and Accurate Scene Text Detector (https://arxiv.org/abs/1704.03155v2)
Usage: example_dnn_text_detection.exe [params]

-h, --help
Print help message.
--height (value:320)
Preprocess input image by resizing to a specific height. It should be multiple by 32.
-i, --input
Path to input image or video file. Skip this argument to capture frames from a camera.
-m, --model
Path to a binary .pb file contains trained network.
--nms (value:0.4)
Non-maximum suppression threshold.
--thr (value:0.5)
Confidence threshold.
--width (value:320)
Preprocess input image by resizing to a specific width. It should be multiple by 32.

実行例

example_dnn_text_detection.exe --model=frozen_east_text_detection.pb

f:id:cvl-robot:20180719210251p:plain

今日の本文

Jazzを爆音で聴きたくなる。石塚先生の漫画にはハズレが無い!

OpenCV3.4.2で始める浅いディープラーニング (その1 インストールからexample_dnn_object_detection.exeを動かすまで)

最近はDeep Learningを使うと、オシャレなんだそうです。でも面倒くさい勉強は極力したくありません。OpenCVのdnnモジュールが、3.4.2ぐらいからレギュラー扱いで本体に吸収されたそうなので、お手軽にこれを使ってみたいと思います。

1.インストール

OpenCV3.4.2以降のソースコードを用意します。ここではgithubに上がっているmaster版[1]を使おうと思います。開発環境は、Windows10のMSVC2015です。[1]-[3]の3つをダウンロードして、例えばc:\workspaceなどに同じフォルダに並べて置きます。

1.2 cmakeとビルド

CMakeを普通に通してビルドします。CMakeの設定の例は次の通りです。

Where is the source code: c:\workspace\opencv\sources
Where to build the binaries: c:\workspace\opencv\build

  • [check] BUILD_EXAMPLES
  • OPENCV_EXTRA_MODULES_PATH c:\workspace\opencv_extra\modules
1.2.1 [OpenCV 3.4.2限定] object_detection.cppのnmsを直す

zipファイルで配布されているopenCV3.4.2のsampleのソースコードには、なんかしょうもないタイポがありますので、これを直します。
c:\opencv342\sources\samples\dnn\object_detection.cppの25行目const char* keys の設定の中でthrとなっているのをnmsにします。

"{ thr | .4 | Non-maximum suppression threshold. }"

"{ nms | .4 | Non-maximum suppression threshold. }"

1.3 必要なファイルを準備

1.3.1 実行ファイルのコピー

buildした結果のexeファイルやdllファイルを、データファイルがあるopencv_extraフォルダの中にコピーして放り込みます。

  • example_dnn_text_detection.exe
  • example_dnn_segmentation.exe
  • example_dnn_openpose.exe
  • example_dnn_object_detection.exe
  • example_dnn_colorization.exe
  • example_dnn_classification.exe

と、


c:\workspace\opencv_extra
にコピーします。

1.3.2 dnn用のモデルのダウンロード

opencv_extraのなかにモデルダウンロード用のpythonスクリプトがありますので、これをダブルクリックして実行します。
> download_models.py
大きなファイルを沢山ダウンロードしますので、30~1時間ぐらいの時間がかかる場合があります。

1.3.3 ラベルファイルのコピー

c:\workspace\opencv\sources\samples\data\dnnの下にある物体の名前リストが書かれたtxtファイル5個をすべてopencv_extraフォルダにコピーして持ってきます。

  • classification_classes_ILSVRC2012.txt
  • enet-classes.txt
  • object_detection_classes_coco.txt
  • object_detection_classes_pascal_voc.txt
  • object_detection_classes_yolov3.txt

1.4 何も分からないまま、dnnの物体検出をテスト

コマンドプロンプトを開いて、次のスクリプトを実行するか、txtエディタでobject_detection.bat等の適当な名前でバッチファイルを作ります。
PCに適当なUSBカメラをつないでおいてください。

example_dnn_object_detection.exe --model=yolov3.weights --config=yolov3.cfg --scale=0.00392 --width=416 --height=416 --mean=0 0 0 --rgb --classes=object_detection_classes_yolov3.txt

USBカメラが無い場合は、適当な画像ファイルを入力に指定してください。

--input=source.jpg

scaleやwidthやheightやmeanなどの謎パラメータはmodel毎に異なるそうなので、[4]を参考に使いたいモデルに合わせて調整してください。パラメータの簡単な説明は[5]の中のYOLO DNNsにありますが、プログラム実行ファイルが表示してくれるhelpを見た方が分かり易いです。

実行結果はこんな感じ。Intel Core i7-4770SのCPU実行で1fpsぐらいの速度です。
f:id:cvl-robot:20180719195022p:plain
confidenceは、認識結果の確信度の閾値で50%以上の自信がある結果だけを表示します。
なんか知らんけど、机の前に座ってる特定のpersonだけ認識結果が悪い。。。

用語が分からない

dnn関係の説明で、CaffeとかCOCOとかYoloとかRNNとかResNetとか良く分からない単語がいっぱい出てきます。次から次へと新しい言葉が出てきて、何のことだかすぐわからなくなっちゃうので、次回はこれを整理したいと思います。(慣れている人なら、[6]を見れば直ぐに分かります)

今日の英語

英語が全然分からないので、勉強しなおしています。この本が短くて明瞭でとても良かった!
あとは、覚えるだけ!(夏の終わりか、テスト前)

サバイバル英文法 「読み解く力」を呼び覚ます (NHK出版新書)

サバイバル英文法 「読み解く力」を呼び覚ます (NHK出版新書)

xmlrpc for c and c++(xmlrpc-c)をWindows10, openFrameworks環境で使う

XML-RPCは古いインターフェースですが、Pythonの標準ライブラリでサーバーが簡単に作れるので、C++からPythonを呼び出したい時など、時と場合によっては便利に使えます。以前libxmlrpc++を紹介したことがありますが、今回のはxmlrpc for c and c++(xmlrpc-c)です。違いは、xmlrpc-cは非同期(Asynch≒non-blocking)に対応していること(ただしインターフェースは洗練されていない)です。

CMakeサポート版のフォーク xmlrpc-c

github.com
個人のgraugansさんが作られたもので、5か月ぐらい前が最終更新のタイムスタンプです。
HTTP用の外部ライブラリが必要で、

  • Curl
  • Libwww
  • Wininet

から選んで使います。Curlが推奨されていますが、Windowsでは標準で使えるWininetでも特に問題は感じません。ここでは、Wininetを使うことにします。

CMakeLists.txtを編集

どのライブラリを選択してもfindCurlを必ず呼んでここで引っかかってしまうので、コメントアウトしてしまいます。乱暴なことをしていますので、何があっても責任取れません。自分で判断して使ってください。

#find_package(CURL ${tmp})
#ensc_set_bool(MUST_BUILD_CURL_CLIENT ${CURL_FOUND} "Set if Curl client transport shall be built")

あとは普通にcmakeでconfigureとgenerateしてプロジェクトを作ってください。

build

普通にビルドをすると半分ぐらいビルドできますが、半分ぐらいエラーで落ちます。適当にCMakeLists.txtを適当に編集したためにMUST_BUILD_CURL_CLIENTの定義が抜けてしまっているためです。次のように修正します。
transport_config.h

/* -*- c -*- */
#define MUST_BUILD_WININET_CLIENT	1
#define MUST_BUILD_LIBWWW_CLIENT	0
#define MUST_BUILD_CURL_CLIENT		0 //////

bin, include, libを集める

出力ファイルは何故かあちこちにバラバラに配置されています。

cライブラリは、build/src/ReleaseもしくはDebugに.dllと.libがあります。
c++ライブラリは、build/src/cpp/Release もしくはDebugに.dllと.libファイルがあります。
xmlrpc_util.dllとxmlrpc_util.libは、build/lib/libutil/ReleaseもしくはDebugにあります。

includeファイルは、include/xmlrpc-cにあります。
config.hは、build/include/xmlrpc-cにあります。

自分の都合の良いように、適当なフォルダの中にそれぞれ放り込んでください。

サンプルプログラム

たとえば非同期クライアントを動かしてみます。Curlを使っていませんので、Curl対応の関数を読んでいるところをwininet用関数に置き換えます。
https://sourceforge.net/p/xmlrpc-c/code/HEAD/tree/trunk/examples/cpp/asynch_client.cpp

//xmlrpc_c::clientXmlTransport_curl myTransport;
xmlrpc_c::clientXmlTransport_wininet myTransport;

Resultが構造体だったりArrayだったりするときのデータ受け取り方法

xmlrpc++はとてもスマートに直感的にかけたのですが、xmlrpc-cは残念ながらいまいちです。返り値が構造体の場合は、下記のようにデータを解釈させます。

構造体受信の例

jntという名前のdouble型arrayが入っている構造体の受信例です。

	string const serverUrl("http://192.168.0.11:4321");
	string const methodName("get_joint");

	xmlrpc_c::clientSimple myClient;
	xmlrpc_c::value result;

	myClient.call(serverUrl, methodName, "", &result);

	xmlrpc_c::value_struct s(result.cValue());
	xmlrpc_c::value_array a(s.cvalue()["jnt"]);
	for (int i = 0; i < 6; i++) {
		joint[i] = xmlrpc_c::value_double(a.cvalue()[i]);
	}

構造体送信の例

	xmlrpc_c::clientXmlTransport_wininet myTransport;
	xmlrpc_c::client_xml myClient(&myTransport);

	string const methodName("move_joint");

	xmlrpc_c::carray a;
	for (int i = 0; i < 6; i++) {
		a.push_back(xmlrpc_c::value_double(joint[i]));
	}

	xmlrpc_c::cstruct s;
	s.insert(std::make_pair<std::string, xmlrpc_c::value>("", xmlrpc_c::value_array(a)));

	xmlrpc_c::paramList sampleAddParms1;
	sampleAddParms1.add(xmlrpc_c::value_struct(s));

	xmlrpc_c::rpcPtr rpc1P(methodName, sampleAddParms1);
	string const serverUrl("http://192.168.0.11:4321");

	xmlrpc_c::carriageParm_curl0 myCarriageParm(serverUrl);
	rpc1P->start(&myClient, &myCarriageParm);

		
	myClient.finishAsync(xmlrpc_c::timeout(100));

今日のノートPC

アマゾン専売のMSIの軽量14インチノート。11万円ぐらいでGeForceMX150搭載。自宅用はもうこれで良いね。
[asin:B07D8PJBGS:detail]
[asin:B07FB27SNB:detail]

自分用読むべき論文メモ 2018年07月版


RealSenseD400シリーズと組み合わせてKinect2の人体認識の代替に使えそうな有料ライブラリ。30$/センサーなので十分安い。

qiita.com
画像処理を高速化できる(2~10倍ぐらい見込める)Halide言語について。

今日のコンピュータビジョン

各章、とてもよくまとまっていて読みやすい。

メモ:OpenGLの描画結果のデプスバッファから距離情報を復元する方法

OpenGLの描画結果のデプス値を単位を直して画像データとして取得するサンプル。詳細は[1]を参照のこと。
1. glReadPixelsでデプスバッファのデータを読み込み
2. nearClipとfarClipでデプス値を正規化
3. 上下反転されているので入れ替え

ofPixels pix;
pix.allocate(ofGetWidth(), ofGetHeight(), OF_IMAGE_COLOR);
double depth_scale = 1000.0;

std::vector<float> depth_image;
depth_image.resize(ofGetWidth() * ofGetHeight());

glReadPixels(0, 0, ofGetWidth(), ofGetHeight(), GL_DEPTH_COMPONENT, GL_FLOAT, depth_image.data());

double z_near = cam.getNearClip();
double z_far = cam.getFarClip();

for (int i = 0; i < ofGetHeight(); i++) {
	for (int j = 0; j < ofGetWidth(); j++) {
		double z_depth = 2.0 * z_near * z_far /
			(z_far + z_near - (2.0 * (double)depth_image[(ofGetHeight() - i - 1) * ofGetWidth() + j] - 1.0) *
			(z_far - z_near));
			uint16_t p = (uint16_t)std::min(std::round(depth_scale * z_depth), (double)INT16_MAX);

			pix.setColor(j, i, ofColor((float)p / 255, (float)p%255, 0));
	}
}

[1] Open3D Visualization
github.com

今日の座布団

安い椅子での長時間の座り仕事で、お尻が痛くなります。そんな時にはこれ。ちょっと暑いけど。