cvl-robot's diary

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

安価なIMU(AHRS)センサのBosch BNO055USBStickを試す(その2)

BNO055USBStickを自分のプログラムから使う方法が良く分からなくて途方に暮れていた時に、GitHub先生に聞いてみたら、yoshito-n-studentssさんのすごくきれいなソースコードのROS向けライブラリが見つかりました。MITライセンスとのことなので、ありがたく遠慮なく使わせてもらうことにして、不要なROSを外していきます。
GitHub - yoshito-n-students/bno055_usb_stick: A ROS driver of Bosch BNO055 USB Stick

ソースコード

フォークしたROS無し版ソースコードはこちらです。
github.com
github.com
Makeファイル、CMake等用意していませんので、適当に取り込んでください。外部ライブラリはBoostのみです。

実行結果

接続先はCOM3、通信速度115200bps決め打ちなので、適宜変更してください。特にデバイスマネージャでシリアルポートの速度を変更する必要があるかと思います。出力はCallback関数に渡されて、標準出力に数値が表示されます。

time: 585
Acc: 0.25 0.33 9.78
Mag: -29.1875 2.875 -34.6875
Gyr: 0.00109083 -0.00218166 -0.00109083
Eur: 2.06603 0.0294524 -0.0250891
Qua: -0.00653076 -0.0186768 -0.858826 0.511841
Lia: -0.04 0.07 -0.09
Grv: 0.29 0.24 9.79
Temp: 42
CalibStat: 3 0 3 3

動いていますが、正しいのかどうか分かりませんね。

BNO055の情報
[1] https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf
93ページにUARTのプロトコルの説明があります。
[2] https://learn.adafruit.com/adafruit-bno055-absolute-orientation-sensor/overview
USB Stickとはちょっと異なるようです。
USB Stickのデータシートも見つからないのですが、どうやって通信仕様分かったんだろう・・・?

今日の京都漫画

Tokyo MXでやってたドラマ版は残念でしたね。。。

はんなりギロリの頼子さん 2 (ゼノンコミックス)

はんなりギロリの頼子さん 2 (ゼノンコミックス)

安価なIMU(AHRS)センサのBosch BNO055USBStickを試す(その1)

今まで姿勢センサとして、SparkFunのRazor 9DOFシリーズを愛用してきましたが、廃版になってしまい代替品を探していました。欲しい仕様は、

  • 基板面積が小さいこと
  • 簡単にWindowsPCにつながること
  • 方位が取れる6自由度出力であること

です。

姿勢センサ探し

同社から後継の9DoF Razor IMU M0というのも出ているのですが、1.無駄なピンが配置されていて基板のフットプリントが大きい、2.AHRSとして使いたいときの良さげな既存のソフトウェアが見当たらない、等の問題があり単純に置き換えて使うのは躊躇していました。

世の中の安価なIMUセンサの流行りを調べてみると、TDKが買収したInvenSenseのもの(MPU-9250など)と、BoschのBNO055というのが人気を集めているようです。どちらも、3軸加速度、3軸ジャイロ、3軸コンパスを小さいICに内蔵しているのですが、BNO055の方は更に、センサの校正(キャリブレーション)とIMU, AHRS(電子コンパス)出力へのデータ処理まで内部でやってくれるそうです。データ出力速度はMPU-9250の方がずっと速いようですが、生データを受け取って自分でキャリブレーションしたうえでカルマンフィルタなりMadgwickフィルタなりを計算しなければならず、かなり面倒臭そうです。BNO055の出力速度は良くても100Hz未満です。
ここでは、お手軽な方が良いですからBNO055を試してみたいと思います。

BNO055搭載のお手軽そうな製品探し

BNO055は、インターフェースにI2CとUARTを持っており、多くの製品はI2Cでマイコンボードに接続して使うことを前提にしているようです。UARTを直接出力に使っている製品を探したところ、2つあり一つはとても値段が高く折り合わなかったのですが、灯台下暗しでBosch純正の評価ボードがとても良い感じの大きさ(USBメモリぐらい)と値段(3~4000円ぐらい)で見つかりました。
BNO055USBStick
www.digikey.jp
f:id:cvl-robot:20180806153728j:plain

