テックブログ:PeleeをJetson TX2に実装する 第一弾

こんな方におすすめの記事です

最新の物体検出システムを動かしてみたい!という技術職の方

この記事を読み終えるのにかかる時間

10分(手元で動かすには1時間はかかります。)

はじめに

こんにちは!マクニカ AIリサーチセンターの土屋です!

本日は花粉がそろりそろりと来て、辛くなっている皆さんのために、最先端の物体検出アルゴリズムの実装方法についてのブログを投稿させていただきます。

最先端の理論について最近ずっとブログ書いてきたのですが、「やはり理論だけだと面白みに欠けるから実装もあげなきゃ。。。」とは思っていたのですが、

「案件についてここで書くわけにもいかないからどうしよう、

そうだ、NeurIPS 2018の採択論文になったPeleeを動かしてみよっ♪」となったので、トライをしてみました!

「ちょうど、Githubにコードも落ちているし、これをやろう!AI系トップカンファレンス NeurIPS 2018に採択されているような論文だし、動かしたらかっこいい!」となったわけですが、実際に最先端の論文の実装をするというのは、とってもとっても危険な落とし穴があります。

落とし穴とは、実装にかかる工数が見積もれず、工数が∞になる可能性があることです。

というのも、例えば3年前の論文の実装などであれば、もしできないことがあればネットに解決のためのソースが落ちているものなのですが、なんせPeleeが出たのはたった半年前、、、

もしエラーが出たら、デバッグするのはそれなりに大変です。

ということで(?)、今回は、いつも私の後ろの席で作業をしていらっしゃるマクニカ AIリサーチセンターの山岡さんに実装を泣きながらお願いしました。

山岡さんは、ソフトウェア → 組み込み → 機械学習と経験を積んできたムキムキの何でもエンジニアです。きっと山岡さんならすぐにできるはずだ!と思ったのですが、案の定ずんずんと進めていってくれたので、驚きました。笑

今回は、そんなムキムキエンジニアの山岡さんの、トライアンドエラーを繰り返した実装方法について一挙大公開します!

「実装はとても大変だったから、私のようにPeleeをエッジデバイスで動かさなければいけなくなった人のために、この努力はブログに上げてみたら良いのではないでしょうか。」という山岡さんの意向から投稿が決定したブログです。ありがとうございます、山岡さん。

最先端AI技術の結晶である(← ちょっと大げさかも?)リアルタイム物体検出システム Peleeについて、ここまで丁寧に解説をしているのは、おそらく弊社だけです。

Jetson TX2をお持ちの方は是非、動かしてみてください!

持っていない方は、第二弾で投稿する動画にて鑑賞をすると面白いかと思います。

今回の企画は文章量の関係で、ブログを二つに分けて作らせていただきました。

第一弾では、Peleeに大量の画像を推論させるまで

第二弾では、PeleeとWebカメラをつなぎ、リアルタイム物体検出をするまでを行います。

それでは、実装についての説明をしていきます。

目次

・Webカメラ画像の物体検出をPeleeで動かすまでの道のり

・Jetson TX2でcaffeの環境構築をする

・推論用画像を用意する

・VGGNetを用いたSSDの推論

・Jetson TX2で Peleeを動かす

・まとめ

Webカメラ画像の物体検出をPeleeで動かすまでの道のり

元の論文を頼りに、実際にWebカメラでのリアルタイム物体検出を行いました。

元論文がCaffeの環境で動かしているので、Jetson TX2でもCaffeで動かすことにしました。

また、Peleeの物体検出はあくまでSSDの拡張でしかないので、SSDも動くようにする必要があります。

最後に Peleeでの物体検出ができれば、第一弾での目的は達成です。

これらを実現するためには、以下GithubリポジトリのREADME.mdの内容に従い、セットアップを進めていきます。

https://github.com/Robert-JunWang/Pelee

具体的なセットアップの流れは以下の通りです。

1. https://github.com/weiliu89/caffe/tree/ssdのCaffeをセットアップし、VGGNetのSSDが動作する環境を構築する。

2. PASCAL VOC 2007および2012データセットをダウンロードする。

3. ダウンロードしたデータセットを使って、LMDBファイルを生成する。

4. 学習済みモデルをダウンロードし、推論を実行する。

Jetson TX2でcaffeの環境構築をする

実際にPeleeが動作する環境を構築するためには、まずCaffeを導入する必要があります。

その前に、Jetson TX2のCPU/GPUコアの性能を引き出すためのおまじないを行います。

  1. nvidia@tegra-ubuntu:~$
  2. nvidia@tegra-ubuntu:~$ sudo ./jetson_clocks.sh
  3. [sudo] password for nvidia:
  4. nvidia@tegra-ubuntu:~$
  5. nvidia@tegra-ubuntu:~$ sudo nvpmodel -m 0
  6. nvidia@tegra-ubuntu:~$

Jetson TX2のホームディレクトリで、リポジトリ

https://github.com/weiliu89/caffe.git

をCloneし、ssdブランチに切り替えます。

  1. git clone https://github.com/weiliu89/caffe.git
  2. cd caffe/
  3. git checkout ssd

サンプルコンフィグをベースに、必要な設定を行います。

  1. cp Makefile.config.example Makefile.config
  2. vi Makefile.config

ここで、Makefile.configの訂正を本当にたくさん行う必要があるのですが、今回は、こちら※からぽちっと山岡さんが作ったものをダウンロードしましょう。

