みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

コワーキングスペースの「混雑度」を検出する(4)

昨年友人より, 某コワーキングスペースの混雑度を見える化したいので, 機械学習部分を手伝ってほしいとの依頼があった.
そこで, 混雑度を測るために, 各スペースの人物検出を行い, 定員に対してどの程度の人がいるか検知することにした.


関連記事:
コワーキングスペースの「混雑度」を検出する(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にも対応しているようだ.

あとは, 正しく動くか, 処理速度はどうか.

[入力画像]
f:id:moonlight-aska:20210207093049j:plain:w400

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でエラーの出まくっている方へ)