DeepStream

이전에 DeepStream 기본 예제에서 Jetson TX2 내장 카메라인 CSI 의 영상 입력으로부터 ResNet 을 이용한 객체 감지 네트워크를 구동해 보았습니다. 이번에는 ResNet보다 계산 성능과 mAP 면에서 좀 더 활용도가 높은 Yolo-v3 를 활용하여 보겠습니다. 영상 입력으로부터 DeepStream Yolo-v3 Inference 를 수행해 보면서 DeepStream 과 Yolo-v3 Object Detection 에 대해서도 살펴보면 좋겠습니다.

Yolo-v3 에 대한 자세한 정보는 여기에서 살펴보시기 바랍니다.


DeepStream Yolo-v3 Inference 준비

DeepStream 설치를 완료하였다면 Yolo-v2 와 Yolo-v3 를 이용해 Inference하기 위한 기본 설정과 코드가 준비되어 있을 것입니다. 해당 디렉토리로 이동합니다.

$ cd /opt/nvidia/deepstream/deepstream-5.0/sources/objectDetector_Yolo

디렉토리 이동하여 파일 목록을 살펴보면 Yolo-v3 네트워크를 구동할 수 있는 DeepStream config 파일 (deepstream_app_config.yoloV3.txt) 을 확인할 수 있습니다. 그런데 막상 실행해 보면 구동이 되지 않습니다. Yolo 알고리즘을 구동하기 위해 사전에 준비할 사항이 있기 때문입니다.

Yolo 시리즈 cfg, model 다운로드

디렉토리 내에 보면 prebuild.sh 파일이 있습니다. 파일 내용을 한번 살펴 보겠습니다.

#!/usr/bin/env bash

...

# Download yolo weights
# For yolo v2,
echo "Downloading yolov2 config and weights files ... "
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov2.cfg -q --show-progress
wget https://pjreddie.com/media/files/yolov2.weights -q --show-progress

# For yolo v2 tiny,
echo "Downloading yolov2-tiny config and weights files ... "
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov2-tiny.cfg -q --show-progress
wget https://pjreddie.com/media/files/yolov2-tiny.weights -q --show-progress

# For yolo v3,
echo "Downloading yolov3 config and weights files ... "
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg -q --show-progress
wget https://pjreddie.com/media/files/yolov3.weights -q --show-progress

# For yolo v3 tiny,
echo "Downloading yolov3-tiny config and weights files ... "
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3-tiny.cfg -q --show-progress
wget https://pjreddie.com/media/files/yolov3-tiny.weights -q --show-progress

바로 yolo-v2, yolo-v2 tiny, yolo-v3, yolo-v3 tiny 각각의 cfg와 model 파일을 다운로드하는 커맨드입니다. 우리는 yolo-v3 를 실행하고자 하므로 아래의 커맨드만 실행해 주면 됩니다.

$ wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg -q --show-progress
$ wget https://pjreddie.com/media/files/yolov3.weights -q --show-progress

또는 전체 cfg 와 model 을 다운받아도 상관 없습니다.

$ ./prebuild.sh

nvdsinfer_custom_impl_Yolo 빌드

Yolo-v3 cfg와 모델을 다운로드 한 다음에는 nvdsinfer_custom_impl_Yolo 디렉토리로 이동하여 라이브러리를 빌드해야 합니다.

$ cd /opt/nvidia/deepstream/deepstream-5.0/sources/objectDetector_Yolo/nvdsinfer_custom_impl_Yolo

디렉토리 내에 Makefile 이 준비되어 있습니다. 그런데 라이브러리 빌드를 하려고 하면 다음과 같은 메시지가 나오면서 build가 안됩니다.

$ make
Makefile:25: *** "CUDA_VER is not set".  Stop.

CUDA_VER 환경변수를 설정해야 합니다. 환경 변수는 빌드 시점에 한 번만 필요하므로 현재 설치된 CUDA 버전을 확인하여 설정해 주도록 하겠습니다.

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

가장 마지막 줄에 release 10.2 부분이 CUDA 버전입니다. 10.2 버전임을 현재 빌드하고자 하는 콘솔에 설정해 주겠습니다.

$ export CUDA_VER='10.2'

이제 다시 build 해 보겠습니다.

$ make
...
g++ -o libnvdsinfer_custom_impl_Yolo.so  nvdsinfer_yolo_engine.o nvdsparsebbox_Yolo.o yoloPlugins.o
trt_utils.o yolo.o kernels.o -shared -Wl,--start-group -lnvinfer_plugin -lnvinfer -lnvparsers
-L/usr/local/cuda-10.2/lib64 -lcudart -lcublas -lstdc++fs -Wl,--end-group

libnvdsinfer_custom_impl_Yolo.so 파일이 생성되었습니다. 이제 DeepStream Yolo-v3 Inference 하기 위한 모든 준비가 끝났습니다.


DeepStream Yolo-v3 Inference 시험

제공되는 DeepStream Yolo-v3 Config 파일은 Egl 출력 즉, 화면상에 객체 감지 결과가 표시되는 sink 만 연결하고 있습니다.

File Sink 추가

시험용 DeepStream config 파일을 복사하여 mp4 파일로 객체 감지 결과를 저장하도록 약간 수정해 보도록 하겠습니다.

$ cp deepstream_app_config_yoloV3.txt my_deepstream_config_yolov3.txt
$ vi my_deepstream_config_yolov3.txt

DeepStream config 파일에서 [sink0] 블럭과 [osd] 블럭 사이에 [sink1] 블럭을 다음과 같이 추가해 줍니다.

...

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File
type=2
sync=0
source-id=0
gpu-id=0
nvbuf-memory-type=0