※上記を押すと、ダウンロードが開始されます

Jetson TX2は8コアCPUなので、makeオプションにはj8を付けてください。

  1. nvidia@tegra-ubuntu:~/caffe$
  2. nvidia@tegra-ubuntu:~/caffe$ make -j8
  3. PROTOC src/caffe/proto/caffe.proto
  4. CXX src/caffe/layers/dummy_data_layer.cpp
  5. CXX src/caffe/layers/elu_layer.cpp
  6. CXX src/caffe/layer.cpp
  7. CXX src/caffe/layers/data_layer.cpp
  8. CXX src/caffe/layers/window_data_layer.cpp
  9. CXX src/caffe/layers/threshold_layer.cpp
  10. CXX src/caffe/layers/inner_product_layer.cpp
  11. CXX src/caffe/layers/memory_data_layer.cpp
  12. CXX src/caffe/layers/detection_evaluate_layer.cpp
  13. CXX src/caffe/layers/argmax_layer.cpp
  14. CXX src/caffe/layers/cudnn_tanh_layer.cpp
  15. CXX src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp
  16. CXX src/caffe/layers/lstm_layer.cpp
  17. CXX src/caffe/layers/deconv_layer.cpp
  18. CXX src/caffe/layers/split_layer.cpp
  19. ・・・省略・・・
  20. CXX/LD -o .build_release/tools/train_net.bin
  21. CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
  22. CXX/LD -o .build_release/tools/get_image_size.bin
  23. CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
  24. CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
  25. CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin
  26. CXX/LD -o .build_release/examples/cpp_classification/classification.bin
  27. CXX/LD -o .build_release/examples/ssd/ssd_detect.bin
  28. nvidia@tegra-ubuntu:~/caffe$
  29. nvidia@tegra-ubuntu:~/caffe$
  30. nvidia@tegra-ubuntu:~/caffe$ make py
  31. CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
  32. touch python/caffe/proto/__init__.py
  33. PROTOC (python) src/caffe/proto/caffe.proto
  34. nvidia@tegra-ubuntu:~/caffe$