BNO055USBStickのテスト

BNO055 USB Stickのアプリケーションノートは、ここにありますが、文書中のソフトウェアへのリンクが壊れています。
BoschのWEBページはとても分かりにくいのですが、よく探すと
www.bosch-sensortec.com
のDevelopment Desktop Software 2.0というのが、BNO055USBStickのテスト用プログラムとして見つかります。簡単な操作方法は以下の通りです。

1.適切なCOMポートにつなぐ
2.Operation ModeのConfig ModeをチェックしてNDoFを選び、Confi Modeのチェックを外す
3.左下のStart Streamingを押す
f:id:cvl-robot:20180806163307p:plain
f:id:cvl-robot:20180806163311p:plain

BNO055USBStickの更新用ファームウェアはたぶんまだ配られていない

アプリケーションノート中にはBNOinUSBStick.fwu3という名前のファイルがfirmwareなので他のファイルで更新するな!との注意書きがあります。BNO055用のファームウェアアップデータはありますが、ファイル名が違うのでUSBStick用では無いようです。注意。
追記 Development Desktop 2.0(DD2.0)用のhelp updaterを追加インストールすると、ファームウェアのアップデートの方法が分かります。DD2.0を使ってアップデートを行います。ver.1.4のファームウェアファイルがhelpファイルのpdfと同じところに置かれています。

ドライバソースコード探し

USB延長ケーブルに刺したセンサを振り回すとグラフが動くので、センサは動いているようです。でも、自分のC++プログラムからアクセスする方法が見つかりません。標準で用意されているBNO055の汎用ドライバーは、I2CのものでUARTの参考にはしづらいです。
github.com

次は、自前のプログラムでBNO055USBStickを使う方法を調べていきます。

[1] GitHub - yoshito-n-students/bno055_usb_stick: A ROS driver of Bosch BNO055 USB Stick
[2] GitHub - yoshito-n-students/bno055_usb_stick_msgs
[3] https://ae-bst.resource.bosch.com/media/_tech/media/application_notes/BST_BNO055_AN009_01.pdf
[4] https://www.bosch-sensortec.com/en/bst/support_tools/downloads/overview_downloads
SoftwareのDevelopment Desktop Softwareを参照のこと。

今日の京都まんが

京都の老舗の菓子屋の家族の話。それぞれ問題を色々抱えながらもあたたかい話。

であいもん (4) (角川コミックス・エース)

であいもん (4) (角川コミックス・エース)

であいもん (5) (角川コミックス・エース)

であいもん (5) (角川コミックス・エース)

せっかくインストールしたのでOpenVINOのサンプルを実行してみる

このページのサンプルを試してみます。
software.intel.com

画像分類

AlexNetモデルの変換

OpenCV-extraのAlexNetのモデルをOpenVINO向けに変換して使います。
モデル変換用コードは、C:\Intel\computer_vision_sdk_2018.2.304\deployment_tools\model_optimizerフォルダにあります。

mo_caffe.py --input_model e:\opencv_extra\testdata\dnn\bvlc_alexnet.caffemodel --input_proto e:\opencv_extra\testdata\dnn\bvlc_alexnet.prototxt

bvlc_alexnet.bin, bvlc_alexnet.mapping, bvlc_alexnet.xmlの3つのファイルが出力されます。これを、clasification_sample.exeから見える場所に置きます。手っ取り早くは、同じ場所にコピーします。

実行テスト

classification_sample.exe -i e:\opencv_extra\testdata\dnn\dog416.png -m bvlc_alexnet.xml

[ INFO ] InferenceEngine:
API version ............ 1.1
Build .................. 11653
[ INFO ] Parsing input parameters
[ INFO ] Loading plugin

