YOLO

YOLOv3 on Jetson AGX Xavier ์„ฑ๋Šฅ ํ‰๊ฐ€

18๋…„ 4์›”์— ๊ณต๊ฐœ๋œ YOLOv3๋ฅผ ์ตœ์‹  embedded board์ธ Jetson agx xavier์—์„œ ๊ตฌ๋™์‹œ์ผœ์„œ FPS๋ฅผ ์ธก์ •ํ•ด ๋ณธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  tegra์ฝ”์–ด๊ฐ€ ์•„๋‹Œ Geforece 1080๊ณผ์˜ ์„ฑ๋Šฅ ๋น„๊ต๋„ ์ˆ˜ํ–‰ํ•ด ๋ณธ๋‹ค.

YOLOv3 ๊ด€๋ จ ์ •๋ณด

SSD๊ฐ€ ์ฃผ๋ฅ˜๊ฐ€๋˜๊ณ  ์•ฝ๊ฐ„ ๋น„์ฃผ๋ฅ˜๊ฐ€๋œ deep learning๊ธฐ๋ฐ˜ object detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์“ฐ์ง€์•Š๊ณ  ๋…์ž์ ์ด๋ฉฐ ์˜์กด์„ฑ์ด ๊ฑฐ์˜์—†๋Š” ๊น”๋”ํ•œ ์ฝ”๋“œ์ด๋ฏ€๋กœ ํ–ฅํ›„ ๋ถ„์„ํ•˜๊ธฐ ์šฉ์ดํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉ ํ•œ๋‹ค.

pretrained weights๋“ค์€ ์•„๋ž˜์˜ ํ‘œ์™€ ๊ฐ™๊ณ  ๊ฐ๊ฐ์€ Link์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-01-10 แ„‹แ…ฉแ„’แ…ฎ 3.03.00

NVIDIA Jetson Xavier์—์„œ YOLOv3 ๋‹ค์šด ๋ฐ ์ปดํŒŒ์ผ

์†Œ์Šค ๋ฐ ๋ชจ๋ธ ๋‹ค์šด

์šฐ์„ , ์•„๋ž˜์ฃผ์†Œ์—์„œ ์†Œ์Šค์ฝ”๋“œ์™€ ๋ชจ๋ธ ์›จ์ดํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

git clone https://github.com/pjreddie/darknet # ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ
cd darknet
wget https://pjreddie.com/media/files/yolov3.weights # weights ๋‹ค์šด๋กœ๋“œ

Makefile ์ˆ˜์ •

๊ทธ ๋‹ค์Œ Makefile์„ ์ˆ˜์ •ํ•œ๋‹ค. ์ด ๋•Œ CUDA Compute Capability๋ฅผ ๋งž์ถฐ์„œ ์ˆ˜ํ–‰ ํ•ด์•ผํ•œ๋‹ค.

NVIDIA GPU: CUDA Compute Capability์˜ ์ดํ•ด CUDA๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ Compute Capability์˜ ์ดํ•ด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์•„ํ‚คํ…์ณ๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค.

  • nvcc fatal: Unsupported gpu architecture 'compute_XX' ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ nvcc ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ ํ•  ๋•Œ FLAG๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

  • -gencode arch=compute_XX, code=[sm_XX, compute_XX]์ด๋‹ค.

์›ํ•˜๋Š” ์žฅ์น˜์— ๋งž์ถฐ์„œ ์ ํ•œํ•œ ์ฝ”๋“œ๋ฅผ NVIDIA CUDA-GPUs์ฐพ์•„์„œ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. GeForece-1080์˜ ๊ฒฝ์šฐ 6.1์ด๋ฏ€๋กœ-gencode arch=compute_61, code=[sm_61, compute_61]์œผ๋กœ ์‚ฝ์ž…ํ•ด์„œ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉํ•  ๋ณด๋“œ๋Š” tegra ๊ฒŒ์—ด์ธ๋ฐ Jetson Xavier๋Š” ์•„์ง ๊ฒ€์ƒ‰์ด ์•ˆ ๋œ๋‹ค. ํฌ๋Ÿผ์—์„œ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ์ฝ”๋“œ๋Š” -gencode arch=compute_72,code=sm_72์ด๋‹ค.

์ถ”๊ฐ€๋กœ, ์–ด๋–ค ๋จธ์‹ ์—์„œ ์ •ํ™•ํžˆ ๋Œ์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค์ •ํ•˜์—ฌ ์ปดํŒŒ์ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ YOLOv3์˜ makefile์˜ ๊ตฌ์กฐ์ด๋‹ค. ์‚ฌ์šฉํ•  Jetson Xavier์šฉ์€ ์—†์œผ๋ฏ€๋กœ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž.