[sink1]
enable=1
type=3        # 3: File
container=1   # 1: mp4
codec=1       # 1: h.264
enc-type=0    # 0: Hardware
sync=0
bitrate=2000000
profile=0     # 0: Baseline
output-file=yolov3-infer.mp4
source-id=0

[osd]
enable=1
gpu-id=0
border-width=1
text-size=15
...

DeepStream Yolo-v3 Inference 실행

실행하기 전에 yolov3.cfg 에서 batch 와 subdivisions 를 조정해 주어야 합니다.

$ vi yolov3.cfg

다음과 같이 Training용 batch 크기와 subdivisions 크기를 Testing 용으로 수정합니다.

[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=8
width=608
height=608
...

이전에 기본 예제를 이용해 시험했던 것과 유사하게 다음의 커맨드로 yolo-v3 추론을 실행할 수 있습니다.

$ deepstream-app -c my_deepstream_config_yolov3.txt

DeepStream Yolo-v3 Inference 결과

DeepStream 을 이용해 실행해 보면 sink0 에 설정한 Egl 출력과 sink1 에 설정한 mp4 파일 출력을 각각 얻을 수 있습니다.

EglSink 결과

DeepStream Yolo-v3 Inference EglSink 결과
DeepStream Yolo-v3 Inference EglSink 결과

File Sink 결과

다른 영상을 이용한 예제

DeepStream 설정 파일의 source 블럭의 설정을 변경하여 다양한 영상 소스를 입력으로 추론 시험을 할 수 있습니다. 영상 파일을 비롯해 RTSP 스트림, Linux V4L2 디바이스, Jetson 장비의 CSI 카메라 입력 등 다양한 형태의 영상 입력을 source 설정에서 사용할 수 있습니다.


Jay

Jay

S/W Engineer!!

10개의 댓글

RiceShrimp · 2021-07-26 20:37

$ make 과정에서 아래와 같은 에러가 뜨면서 안되는데 이유를 알 수 있을까요?

g++ -c -o nvdsinfer_yolo_engine.o -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations -I../../includes -I/usr/local/cuda-10.2/include nvdsinfer_yolo_engine.cpp
Assembler messages:
Fatal error: can’t create nvdsinfer_yolo_engine.o: 허가 거부
Makefile:51: recipe for target ‘nvdsinfer_yolo_engine.o’ failed
make: *** [nvdsinfer_yolo_engine.o] Error 1

허가 거부가 떠서
$ sudo chmod +x 디렉토리
하여도 똑같은 에러가 뜨더라구요 ㅠㅠ

    Jay

    Jay · 2021-07-27 09:59

    안녕하세요. 보통 저런 오류는 디스크에 쓰기 권한이 없는 경우에 발생합니다.
    sudo chmod +x 대신 sudo chmod +w 커맨드로 해보세요.

살려주세요 · 2021-11-25 13:09

안녕하세요 저도 make 를 하면 에려가 발생합니다
저는 초보여서 sudo chmod +w 하라는 의미를 잘 모르겠습니다
그래서 sudo chmod +w /opt/nvidia/deepstream/deepstream /5.0/sources/objectDetector_Yolo/nvdsinfer_custom_impl_Yolo 를 하고 make 를 실행해봤지만 여전히 되지 않습니다

도와주세요 ㅠㅠ

    살려주세요 · 2021-11-25 13:12

    https://durian9s-coding-tree.tistory.com/180 를 참고하였지만 이 역시 잘 되지 않습니다 ㅠ

    Jay

    Jay · 2021-11-25 14:27

    초보라고 하시니 망망한 정보의 바다에서 표류하고 있는 어려움이 느껴지는 것 같습니다.
    질문에 에러 메시지가 없어서 정확한 내용을 판단하기는 어려울 것 같습니다. 답글에 남겨 놓으신
    chmod +w 는 하나의 파일에 쓰기(writing) 권한을 할당하기 위한 커맨드입니다. 아마도 의도한 항목이 디렉토리일 수도 있을 것 같은데 어떤 디렉토리의 하위 모든 항목에 권한을 할당하기 위해서는 chmod 커맨드에 -R 옵션을 부여해야만 합니다.
    참고로 unix 커맨드인 chmod 는 Change Mode 를 줄여서 커맨드로 빌드한 것입니다.
    -R 옵션의 R은 recursive를 의미합니다.
    sudo chmod +w -R [DIRECTORY PATH]
    이런 식으로 사용할 수 있습니다.

      살려주세요 · 2021-11-25 16:54

      답변감사합니다
      위에 분과 같은 에러가 발생합니다!

        살려주세요 · 2021-11-26 11:05

        성공했습니다! 하지만 FPS 3~4 정도가 나오는데 제대로 한게 맞는가요?

          Jay

          Jay · 2021-11-26 11:24

          축하합니다 🙂 inference가 잘 되고 bounding box가 표시되면 일단 잘 된 것이겠지요. FPS가 생각한 것보다 낮다면 설정이나 성능 문제로 따로 살펴볼 문제일테고요.

NVIDIA Power Mode별 Jetson TX2 성능 측정 - voidint.com · 2020-08-14 15:03

[…] 지원하는 4가지 유형의 전력 관리 모드에 대해 살펴보았습니다. 그리고 DeepStream YOLOv3 구동 예제 를 통해서는 간단한 예제 영상에 대한 추론을 수행해 볼 수 […]

NVIDIA Jetson TX2 Yolo-v4 Inference Test - voidint.com · 2020-09-28 14:48

[…] DeepStream Yolo-v3 Inference 예제 보기 […]

답글 남기기

Avatar placeholder