昨年友人より, 某コワーキングスペースの混雑度を見える化したいので, 機械学習部分を手伝ってほしいとの依頼があった.
そこで, 混雑度を測るために, 各スペースの人物検出を行い, 定員に対してどの程度の人がいるか検知することにした.
関連記事:
・コワーキングスペースの「混雑度」を検出する(1)
・コワーキングスペースの「混雑度」を検出する(2)
・コワーキングスペースの「混雑度」を検出する(3)
・コワーキングスペースの「混雑度」を検出する(4)
Jetson Nano 2GB版で人物検出を動かそうと, モデルのコンパクト化などGPUメモリの使用量削減などを検討し始めた.
SSD学習済モデルで高速化を少し試しているがうまくいっていないので, バックアップ策として以前PeopleCounter[1]で使用したYOLOv3がJetson Nano 2GB版で使用できないか検討してみた.
1. オリジナルのリポジトリ
以前, Jetson NanoでYOLOv3をビルドしたときに, 2種類のリポジトリがあることを記したが, 今回もオリジナルのリポジトリをまず試してみた.
github.com
前回[2]と同様の手順でビルドしたが, エラーが発生!!
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv` -DGPU -I/usr/local/cuda/include/ -DCUDNN -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -c ./src/gemm.c -o obj/gemm.o Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable No package 'opencv' found ./src/gemm.c: In function ‘time_gpu’: ./src/gemm.c:232:9: warning: ‘cudaThreadSynchronize’ is deprecated [-Wdeprecated-declarations] cudaThreadSynchronize(); ^~~~~~~~~~~~~~~~~~~~~ In file included from /usr/local/cuda/include/cuda_runtime.h:96:0, from include/darknet.h:11, from ./src/utils.h:5, from ./src/gemm.c:2: /usr/local/cuda/include/cuda_runtime_api.h:957:57: note: declared here extern __CUDA_DEPRECATED __host__ cudaError_t CUDARTAPI cudaThreadSynchronize(void); ^~~~~~~~~~~~~~~~~~~~~ (省略) Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable No package 'opencv' found ./src/convolutional_layer.c: In function ‘cudnn_convolutional_setup’: ./src/convolutional_layer.c:148:5: warning: implicit declaration of function cudnnGetConvolutionForwardAlgorithm’; did you mean ‘cudnnGetConvolutionForwardAlgorithm_v7’? [-Wimplicit-function-declaration] cudnnGetConvolutionForwardAlgorithm(cudnn_handle(), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cudnnGetConvolutionForwardAlgorithm_v7 ./src/convolutional_layer.c:153:13: error: ‘CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT’ undeclared (first use in this function); did you mean ‘CUDNN_CONVOLUTION_FWD_ALGO_DIRECT’? CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CUDNN_CONVOLUTION_FWD_ALGO_DIRECT compilation terminated due to -Wfatal-errors. Makefile:90: recipe for target 'obj/convolutional_layer.o' failed make: *** [obj/convolutional_layer.o] Error 1
少し調べてみると, Jetson Nano 2GB版のJetPack 4.4では, opencv4, cuDNN 8.0になり仕様が変わったようだ.
ということで, Makefileを修正し再度ビルド.
[修正箇所]
GPU=1 CUDNN=0 OPENCV=1 OPENMP=0 DEBUG=0 (省略) ifeq ($(OPENCV), 1) COMMON+= -DOPENCV CFLAGS+= -DOPENCV LDFLAGS+= `pkg-config --libs opencv4` -lstdc++ COMMON+= `pkg-config --cflags opencv4` endif
しかし, またまたエラー.
(省略) PIC -Ofast -DOPENCV -DGPU -c ./src/iseg_layer.c -o obj/iseg_layer.o g++ -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv4` -DGPU -I/usr/local/cuda/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -c ./src/image_opencv.cpp -o obj/image_opencv.o ./src/image_opencv.cpp:12:1: error: ‘IplImage’ does not name a type; did you mean ‘image’? IplImage *image_to_ipl(image im) ^~~~~~~~ image compilation terminated due to -Wfatal-errors. Makefile:87: recipe for target 'obj/image_opencv.o' failed make: *** [obj/image_opencv.o] Error 1
どうもこちらの記事[4]によると, OpenCV 3.4あたりからこのようなエラーがでるようだ.
Makefileで"OPENCV=0"にすればなんとかビルドは通ったが, 残念ながら実行すると落ちてしまう.
user@user-desktop:~/darknet$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg layer filters size input output 0 conv 32 3 x 3 / 1 608 x 608 x 3 -> 608 x 608 x 32 0.639 BFLOPs 1 conv 64 3 x 3 / 2 608 x 608 x 32 -> 304 x 304 x 64 3.407 BFLOPs 2 conv 32 1 x 1 / 1 304 x 304 x 64 -> 304 x 304 x 32 0.379 BFLOPs 3 conv 64 3 x 3 / 1 304 x 304 x 32 -> 304 x 304 x 64 3.407 BFLOPs 4 res 1 304 x 304 x 64 -> 304 x 304 x 64 Killed
2. オリジナルをフォークしたリポジトリ
オリジナルのリポジトリのソースは残念ながら動きそうにないので, もう一方のリポジトリのソースを試してみた.
github.com
こちらは以前と同様にMakefileを変更して, ビルドすると一発でOK!!
OpenCV4やcuDNN8.0にも対応しているようだ.
あとは, 正しく動くか, 処理速度はどうか.
[入力画像]
user@user-desktop:~/darknet$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg CUDA-version: 10020 (10020), cuDNN: 8.0.0, GPU count: 1 OpenCV version: 4.1.1 0 : compute_capability = 530, cudnn_half = 0, GPU: NVIDIA Tegra X1 net.optimized_memory = 0 mini_batch = 1, batch = 1, time_steps = 1, train = 0 layer filters size/strd(dil) input output 0 conv 32 3 x 3/ 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BF 1 conv 64 3 x 3/ 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BF (省略) 104 conv 256 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 256 1.595 BF 105 conv 255 1 x 1/ 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BF 106 yolo [yolo] params: iou loss: mse (2), iou_norm: 0.75, obj_norm: 1.00, cls_norm: 1.00, delta_norm: 1.00, scale_x_y: 1.00 Total BFLOPS 65.879 avg_outputs = 532444 Allocate additional workspace_size = 52.43 MB Loading weights from yolov3.weights... seen 64, trained: 32013 K-images (500 Kilo-batches_64) Done! Loaded 107 layers from weights-file Detection layer: 82 - type = 28 Detection layer: 94 - type = 28 Detection layer: 106 - type = 28 data/dog.jpg: Predicted in 3921.170000 milli-seconds. bicycle: 99% dog: 100% truck: 94% (predictions:7143): Gtk-WARNING **: 23:53:44.484: cannot open display:
問題なく, 動いているようだ.
今回の用途であれば, 処理速度も特に問題ないレベル.
JetPack 4.4以降でYOLOv3を利用するなら, オリジナルをフォークしたリポジトリのコードを使用すべし...
----
[1] ピープルカウンタを考えてみる(6)~(8)
[2] Jetson NanoでIntel RealSenseを試してみる(2)
[3] 【2020年版】NVIDIA Jetson Nano JetPackのバージョン情報まとめ、JetPack 4.4は仕様変更の影響が大きい
[4] Opencv 3.4.0のインストール(darknetでエラーの出まくっている方へ)
Pythonディープラーニングシステム実装法-Kerasによる画像・一般データ分類システムの構築-(Keras2.4系以降対応) (設計技術シリーズ)
|