API version ............ 1.1
Build .................. win_20180511
Description ....... MKLDNNPlugin
[ INFO ] Loading network files:
bvlc_alexnet.xml
bvlc_alexnet.bin
[ INFO ] Preparing input blobs
[ WARNING ] Image is resized from (416, 416) to (227, 227)
[ INFO ] Batch size is 1
[ INFO ] Preparing output blobs
[ INFO ] Loading model to the plugin
[ INFO ] Starting inference (1 iterations)
[ INFO ] Average running time of one iteration: 24.5096 ms
[ INFO ] Processing output blobs

Top 10 results:

Image e:\opencv_extra\testdata\dnn\dog416.png

250 0.1841287 label #250
249 0.1796786 label #249
248 0.0701520 label #248
537 0.0376270 label #537
174 0.0250397 label #174
257 0.0247385 label #257
254 0.0223720 label #254
245 0.0205516 label #245
151 0.0167213 label #151
171 0.0140692 label #171

[ INFO ] Execution successful

動いてはいるようですが、合っているかどうか分かりませんね。

同じようにGoogleNetの変換とテスト

mo_caffe.py --input_model e:\opencv_extra\testdata\dnn\bvlc_googlenet.caffemodel --input_proto e:\opencv_extra\testdata\dnn\bvlc_googlenet.prototxt

> classification_sample.exe -i e:\opencv_extra\testdata\dnn\dog416.png -m bvlc_googlenet.xml

[ INFO ] InferenceEngine:
API version ............ 1.1
Build .................. 11653
[ INFO ] Parsing input parameters
[ INFO ] Loading plugin

API version ............ 1.1
Build .................. win_20180511
Description ....... MKLDNNPlugin
[ INFO ] Loading network files:
bvlc_googlenet.xml
bvlc_googlenet.bin
[ INFO ] Preparing input blobs
[ WARNING ] Image is resized from (416, 416) to (224, 224)
[ INFO ] Batch size is 1
[ INFO ] Preparing output blobs
[ INFO ] Loading model to the plugin
[ INFO ] Starting inference (1 iterations)
[ INFO ] Average running time of one iteration: 24.9105 ms
[ INFO ] Processing output blobs

Top 10 results:

Image e:\opencv_extra\testdata\dnn\dog416.png

250 0.3507370 label #250
249 0.2820407 label #249
248 0.1186542 label #248
198 0.1117227 label #198
196 0.0621706 label #196
537 0.0218948 label #537
172 0.0084112 label #172
176 0.0068888 label #176
676 0.0056729 label #676
197 0.0039623 label #197

[ INFO ] Execution successful

画像分類非同期

classification_sample_async.exe e:\opencv_extra\testdata\dnn\dog416.png -m bvlc_googlenet.xml -i e:\opencv_extra\testdata\dnn\dog416.png
[ INFO ] InferenceEngine:
API version ............ 1.1
Build .................. 11653
[ INFO ] Parsing input parameters
[ INFO ] Parsing input parameters
[ INFO ] Loading plugin

API version ............ 1.1
Build .................. win_20180511
Description ....... MKLDNNPlugin
[ INFO ] Loading network files
[ INFO ] Preparing input blobs
[ WARNING ] Image is resized from (416, 416) to (224, 224)
[ INFO ] Batch size is 1
[ INFO ] Preparing output blobs
[ INFO ] Loading model to the plugin
[ INFO ] Start inference (1 iterations)
total: 39.2591

Throughput: 25.4718 FPS

[ INFO ] Processing output blobs

Top 10 results:

Image e:\opencv_extra\testdata\dnn\dog416.png

250 0.3507370 label #250
249 0.2820407 label #249
248 0.1186542 label #248
198 0.1117227 label #198
196 0.0621706 label #196
537 0.0218948 label #537
172 0.0084112 label #172
176 0.0068888 label #176
676 0.0056729 label #676
197 0.0039623 label #197

[ INFO ] Execution successful

セキュリティバリアカメラ

security_barrier_camera_sample.exe -m C:\Intel\computer_vision_sdk_2018.2.304\deployment_tools\intel_models\vehicle-license-plate-detection-barrier-0007\FP32\vehicle-license-plate-detection-barrier-0007.xml -m_va C:\Intel\computer_vision_sdk_2018.2.304\deployment_tools\intel_models\vehicle-attributes-recognition-barrier-0039\FP32\vehicle-attributes-recognition-barrier-0039.xml -m_lpr C:\Intel\computer_vision_sdk_2018.2.304\deployment_tools\intel_models\license-plate-recognition-barrier-0001\FP32\license-plate-recognition-barrier-0001.xml