ARCH= -gencode arch=compute_30,code=[sm_30,compute_30] \
      -gencode arch=compute_35,code=[sm_35,compute_35] \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52] \
      -gencode arch=compute_61,code=[sm_61,compute_61] \
      -gencode arch=compute_72,code=[sm_72,compute_72]

์ƒ๋‹จ์˜ OPENCV=1 GPU=1 CUDNN=1 ์ด ์„ธ๊ฐœ ๋ชจ๋‘ ํ™œ์„ฑํ™” ํ•œ๋‹ค. ์†๋„๋ฅผ ์œ„ํ•ด์„  gpu์™€ cudnn์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  real-time ๋ฐ๋ชจ๋ฅผ ์œ„ํ•ด์„œ opencv๋„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

์ปดํŒŒ์ผ

๋™์ž‘ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ์„ค์ •

sudo nvpmodel -m 0
jetson_clocks.sh

make -j4 ๋ช…๋ น์–ด ์ˆ˜ํ–‰

nvidia@jetson-0423718017159:~/Computer_Vision_Project/yolov3$ make -j4
mkdir -p obj
mkdir -p backup
mkdir -p results
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
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/utils.c -o obj/utils.o
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/cuda.c -o obj/cuda.o
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/deconvolutional_layer.c -o obj/deconvolutional_layer.o
./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:947:57: note: declared here
 extern __CUDA_DEPRECATED __host__ cudaError_t CUDARTAPI cudaThreadSynchronize(void);
                                                         ^~~~~~~~~~~~~~~~~~~~~
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/convolutional_layer.c -o obj/convolutional_layer.o
...
...
...
bj/col2im_kernels.o obj/blas_kernels.o obj/crop_layer_kernels.o obj/dropout_layer_kernels.o obj/maxpool_layer_kernels.o obj/avgpool_layer_kernels.o
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 obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/instance-segmenter.o obj/darknet.o libdarknet.a -o darknet -lm -pthread  `pkg-config --libs opencv` -lstdc++ -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand -lcudnn -lstdc++  libdarknet.a

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด data ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— ๋ช‡๊ฐœ์˜ ์ƒ˜ํ”Œ ์ด๋ฏธ์ง€๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์ด๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋น„๋””์˜ค ์˜์ƒ์„ ๋‹ค์šด๋ฐ›์•„์„œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์‹คํ–‰ ๋ฐ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

์ด๋ฏธ์ง€ ํ…Œ์ŠคํŒ…

์•„๋ž˜๋Š” ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด์„œ xaiver์™€ geforece์—์„œ ๊ฐ๊ฐ ์ˆ˜ํ–‰ํ•ด๋ณธ ๊ฒฐ๊ณผ์ด๋‹ค.

  • Xavier: 0.164729

  • Geforce-1080: 0.051647

๊ทธ๋ƒฅ darknet ์ž์ฒด๋ฅผ ๋‚ ๊ฒƒ์œผ๋กœ ๋Œ๋ ค์„œ ์„ฑ๋Šฅ์ฐจ์ด๋Š” 3๋ฐฐ์ •๋„ ๋ฐœ์ƒํ•œ๋‹ค. ์†Œ๋น„์ „๋ ฅ์ด 30W๋ž‘ 120W์ˆ˜์ค€์˜ ์ฐจ์ด์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์ฐจ์ด๋Š” ์ ๋‹ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

xavier

`./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg`
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in  `0.164729` seconds.

Geforce-1080

Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.051647 seconds.

์˜์ƒ ํ…Œ์ŠคํŒ…

detector๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์˜์ƒ๊ณผ Camera๋กœ ์‹ค์‹œ๊ฐ„ ํ…Œ์ŠคํŒ…๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

๋™์˜์ƒ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด YOLOv3๋ฅผ xavier์—์„œ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ๋Œ€๋žต 5~6 FPS๊ฐ€ ์ธก์ • ๋œ๋‹ค.

video demo

๋ผ์ด๋ธŒ ๋ฐ๋ชจ๋Š” Youtube์—์„œ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

[1] ๊ณต์‹ wiki [2] JK Jung's blog, YOLOv3 on Jetson TX2 [3] [์ค‘๊ตญ ์‚ฌ์ดํŠธ] (http://takesan.hatenablog.com/entry/2018/10/07/003252)

Last updated

Was this helpful?