ビルドしたcaffeを検証するためのテストプログラムをビルドします。

  1. nvidia@tegra-ubuntu:~/caffe$ make test -j8
  2. CXX src/caffe/test/test_rnn_layer.cpp
  3. CXX src/caffe/test/test_gradient_based_solver.cpp
  4. CXX src/caffe/test/test_random_number_generator.cpp
  5. CXX src/caffe/test/test_upgrade_proto.cpp
  6. CXX src/caffe/test/test_infogain_loss_layer.cpp
  7. CXX src/caffe/test/test_concat_layer.cpp
  8. CXX src/caffe/test/test_spp_layer.cpp
  9. CXX src/caffe/test/test_image_data_layer.cpp
  10. CXX src/caffe/test/test_data_transformer.cpp
  11. ・・・省略・・・
  12. LD .build_release/src/caffe/test/test_split_layer.o
  13. LD .build_release/src/caffe/test/test_tile_layer.o
  14. LD .build_release/src/caffe/test/test_deconvolution_layer.o
  15. LD .build_release/src/caffe/test/test_tanh_layer.o
  16. LD .build_release/src/caffe/test/test_reduction_layer.o
  17. LD .build_release/src/caffe/test/test_im2col_layer.o
  18. LD .build_release/src/caffe/test/test_scale_layer.o
  19. LD .build_release/src/caffe/test/test_batch_norm_layer.o
  20. LD .build_release/src/caffe/test/test_bias_layer.o
  21. LD .build_release/cuda/src/caffe/test/test_im2col_kernel.o
  22. CXX/LD -o .build_release/test/test_all.testbin src/caffe/test/test_caffe_main.cpp
  23. nvidia@tegra-ubuntu:~/caffe$

  1. nvidia@tegra-ubuntu:~/caffe$ make test -j8make runtest -j8
  2. .build_release/tools/caffe
  3. caffe: command line brew
  4. usage: caffe <command> <args>
  5. commands:
  6. train train or finetune a model
  7. test score a model
  8. device_query show GPU diagnostic information
  9. time benchmark model execution time
  10. Flags from tools/caffe.cpp:
  11. -gpu (Optional; run in GPU mode on given device IDs separated by ','.Use
  12. '-gpu all' to run on all available GPUs. The effective training batch
  13. size is multiplied by the number of devices.) type: string default: ""
  14. -iterations (The number of iterations to run.) type: int32 default: 50
  15. -level (Optional; network level.) type: int32 default: 0
  16. -model (The model definition protocol buffer text file.) type: string
  17. default: ""
  18. -phase (Optional; network phase (TRAIN or TEST). Only used for 'time'.)
  19. type: string default: ""
  20. -sighup_effect (Optional; action to take when a SIGHUP signal is received:
  21. snapshot, stop or none.) type: string default: "snapshot"
  22. -sigint_effect (Optional; action to take when a SIGINT signal is received:
  23. snapshot, stop or none.) type: string default: "stop"
  24. -snapshot (Optional; the snapshot solver state to resume training.)
  25. type: string default: ""
  26. -solver (The solver definition protocol buffer text file.) type: string
  27. default: ""
  28. -stage (Optional; network stages (not to be confused with phase), separated
  29. by ','.) type: string default: ""
  30. -weights (Optional; the pretrained weights to initialize finetuning,
  31. separated by ','. Cannot be set simultaneously with snapshot.)
  32. type: string default: ""
  33. *** Error in `.build_release/tools/caffe': free(): invalid pointer: 0x000000000043b110 ***
  34. *** Aborted at 1549368479 (unix time) try "date -d @1549368479" if you are using GNU date ***
  35. PC: @ 0x0 (unknown)
  36. *** SIGABRT (@0x3e900006ec5) received by PID 28357 (TID 0x7f600c3000) from PID 28357; stack trace: ***
  37. @ 0x7f7a4384e0 ([vdso]+0x4df)
  38. @ 0x7f78f0e528 gsignal
  39. Makefile:526: recipe for target 'runtest' failed
  40. make: *** [runtest] Aborted (core dumped)
  41. nvidia@tegra-ubuntu:~/caffe$

エラーですね。

もしこのようなエラーになってしまった場合は、libtcmalloc-minimal4をインストールしましょう。

  1. nvidia@tegra-ubuntu:~/caffe$ sudo apt-get install libtcmalloc-minimal4
  2. [sudo] password for nvidia:
  3. Reading package lists... 0%Reading package lists... 100%Reading package lists... Done
  4. Building dependency tree... 0%Building dependency tree... 0%Building dependency tree... 50%Building dependency tree... 50%Building dependency tree
  5. Reading state information... 0%Reading state information... 0%Reading state information... Done
  6. The following packages were automatically installed and are no longer required:
  7. apt-clone archdetect-deb dmeventd dmraid dpkg-repack gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 gstreamer1.0-plugins-bad-videoparsers kpartx kpartx-boot libappstream3 libass5
  8. libavresample-ffmpeg2 libbs2b0 libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 libflite1 libgstreamer-plugins-bad1.0-0 liblockfile-bin liblockfile1 liblvm2app2.2
  9. liblvm2cmd2.02 libmircommon5 libparted-fs-resize0 libpostproc-ffmpeg53 libreadline5 libsodium18 libtbb-dev libtbb2 libzmq5 lockfile-progs lvm2 os-prober pmount python3-icu python3-pam
  10. rdate ubiquity-casper ubiquity-ubuntu-artwork
  11. Use 'sudo apt autoremove' to remove them.
  12. The following NEW packages will be installed:
  13. libtcmalloc-minimal4
  14. 0 upgraded, 1 newly installed, 0 to remove and 716 not upgraded.
  15. Need to get 96.0 kB of archives.
  16. After this operation, 383 kB of additional disk space will be used.
  17. 0% [Working]0% [Connecting to ports.ubuntu.com] 0% [Waiting for headers] Get:1 http://ports.ubuntu.com/ubuntu-ports xenial-updates/main arm64 libtcmalloc-minimal4 arm64 2.4-0ubuntu5.16.04.1 [96.0 kB]
  18. 11% [1 libtcmalloc-minimal4 13.8 kB/96.0 kB 14%]35% [1 libtcmalloc-minimal4 41.8 kB/96.0 kB 44%] 100% [Working] Fetched 96.0 kB in 1s (57.2 kB/s)
  19. Selecting previously unselected package libtcmalloc-minimal4.
  20. (Reading database ... (Reading database ... 5%(Reading database ... 10%(Reading database ... 15%(Reading database ... 20%(Reading database ... 25%(Reading database ... 30%(Reading database ... 35%(Reading database ... 40%(Reading database ... 45%(Reading database ... 50%(Reading database ... 55%(Reading database ... 60%(Reading database ... 65%(Reading database ... 70%(Reading database ... 75%(Reading database ... 80%(Reading database ... 85%(Reading database ... 90%(Reading database ... 95%(Reading database ... 100%(Reading database ... 188854 files and directories currently installed.)
  21. Preparing to unpack .../libtcmalloc-minimal4_2.4-0ubuntu5.16.04.1_arm64.deb ...
  22. Unpacking libtcmalloc-minimal4 (2.4-0ubuntu5.16.04.1) ...
  23. Processing triggers for libc-bin (2.23-0ubuntu3) ...
  24. Setting up libtcmalloc-minimal4 (2.4-0ubuntu5.16.04.1) ...
  25. Processing triggers for libc-bin (2.23-0ubuntu3) ...
  26. nvidia@tegra-ubuntu:~/caffe$

再度runtestを実行しましたが、私の環境では以下のようなエラーでテストは失敗しました。テストコードが誤っているように思えるので、そのまま次の手順へ進めてしまいます

  1. nvidia@tegra-ubuntu:~/caffe$ make runtest -j8
  2. .build_release/tools/caffe
  3. caffe: command line brew
  4. usage: caffe <command> <args>
  5. commands:
  6. train train or finetune a model
  7. test score a model
  8. device_query show GPU diagnostic information
  9. time benchmark model execution time
  10. Flags from tools/caffe.cpp:
  11. -gpu (Optional; run in GPU mode on given device IDs separated by ','.Use
  12. '-gpu all' to run on all available GPUs. The effective training batch
  13. size is multiplied by the number of devices.) type: string default: ""
  14. -iterations (The number of iterations to run.) type: int32 default: 50
  15. -level (Optional; network level.) type: int32 default: 0
  16. -model (The model definition protocol buffer text file.) type: string
  17. default: ""
  18. -phase (Optional; network phase (TRAIN or TEST). Only used for 'time'.)
  19. type: string default: ""
  20. -sighup_effect (Optional; action to take when a SIGHUP signal is received:
  21. snapshot, stop or none.) type: string default: "snapshot"
  22. -sigint_effect (Optional; action to take when a SIGINT signal is received:
  23. snapshot, stop or none.) type: string default: "stop"
  24. -snapshot (Optional; the snapshot solver state to resume training.)
  25. type: string default: ""
  26. -solver (The solver definition protocol buffer text file.) type: string
  27. default: ""
  28. -stage (Optional; network stages (not to be confused with phase), separated
  29. by ','.) type: string default: ""
  30. -weights (Optional; the pretrained weights to initialize finetuning,
  31. separated by ','. Cannot be set simultaneously with snapshot.)
  32. type: string default: ""
  33. .build_release/test/test_all.testbin 0 --gtest_shuffle
  34. Cuda number of devices: 1
  35. Setting to use device 0
  36. Current device id: 0
  37. Current device name: NVIDIA Tegra X2
  38. Note: Randomizing tests' orders with a seed of 10715 .
  39. [==========] Running 2361 tests from 309 test cases.
  40. [----------] Global test environment set-up.
  41. [----------] 6 tests from RNNLayerTest/0, where TypeParam = caffe::CPUDevice<float>
  42. [ RUN ] RNNLayerTest/0.TestForward
  43. [ OK ] RNNLayerTest/0.TestForward (2972 ms)
  44. [ RUN ] RNNLayerTest/0.TestGradientNonZeroContBufferSize2
  45. [ OK ] RNNLayerTest/0.TestGradientNonZeroContBufferSize2 (319 ms)
  46. ・・・省略・・・
  47. [ RUN ] CPUBBoxUtilTest.TestBBoxSize
  48. [ OK ] CPUBBoxUtilTest.TestBBoxSize (0 ms)
  49. [ RUN ] CPUBBoxUtilTest.TestGetPriorBBoxes
  50. [ OK ] CPUBBoxUtilTest.TestGetPriorBBoxes (0 ms)
  51. [ RUN ] CPUBBoxUtilTest.TestMatchBBoxLableOneBipartite
  52. [ OK ] CPUBBoxUtilTest.TestMatchBBoxLableOneBipartite (0 ms)
  53. [ RUN ] CPUBBoxUtilTest.TestDecodeBBoxesCenterSize
  54. [ OK ] CPUBBoxUtilTest.TestDecodeBBoxesCenterSize (0 ms)
  55. [ RUN ] CPUBBoxUtilTest.TestOutputBBox
  56. F0205 21:28:29.267797 28997 test_bbox_util.cpp:279] Check failed: out_bbox.xmax() == 50. (50 vs. 50)
  57. *** Check failure stack trace: ***
  58. @ 0x7fa24c9718 google::LogMessage::Fail()
  59. @ 0x7fa24cb614 google::LogMessage::SendToLog()
  60. @ 0x7fa24c9290 google::LogMessage::Flush()
  61. @ 0x7fa24cbeb4 google::LogMessageFatal::~LogMessageFatal()
  62. @ 0x965af8 caffe::CPUBBoxUtilTest_TestOutputBBox_Test::TestBody()
  63. @ 0xa55244 testing::internal::HandleExceptionsInMethodIfSupported<>()
  64. @ 0xa4d4ec testing::Test::Run()
  65. @ 0xa4d628 testing::TestInfo::Run()
  66. @ 0xa4d6e8 testing::TestCase::Run()
  67. @ 0xa4e848 testing::internal::UnitTestImpl::RunAllTests()
  68. @ 0xa4eb5c testing::UnitTest::Run()
  69. @ 0x53b4e8 main
  70. @ 0x7fa04f58a0 __libc_start_main
  71. Makefile:526: recipe for target 'runtest' failed
  72. make: *** [runtest] Aborted (core dumped)
  73. nvidia@tegra-ubuntu:~/caffe$
  74. nvidia@tegra-ubuntu:~/caffe$

エラーは出ていますが、実際にその先のSSDを動かすことはできます。

推論用画像を用意する

VOC 2007、VOC 2012のデータセットをダウンロードし、解凍します。

データセットは

http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

になります。

  1. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
  2. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
  3. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

中身を確認しましょう。

  1. nvidia@tegra-ubuntu:~/data$ ls -l
  2. total 2842496
  3. -rw-rw-r-- 1 nvidia nvidia 451020800 Jan 1 22:27 VOCtest_06-Nov-2007.tar
  4. -rw-rw-r-- 1 nvidia nvidia 460032000 Jan 1 22:27 VOCtrainval_06-Nov-2007.tar
  5. -rw-rw-r-- 1 nvidia nvidia 1999639040 Jan 30 12:24 VOCtrainval_11-May-2012.tar
  6. nvidia@tegra-ubuntu:~/data$
  7. nvidia@tegra-ubuntu:~/data$
  8. nvidia@tegra-ubuntu:~/data$ tar -xvf VOCtest_06-Nov-2007.tar
  9. VOCdevkit/
  10. VOCdevkit/VOC2007/
  11. VOCdevkit/VOC2007/Annotations/
  12. VOCdevkit/VOC2007/Annotations/000001.xml
  13. VOCdevkit/VOC2007/Annotations/000002.xml
  14. VOCdevkit/VOC2007/Annotations/000003.xml
  15. ・・・省略・・・
  16. VOCdevkit/VOC2007/SegmentationObject/009788.png
  17. VOCdevkit/VOC2007/SegmentationObject/009817.png
  18. VOCdevkit/VOC2007/SegmentationObject/009889.png
  19. VOCdevkit/VOC2007/SegmentationObject/009899.png
  20. VOCdevkit/VOC2007/SegmentationObject/009901.png
  21. nvidia@tegra-ubuntu:~/data$
  22. nvidia@tegra-ubuntu:~/data$

VOCtrainval_06-Nov-2007.tarを展開しましょう。

  1. nvidia@tegra-ubuntu:~/data$
  2. nvidia@tegra-ubuntu:~/data$ tar -xvf VOCtrainval_06-Nov-2007.tar
  3. VOCdevkit/
  4. VOCdevkit/VOC2007/
  5. VOCdevkit/VOC2007/Annotations/
  6. VOCdevkit/VOC2007/Annotations/000005.xml
  7. VOCdevkit/VOC2007/Annotations/000007.xml
  8. VOCdevkit/VOC2007/Annotations/000009.xml
  9. VOCdevkit/VOC2007/Annotations/000012.xml
  10. VOCdevkit/VOC2007/Annotations/000016.xml
  11. VOCdevkit/VOC2007/Annotations/000017.xml
  12. ・・・省略・・・
  13. VOCdevkit/VOC2007/SegmentationObject/009817.png
  14. VOCdevkit/VOC2007/SegmentationObject/009889.png
  15. VOCdevkit/VOC2007/SegmentationObject/009899.png
  16. VOCdevkit/VOC2007/SegmentationObject/009901.png
  17. nvidia@tegra-ubuntu:~/data$
  18. nvidia@tegra-ubuntu:~/data$

続いて、VOCtrainval_11-May-2012.tarを展開しましょう。

  1. nvidia@tegra-ubuntu:~/data$
  2. nvidia@tegra-ubuntu:~/data$ tar -xvf VOCtrainval_11-May-2012.tar
  3. VOCdevkit/
  4. VOCdevkit/VOC2012/
  5. VOCdevkit/VOC2012/Annotations/
  6. VOCdevkit/VOC2012/Annotations/2007_000027.xml
  7. VOCdevkit/VOC2012/Annotations/2007_000032.xml
  8. ・・・省略・・・
  9. kit/VOC2012/SegmentationObject/2011_003240.png
  10. VOCdevkit/VOC2012/SegmentationObject/2011_003246.png
  11. VOCdevkit/VOC2012/SegmentationObject/2011_003255.png
  12. VOCdevkit/VOC2012/SegmentationObject/2011_003256.png
  13. VOCdevkit/VOC2012/SegmentationObject/2011_003271.png
  14. nvidia@tegra-ubuntu:~/data$

ここで、

create_list.sh, create_data.sh を実行すると、学習用、推論用それぞれのLMDBファイルが生成されます。

  1. nvidia@tegra-ubuntu:~/caffe$ ./data/VOC0712/create_list.sh
  2. Create list for VOC2007 trainval...
  3. Create list for VOC2012 trainval...
  4. Create list for VOC2007 test...
  5. I0130 19:55:25.554071 9533 get_image_size.cpp:61] A total of 4952 images.
  6. I0130 19:55:28.213536 9533 get_image_size.cpp:100] Processed 1000 files.
  7. I0130 19:55:30.687409 9533 get_image_size.cpp:100] Processed 2000 files.
  8. I0130 19:55:33.161638 9533 get_image_size.cpp:100] Processed 3000 files.
  9. I0130 19:55:35.535889 9533 get_image_size.cpp:100] Processed 4000 files.
  10. I0130 19:55:37.793275 9533 get_image_size.cpp:105] Processed 4952 files.
  11. nvidia@tegra-ubuntu:~/caffe$

  1. nvidia@tegra-ubuntu:~/caffe$ ./data/VOC0712/create_data.sh
  2. /home/nvidia/caffe/build/tools/convert_annoset --anno_type=detection --label_type=xml --label_map_file=/home/nvidia/caffe/data/VOC0712/../../data/VOC0712/labelmap_voc.prototxt --check_label=True --min_dim=0 --max_dim=0 --resize_height=0 --resize_width=0 --backend=lmdb --shuffle=False --check_size=False --encode_type=jpg --encoded=True --gray=False /home/nvidia/data/VOCdevkit/ /home/nvidia/caffe/data/VOC0712/../../data/VOC0712/test.txt /home/nvidia/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb
  3. I0130 19:55:49.333920 9554 convert_annoset.cpp:122] A total of 4952 images.
  4. I0130 19:55:49.335022 9554 db_lmdb.cpp:35] Opened lmdb /home/nvidia/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb
  5. I0130 19:55:55.834028 9554 convert_annoset.cpp:195] Processed 1000 files.
  6. I0130 19:56:01.903102 9554 convert_annoset.cpp:195] Processed 2000 files.
  7. I0130 19:56:08.014868 9554 convert_annoset.cpp:195] Processed 3000 files.
  8. I0130 19:56:14.119681 9554 convert_annoset.cpp:195] Processed 4000 files.
  9. I0130 19:56:19.831797 9554 convert_annoset.cpp:201] Processed 4952 files.
  10. /home/nvidia/caffe/build/tools/convert_annoset --anno_type=detection --label_type=xml --label_map_file=/home/nvidia/caffe/data/VOC0712/../../data/VOC0712/labelmap_voc.prototxt --check_label=True --min_dim=0 --max_dim=0 --resize_height=0 --resize_width=0 --backend=lmdb --shuffle=False --check_size=False --encode_type=jpg --encoded=True --gray=False /home/nvidia/data/VOCdevkit/ /home/nvidia/caffe/data/VOC0712/../../data/VOC0712/trainval.txt /home/nvidia/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb
  11. I0130 19:56:22.483315 9572 convert_annoset.cpp:122] A total of 16551 images.
  12. I0130 19:56:22.484650 9572 db_lmdb.cpp:35] Opened lmdb /home/nvidia/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb
  13. I0130 19:56:29.785678 9572 convert_annoset.cpp:195] Processed 1000 files.
  14. I0130 19:56:36.772826 9572 convert_annoset.cpp:195] Processed 2000 files.
  15. I0130 19:56:43.898202 9572 convert_annoset.cpp:195] Processed 3000 files.
  16. I0130 19:56:50.940439 9572 convert_annoset.cpp:195] Processed 4000 files.
  17. I0130 19:56:57.937795 9572 convert_annoset.cpp:195] Processed 5000 files.
  18. I0130 19:57:04.921504 9572 convert_annoset.cpp:195] Processed 6000 files.
  19. I0130 19:57:11.781653 9572 convert_annoset.cpp:195] Processed 7000 files.
  20. I0130 19:57:18.983180 9572 convert_annoset.cpp:195] Processed 8000 files.
  21. I0130 19:57:25.933579 9572 convert_annoset.cpp:195] Processed 9000 files.
  22. I0130 19:57:32.910079 9572 convert_annoset.cpp:195] Processed 10000 files.
  23. I0130 19:57:39.977454 9572 convert_annoset.cpp:195] Processed 11000 files.
  24. I0130 19:57:46.941737 9572 convert_annoset.cpp:195] Processed 12000 files.
  25. I0130 19:57:53.976258 9572 convert_annoset.cpp:195] Processed 13000 files.
  26. I0130 19:58:00.762612 9572 convert_annoset.cpp:195] Processed 14000 files.
  27. I0130 19:58:07.732848 9572 convert_annoset.cpp:195] Processed 15000 files.
  28. I0130 19:58:14.741941 9572 convert_annoset.cpp:195] Processed 16000 files.
  29. I0130 19:58:18.569044 9572 convert_annoset.cpp:201] Processed 16551 files.
  30. nvidia@tegra-ubuntu:~/caffe$

ひとまず、データセットの準備はこれで完了です。

VGGNetを用いたSSDの推論

配布されている学習済みモデルmodels_VGGNet_VOC0712_SSD_300x300.tar.gzを使って、Jetson TX2での推論を行います。

models_VGGNet_VOC0712_SSD_300x300.tar.gz を解凍すると、models/VGGNet/VOC0712配下にモデルファイルがあります。このディレクトリ構成を、Caffe直下のmodelsディレクトリへ配置します。

推論を実行するには、examples/ssd配下のスクリプトscore_ssd_pascal.pyを実行します。実行中はコンソール出力されるので、リダイレクトしてあげるとログとしてファイルに残すことができるので便利です。

python examples/ssd/score_ssd_pascal.pyを実行しましょう。

  1. nvidia@tegra-ubuntu:~/caffe$ python examples/ssd/score_ssd_pascal.py > run_score_ssd_pascal212.log

続いて、ログを表示させます。

  1. nvidia@tegra-ubuntu:~/caffe$ cat run_score_ssd_pascal2.log
  2. I0211 16:47:11.902698 10532 caffe.cpp:217] Using GPUs 0
  3. I0211 16:47:11.910640 10532 caffe.cpp:222] GPU 0: NVIDIA Tegra X2
  4. I0211 16:47:12.520488 10532 solver.cpp:63] Initializing solver from parameters:
  5. train_net: "models/VGGNet/VOC0712/SSD_300x300_score/train.prototxt"
  6. test_net: "models/VGGNet/VOC0712/SSD_300x300_score/test.prototxt"
  7. test_iter: 619
  8. test_interval: 10000
  9. base_lr: 0.001
  10. display: 10
  11. max_iter: 0
  12. lr_policy: "multistep"
  13. gamma: 0.1
  14. momentum: 0.9
  15. weight_decay: 0.0005
  16. snapshot: 0
  17. snapshot_prefix: "models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300"
  18. solver_mode: GPU
  19. device_id: 0
  20. debug_info: false
  21. train_state {
  22. level: 0
  23. stage: ""
  24. ・・・省略・・・
  25. 120000.caffemodel
  26. I0211 16:47:14.007650 10532 net.cpp:761] Ignoring source layer mbox_loss
  27. I0211 16:47:14.016592 10532 caffe.cpp:251] Starting Optimization
  28. I0211 16:47:14.016697 10532 solver.cpp:294] Solving VGG_VOC0712_SSD_300x300_train
  29. I0211 16:47:14.016718 10532 solver.cpp:295] Learning Rate Policy: multistep
  30. I0211 16:47:14.471560 10532 solver.cpp:332] Iteration 0, loss = 1.36019
  31. I0211 16:47:14.471647 10532 solver.cpp:433] Iteration 0, Testing net (#0)
  32. I0211 16:47:14.484737 10532 net.cpp:693] Ignoring source layer mbox_loss
  33. I0211 17:02:26.484411 10532 solver.cpp:546] Test net output #0: detection_eval = 0.776861
  34. I0211 17:02:26.486299 10532 solver.cpp:337] Optimization Done.
  35. I0211 17:02:26.486354 10532 caffe.cpp:254] Optimization Done.

実行するのにかかった時間は約15分15秒。フレームレートに換算すると、約23fpsになります。

詳細としては、

検証画像枚数 :4952+16551枚

処理に要した秒数:915秒

それなりに、速そうですね。

Jetson TX2でPeleeを動かす

ここまでで、やっと Peleeを動かせるようになりました。

ホームディレクトリ上で Peleeのリポジトリを Cloneし、caffeの examples配下にシンボリックリンクを設定します。

  1. gitclone https://github.com/Robert-JunWang/Pelee.git
  2. ln -sf `pwd`/Pelee ~/caffe/examples/pelee

examples配下のファイルを見てみましょう。

  1. nvidia@tegra-ubuntu:~$ cd caffe/
  2. nvidia@tegra-ubuntu:~/caffe$ cd examples/
  3. nvidia@tegra-ubuntu:~/caffe/examples$ ls -l
  4. total 9144
  5. -rw-rw-r-- 1 nvidia nvidia 813348 Feb 5 19:48 00-classification.ipynb
  6. -rw-rw-r-- 1 nvidia nvidia 376291 Feb 5 19:48 01-learning-lenet.ipynb
  7. -rw-rw-r-- 1 nvidia nvidia 480501 Feb 5 19:49 02-fine-tuning.ipynb
  8. -rw-rw-r-- 1 nvidia nvidia 452886 Feb 5 19:49 brewing-logreg.ipynb
  9. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 cifar10
  10. -rw-rw-r-- 1 nvidia nvidia 1063 Feb 5 19:49 CMakeLists.txt
  11. -rw-rw-r-- 1 nvidia nvidia 1730512 Feb 5 19:49 convert_model.ipynb
  12. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 cpp_classification
  13. -rw-rw-r-- 1 nvidia nvidia 702461 Feb 5 19:48 detection.ipynb
  14. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 feature_extraction
  15. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 finetune_flickr_style
  16. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 finetune_pascal_detection
  17. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 hdf5_classification
  18. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 imagenet
  19. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 images
  20. -rw-rw-r-- 1 nvidia nvidia 898446 Feb 5 19:49 inceptionv3.ipynb
  21. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 mnist
  22. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 net_surgery
  23. -rw-rw-r-- 1 nvidia nvidia 583251 Feb 5 19:48 net_surgery.ipynb
  24. -rw-rw-r-- 1 nvidia nvidia 1539559 Feb 5 19:48 pascal-multilabel-with-datalayer.ipynb
  25. lrwxrwxrwx 1 nvidia nvidia 18 Feb 11 15:02 pelee -> /home/nvidia/Pelee ★
  26. drwxrwxr-x 3 nvidia nvidia 4096 Feb 5 19:49 pycaffe
  27. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 siamese
  28. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 ssd
  29. -rw-rw-r-- 1 nvidia nvidia 805121 Feb 5 19:49 ssd_detect.ipynb
  30. -rw-rw-r-- 1 nvidia nvidia 892397 Feb 5 19:49 ssd.ipynb
  31. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 videos
  32. drwxrwxr-x 2 nvidia nvidia 4096 Feb 11 10:57 VOC0712
  33. drwxrwxr-x 3 nvidia nvidia 4096 Feb 5 19:48 web_demo
  34. nvidia@tegra-ubuntu:~/caffe/examples$

続いて、Peleeのディレクトリの中身を確認します。

  1. nvidia@tegra-ubuntu:~/caffe/examples$ cd paelee
  2. nvidia@tegra-ubuntu:~/caffe/examples/pelee$
  3. nvidia@tegra-ubuntu:~/caffe/examples/pelee$ ls -l
  4. total 696
  5. -rw-rw-r-- 1 nvidia nvidia 583997 Feb 11 15:01 detect_eval.ipynb
  6. -rw-rw-r-- 1 nvidia nvidia 18391 Feb 11 15:01 eval_voc.py
  7. -rw-rw-r-- 1 nvidia nvidia 17490 Feb 11 15:01 feature_extractor.py
  8. -rw-rw-r-- 1 nvidia nvidia 5221 Feb 11 15:01 layer_utils.py
  9. -rw-rw-r-- 1 nvidia nvidia 11357 Feb 11 15:01 LICENSE
  10. drwxrwxr-x 3 nvidia nvidia 4096 Feb 11 15:01 model
  11. -rw-rw-r-- 1 nvidia nvidia 5831 Feb 11 15:01 peleenet.py
  12. -rw-rw-r-- 1 nvidia nvidia 3545 Feb 11 15:01 README.md
  13. drwxrwxr-x 2 nvidia nvidia 4096 Feb 11 15:01 samples
  14. drwxrwxr-x 2 nvidia nvidia 4096 Feb 11 15:01 tools
  15. -rw-rw-r-- 1 nvidia nvidia 19988 Feb 11 15:01 train_coco.py
  16. -rw-rw-r-- 1 nvidia nvidia 19779 Feb 11 15:01 train_voc.py
  17. nvidia@tegra-ubuntu:~/caffe/examples/pelee$

Peleeの検証で使用する学習済みモデルをダウンロードし、cafee/models配下に配置します。

★が付いているものが今回使用するものです。

  1. nvidia@tegra-ubuntu:~/caffe/models$ ls -l
  2. total 11088
  3. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 bvlc_alexnet
  4. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 bvlc_googlenet
  5. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 bvlc_reference_caffenet
  6. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:49 bvlc_reference_rcnn_ilsvrc13
  7. drwxrwxr-x 2 nvidia nvidia 4096 Feb 5 19:48 finetune_flickr_style
  8. drwxrwxr-x 3 nvidia nvidia 4096 Feb 11 15:22 pelee ★
  9. drwxrwxr-x 2 nvidia nvidia 4096 Feb 12 20:57 pelee_coco ★
  10. drwxrwxr-x 2 nvidia nvidia 4096 Feb 12 20:57 pelee_coco_voc ★
  11. drwxrwxr-x 2 nvidia nvidia 4096 Feb 12 20:58 pelee_voc ★
  12. drwxrwxr-x 3 nvidia nvidia 4096 Feb 11 13:31 VGGNet
  13. drwxr-xr-x 2 nvidia nvidia 4096 Feb 12 20:58 voc
  14. nvidia@tegra-ubuntu:~/caffe/models$

配布されているモデルの中から、PASCAL VOC 07+12を指定して実行しました。

  1. nvidia@tegra-ubuntu:~/caffe$ python examples/pelee/eval_voc.py --weights=models/pelee_voc/pelee_304x304_acc7094.caffemodel
  2. args: Namespace(arch='pelee', batch_size=8, image_size=304, kernel_size=1, lr=0.005, posfix='', run_soon=True, step_value=[80000, 100000, 120000], weight_decay=0.0005, weights='models/pelee_voc/pelee_304x304_acc7094.caffemodel')
  3. I0212 21:24:18.716425 1733 caffe.cpp:217] Using GPUs 0
  4. I0212 21:24:18.726912 1733 caffe.cpp:222] GPU 0: NVIDIA Tegra X2
  5. I0212 21:24:19.560145 1733 solver.cpp:63] Initializing solver from parameters:
  6. train_net: "models/pelee/VOC0712/SSD_304x304_score/train.prototxt"
  7. test_net: "models/pelee/VOC0712/SSD_304x304_score/test.prototxt"
  8. test_iter: 619
  9. test_interval: 2000
  10. base_lr: 0.005
  11. display: 10
  12. max_iter: 0
  13. lr_policy: "multistep"
  14. gamma: 0.1
  15. momentum: 0.9
  16. weight_decay: 0.0005
  17. snapshot: 0
  18. snapshot_prefix: "models/pelee/VOC0712/SSD_304x304/pelee_SSD_304x304"
  19. solver_mode: GPU
  20. device_id: 0
  21. debug_info: false
  22. train_state {
  23. level: 0
  24. stage: ""
  25. }
  26. snapshot_after_train: false
  27. test_initialization: true
  28. average_loss: 10
  29. ・・・省略・・・
  30. I0212 21:24:34.341764 1733 upgrade_proto.cpp:80] Successfully upgraded batch norm layers using deprecated params.
  31. I0212 21:24:34.349417 1733 net.cpp:761] Ignoring source layer mbox_loss
  32. I0212 21:24:34.353690 1733 caffe.cpp:251] Starting Optimization
  33. I0212 21:24:34.353741 1733 solver.cpp:294] Solving pelee_SSD_304x304_train
  34. I0212 21:24:34.353754 1733 solver.cpp:295] Learning Rate Policy: multistep
  35. I0212 21:24:40.287559 1733 solver.cpp:332] Iteration 0, loss = 1.68553
  36. I0212 21:24:40.287647 1733 solver.cpp:433] Iteration 0, Testing net (#0)
  37. I0212 21:24:40.326001 1733 net.cpp:693] Ignoring source layer mbox_loss
  38. I0212 21:28:22.629385 1733 solver.cpp:546] Test net output #0: detection_eval = 0.70909
  39. I0212 21:28:22.633003 1733 solver.cpp:337] Optimization Done.
  40. I0212 21:28:22.633077 1733 caffe.cpp:254] Optimization Done.
  41. nvidia@tegra-ubuntu:~/caffe$

こちらの実行時間は4分4秒(244秒)で完了しており、FPS換算では88fpsと、

https://github.com/Robert-JunWang/Pelee に書かれているVOC 2007の結果ほどではないものの、かなり高速に処理されているようです。

そうはいっても、SSDの915秒に比べて、244秒なので約1/4です。

価値のある実証ができました。

まとめ

ひとまず、ここまでで Peleeによる Object Detectionを実施することができました。

かなり高速に処理できているのがわかりますね。

次回のブログでは、これに続き、リアルタイムでの処理として、Webカメラをつなぐことによって、リアルタイム物体検出を実際に動かしたブログを投稿させていただきます。

なお、少し真面目な免責事項についてですが、

上記の内容を利用するにあたって、弊社マクニカは一切の責任を負いませんのでご注意ください。