InferenceEngine:
API version ............ 1.1
Build .................. 11653
[ INFO ] Parsing input parameters
[ INFO ] Reading input
[ INFO ] Loading plugin CPU

API version ............ 1.1
Build .................. win_20180511
Description ....... MKLDNNPlugin
[ INFO ] Loading network files for VehicleDetection
[ INFO ] Batch size is forced to 1
[ INFO ] Checking Vehicle Detection inputs
[ INFO ] Checking Vehicle Detection outputs
[ INFO ] Loading Vehicle Detection model to the CPU plugin
[ INFO ] Loading network files for VehicleAttribs
[ INFO ] Batch size is forced to 1 for Vehicle Attribs
[ INFO ] Checking VehicleAttribs inputs
[ INFO ] Checking Vehicle Attribs outputs
[ INFO ] Loading Vehicle Attribs model to the CPU plugin
[ INFO ] Loading network files for Licence Plate Recognition (LPR)
[ INFO ] Batch size is forced to 1 for LPR Network
[ INFO ] Checking LPR Network inputs
[ INFO ] Checking LPR Network outputs
[ INFO ] Loading LPR model to the CPU plugin
[ INFO ] Start inference

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

mo_caffe.py --input_model e:\opencv_extra\testdata\dnn\bvlc_googlenet.caffemodel --input_proto e:\opencv_extra\testdata\dnn\bvlc_googlenet.prototxt

object_detection_sample.exe -i e:\opencv_extra\testdata\dnn\dog416.png -m VGG16_faster_rcnn_final.xml

f:id:cvl-robot:20180725214907j:plain

**

object_detection_sample.exe -m C:\Intel\computer_vision_sdk_2018.2.304\deployment_tools\intel_models\person-detection-retail-0001\FP32\person-detection-retail-0001.xml --bbox_name detector/bbox/ave_pred -i e:\opencv_extra\testdata\dnn\googlenet_0.png

f:id:cvl-robot:20180725215603j:plain

あっさり簡単に動きます。
まだ途中ですが、面倒くさくなってしまったので今日はここまで。

OpenCV3.4.2で始める浅いディープラーニング (その3 物体検出)

example_dnn_object_detectionは、画像中の物体の矩形領域を見つけてラベル付けした答えを返してくれる物体検出プログラムです。opencv/samples/dnn at master · opencv/opencv · GitHubのModel Zooに挙げられているモデルが使えます。
モデル名と使用するパラメータはModelZooに掛かれているのですが、具体的なモデルファイル名が書かれていません。対応があっているかどうか若干不安がありますが、それぞれ試してみたいと思います。

1. example_dnn_object_detection

MobileNet-SSD, Caffe

example_dnn_object_detection.exe --model=MobileNetSSD_deploy.caffemodel --config=MobileNetSSD_deploy.prototxt --scale=0.00784 --width=300 --height=300 --mean=127.5 127.5 127.5 --classes=object_detection_classes_pascal_voc.txt --input=dog416.png

OpenCV face detector

example_dnn_object_detection.exe --model=opencv_face_detector.caffemodel --config=opencv_face_detector.prototxt --scale=1.0 --width=300 --height=300 --mean=104 177 123 --classes=object_detection_classes_coco.txt --input=googlenet_1.png

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

SSDs from TensorFlow

example_dnn_object_detection.exe --model=ssd_inception_v2_coco_2017_11_17.pb --config=ssd_inception_v2_coco_2017_11_17.pbtxt --scale=0.00784 --width=300 --height=300 --mean=127.5 127.5 127.5 --rgb=1 --classes=object_detection_classes_coco.txt --input=dog416.png --backend=3

example_dnn_object_detection.exe --model=ssd_mobilenet_v1_coco_2017_11_17.pb --config=ssd_mobilenet_v1_coco_2017_11_17.pbtxt --scale=0.00784 --width=300 --height=300 --mean=127.5 127.5 127.5 --rgb=1 --classes=object_detection_classes_coco.txt --input=dog416.png --backend=3

YOLO

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 --input=dog416.png

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

VGG16-SSD

example_dnn_object_detection.exe --model=VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel --config=ssd_vgg16.prototxt --scale=1.0 --width=300 --height=300 --mean=104 117 123 --input=dog416.png

Faster-RCNN

example_dnn_object_detection.exe --model=VGG16_faster_rcnn_final.caffemodel --config=faster_rcnn_vgg16.prototxt --scale=1.0 --width=800 --height=600 --mean=102.9801 115.9465 122.7717 --classes=object_detection_classes_pascal_voc.txt --input=dog416.png

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

example_dnn_object_detection.exe --model=ZF_faster_rcnn_final.caffemodel --config=faster_rcnn_zf.prototxt --scale=1.0 --width=800 --height=600 --mean=102.9801 115.9465 122.7717 --classes=object_detection_classes_pascal_voc.txt --input=dog416.png

違いが良く分からない。

R-FCN

example_dnn_object_detection.exe --model=resnet50_rfcn_final.caffemodel --config=rfcn_pascal_voc_resnet50.prototxt --scale=1.0 --width=800 --height=600 --mean=102.9801 115.9465 122.7717 --classes=object_detection_classes_pascal_voc.txt --input=dog416.png

???? これと、この下の対応モデルが良く分からない。

Faster-RCNN, ResNet backbone

example_dnn_object_detection.exe --model=resnet50_rfcn_final.caffemodel --config=rfcn_pascal_voc_resnet50.prototxt --scale=1.0 --width=300 --height=300 --mean=103.939 116.779 123.68 --rgb=1 --classes=object_detection_classes_pascal_voc.txt --input=dog416.png

f:id:cvl-robot:20180725172713p:plain
????

Faster-RCNN, InceptionV2 backbone

example_dnn_object_detection.exe --model=faster_rcnn_inception_v2_coco_2018_01_28.pb --config=faster_rcnn_inception_v2_coco_2018_01_28.pbtxt --scale=0.00784 --width=300 --height=300 --mean=127.5 127.5 127.5 --rgb=1 --classes=object_detection_classes_coco.txt --input=dog416.png --backend=3

メモ

tensorflowベースのモデルは、OpenVINOベースのバックエンドだとうまく動いてくれません。
フレームワーク毎のモデルファイルとコンフィグファイルの拡張子を確認しておきます。
Caffe: .caffemodel, .prototxt
TensorFlow: .pb, pbtxt
Torch: .t7 or .net (cfgファイルを内包していて、modelだけを指定する)
Darknet: .weights, .cfg

OpenCV3.4.2で始める浅いディープラーニング (その8 遅いのでOpenVINO有効化)

前回、OpenCV-dnnのHalideはまだ早すぎたんだ、ということが分かりました。今回は、手間を掛けずに高速化できそうなもう一方の手段OpenVINOを試してみたいと思います。基本的にはIntelCPU限定で使うことができます。

github.com

準備

事前にPython3.5以降とIntelGPUの有効化をしておく必要があります。

64ビット版python3.5以降のインストール

Python3.7が最新版です。3.7でも多分問題ないですが、安定志向の人はPython3.5もしくはPython3.6シリーズのどれか好きなのをインストールしてください。必ず64ビット版を選んでください。
www.python.org
Python2.7等もインストールしている人は、Pathに注意してください。cmdプロンプトでpythonと打った時、Python3.5~が呼ばれていることを確認しておいてください。
パスの例:
C:\Users\cvl\AppData\Local\Programs\Python\Python36
C:\Users\cvl\AppData\Local\Programs\Python\Python36\Scripts
今回の記事では特にいらないけれど、モデルのダウンロード等に使うpythonライブラリのダウンロードしておくと便利。

> pip install pyyaml
> pip install requests

IntelGPUの有効化

比較的最近のマザーボードでは、BIOS設定によりnVidiaGeForce等を使いつつ、IntelGPU(統合グラフィックス)も共存できるようになっています。これを有効にしてください。
f:id:cvl-robot:20180723203726j:plain

ダウンロード

IntelのWebサイトで個人情報を登録の上、ダウンロードしてください。商用にも使える緩いライセンスだそうですが、気になる人はライセンス規定も調べておいてください。
software.seek.intel.com

ダウンロード完了後、ダイアログに従ってインストールを進めてください。規定ではc:\Intel\computer_vision_sdk_2018.2.304などにインストールされます。後ろの数字は、バージョン番号です。

OpenCVのリビルド

OpenVINOのインストール完了後、OpenCVのビルドをCMakeからやり直す必要があります。CMakeは2回に分けてConfigureします。

  • 1回目

WITH_INF_ENGINE check

  • 2回目

INF_ENGINE_INCLUDE_DIRS C:/Intel/computer_vision_sdk_2018.2.304/inference_engine/include 勝手に入っているはず
INF_ENGINE_ROOT_DIR C:/Intel/computer_vision_sdk_2018.2.304/inference_engine 勝手に入っているはず
inference_engine C:/Intel/computer_vision_sdk_2018.2.304/deployment_tools/inference_engine/lib/intel64/Release/inference_engine.lib 入れる

Configureを通して、Generateして、OpenCVをリビルドしてください。リビルド完了後、dllファイルおよびdnn関連のexeファイルをopencv_extra/testdata/dnnに上書きコピーしてください。inference_engineのdllのコピーは必要ありません。ライブラリのインストール時にパスが通されています。
(dllをコピーするのは、今の作業はテストのつもりなので環境にコンフリクトが起こさないように配慮しているためで、もちろんdllをコピーする代わりにパスをちゃんと通しても構いません。)

実行テスト

inference_engineを使って実行。1263.91ms

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 --classes=segmentation_classes_pascal_voc.txt --backend=2 --input=dog416.png

f:id:cvl-robot:20180724141159p:plain
Halideを使って実行。5827.15ms
f:id:cvl-robot:20180724141331p:plain
OpenCV(CPU)を使って実行。2897.94ms
f:id:cvl-robot:20180724141456p:plain

おお、これは効果がありましたね!CPU(Core i7-4770S)に比べて2倍程速くなっています。んー、ほんとかなぁ。

OpenCV3.4.2で始める浅いディープラーニング (その7 遅いのでHalide有効化)

テストプログラムを実行してみましたが、実行速度が遅いという不満があります。テストプログラムの引数のいくつかに、使ってこなかったものの気になるパラメータがありました。backendと、targetです。

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

Choose one of target computation devices:
0: CPU target (by default),
1: OpenCL,
2: OpenCL fp16 (half-float precision),
3: VPU

backendの選択肢にあるHalideやIntel's Deep Learning Interface Engineは、環境ごとに利用可能なSSEやAVX等の並列計算機能を自動的に有効化して、環境の違いを吸収しつつ高速化されたコードを出力してくれるライブラリです。上手くいけば2~20倍ほどの高速化が期待できるようです。
Halideについては、福嶋先生のまとめ記事がとても分かり易いです。
qiita.com

これを有効化すれば、速くなりそうです。Halideを有効化してみましょう。

1. Halideの有効化

Halideの導入については、OpenCVのTutorialの中に丁寧な説明があります。
OpenCV: How to enable Halide backend for improve efficiency

の3つの手順を踏みます。

チュートリアルに従ってやってみるとエラーが出る

チュートリアルのリンクを使って素直にダウンロードしたLLVM4.0とclang4.0を使ってHalideをビルドしようとすると、rrors: too many arguments to function ‘llvm::ModulePass* llvm::createAddressSanitizerModulePass()なるエラーが出てきて上手くビルドできません。Halideの現在のソースコードにうまく合わないようです。

LLVMとClangの最新バージョン6.0.1を使ってみる。

http://releases.llvm.org/download.html#6.0.1
から,LLVMとClangのソースコードをダウンロードしてきて試してみます。圧縮ファイルはxzというちょっと珍しい拡張子になっています。Windows環境での解凍にはLhaforge等が便利です。

例としてはこんな感じ。
LLVMをc:\workspace等に解凍します。解凍した中に入ってc:\workspace\llvm-6.0.1.src\toolsでclangのxzを解凍し、解凍してできたフォルダの名前をclangに変更します。
次に必ず、MSVCの開発者コマンドプロンプトを開いて、そこでcmakeとbuildを実行します。

cd c:\workspace\llvm-6.0.1.src
mkdir build
mkdir install
cd build
cmake.exe -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\\workspace\\llvm-6.0.1.src\\install -G "Visual Studio 14 Win64" c:\\workspace\\llvm-6.0.1.src
MSBuild.exe /m:4 /t:Build /p:Configuration=Release .\\INSTALL.vcxproj

HalideはTutorialに指示されたダウンロード先Githubからmaster版のソースコードを持ってきます。
c:\workspace\Halide等に解凍して、LLVMと同じように開発者コマンドプロンプトにて次のような手順でビルドします。

cd c:\workspace\Halide
mkdir build
cd build
cmake.exe -DLLVM_DIR=c:\\workspace\\llvm-6.0.1.src\\install\\lib\\cmake\\llvm -DLLVM_VERSION=60 -DWITH_TESTS=OFF -DWITH_APPS=OFF -DWITH_TUTORIALS=OFF -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" ..
MSBuild.exe /m:4 /t:Build /p:Configuration=Release .\\ALL_BUILD.vcxproj

ここまで準備ができたら、最後にOpenCVのビルドをCMakeからHalide関連のオプションを有効にしつつ、やり直します。
(ENABLE_CXX11 [check])
WITH_HALIDE [check]
HALIDE_ROOT_DIR c:\\workspace\Halide\build

再ビルドしてできたdllファイルとexeファイルをopencv_extra/testdata/dnnの古いファイルに上書きコピーします。また、Halide.dllを同じフォルダにコピーします。

Halideを有効化して、exampleを動かしてみる

backendにHalideを指定してsegmentationを動かしてみます。実行環境は、Intel Core i7-4770SでGeForce GTX760です。

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 --classes=segmentation_classes_pascal_voc.txt --backend=1

f:id:cvl-robot:20180723173320p:plain
ふむふむ、実行周期約6秒と。あれ、遅くない???
ためしにautomaticallyに戻してみると、
f:id:cvl-robot:20180723173547p:plain
3秒を切ると。約2倍ほど速いですね。

ということで、何が原因かよくわかっていませんが、”Halideを有効化すると2倍以上遅くなる”という結果になりました。どの環境でも速くなるというわけではないようですね。もうちょっと試してみたいと思います。

追記Core i7-6700HQ, GeForce GTX1060環境でも試してみましたが、状況は変わらず(むしろ悪化)でした。

2018年7月23日現在の結論

答えはここにありました。ENetを除く大半のケースでまだCPUの方が速いようです。簡単に使わせてもらうには、OpenCV-dnnのHalideはまだ時期尚早のようですね。
stackoverflow.com

github.com

GPUを利用したOpenCLを使った場合よりも、CPU単体で実行したほうが速いということにも留意すべきかもしれません。また今のところ、Intel製グラフィックスチップのOpenCLしか実行できません(GeForceとかRadeonとかじゃ動かない)。
試すなら、Intel MKL(後継に当たる?OpenVINO™ Toolkit | Intel® Software)のようですね。ただし、最新のCPU(Core i7-6000シリーズ以降)でないと動かないようですので、これも敷居が高そうです。

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というファイルはあるのだけれど、使い方が分からない・・・。

example_dnn_segmentation.exe --scale=0.00392 --width=1024 --height=512 --mean=0 0 0 --rbg --model=Enet-model-best.net --input=dog416.png --classes=enet-classes.txt

f:id:cvl-robot:20180723193448p:plainf:id:cvl-robot:20180723193500p:plain
ENetによるセマンティックセグメンテーション

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