์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Ultralytics YOLOv8 NVIDIA Jetson์—์„œ DeepStream SDK ์‚ฌ์šฉ ๋ฐ TensorRT

์ด ์ข…ํ•ฉ ๊ฐ€์ด๋“œ์—์„œ๋Š” DeepStream SDK ๋ฐ TensorRT ์„ ์‚ฌ์šฉํ•˜์—ฌ NVIDIA Jetson ์žฅ์น˜์— Ultralytics YOLOv8 ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” TensorRT ์„ ์‚ฌ์šฉํ•˜์—ฌ Jetson ํ”Œ๋žซํผ์—์„œ ์ถ”๋ก  ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

NVIDIA Jetson์˜ DeepStream

์ฐธ๊ณ 

์ด ๊ฐ€์ด๋“œ๋Š” JP5.1.3 JetPack ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” NVIDIA Jetson Orin NX 16GB ๊ธฐ๋ฐ˜ Seeed Studio reComputer J4012์™€ JP4.6.4 JetPack ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” NVIDIA Jetson Nano 4GB ๊ธฐ๋ฐ˜ Seeed Studio reComputer J1020 v2๋กœ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฐ ๋ ˆ๊ฑฐ์‹œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  NVIDIA ์ ฏ์Šจ ํ•˜๋“œ์›จ์–ด ๋ผ์ธ์—…์—์„œ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

NVIDIA DeepStream์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

NVIDIA์˜ DeepStream SDK๋Š” AI ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ ์„ผ์„œ ์ฒ˜๋ฆฌ, ๋น„๋””์˜ค, ์˜ค๋””์˜ค ๋ฐ ์ด๋ฏธ์ง€ ์ดํ•ด๋ฅผ ์œ„ํ•œ GStreamer ๊ธฐ๋ฐ˜์˜ ์™„๋ฒฝํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„ ํˆดํ‚ท์ž…๋‹ˆ๋‹ค. IVA(์ง€๋Šฅํ˜• ๋น„๋””์˜ค ๋ถ„์„) ์•ฑ๊ณผ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋น„์ „ AI ๊ฐœ๋ฐœ์ž, ์†Œํ”„ํŠธ์›จ์–ด ํŒŒํŠธ๋„ˆ, ์Šคํƒ€ํŠธ์—… ๋ฐ OEM์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์‹ ๊ฒฝ๋ง๊ณผ ์ถ”์ , ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ, ๋น„๋””์˜ค ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๊ธฐํƒ€ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ํ†ตํ•ฉํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๋น„๋””์˜ค, ์ด๋ฏธ์ง€, ์„ผ์„œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฅ์ŠคํŠธ๋ฆผ์˜ ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ์ง€์›์€ ์˜จํ”„๋ ˆ๋ฏธ์Šค, ์—ฃ์ง€, ํด๋ผ์šฐ๋“œ์—์„œ ๋น„์ „ AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์„œ๋น„์Šค๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑด

์ด ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์ „์—:

ํŒ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Jetson ์žฅ์น˜์— DeepStream SDK๋ฅผ ์„ค์น˜ํ•˜๋Š” Debian ํŒจํ‚ค์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Jetson์˜ DeepStream SDK(์•„์นด์ด๋ธŒ) ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „์˜ DeepStream์— ์•ก์„ธ์Šคํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋Œ€ํ•œ DeepStream ๊ตฌ์„ฑ YOLOv8

์—ฌ๊ธฐ์—์„œ๋Š” YOLO ๋ชจ๋ธ์— ๋Œ€ํ•œ NVIDIA DeepStream SDK ์ง€์›์„ ํฌํ•จํ•˜๋Š” marcoslucianops/DeepStream-Yolo GitHub ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์—ฌํ•ด ์ฃผ์‹  marcoslucianops์˜ ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

  1. ์ข…์†์„ฑ ์„ค์น˜

    pip install cmake
    pip install onnxsim
    
  2. ๋‹ค์Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    cd DeepStream-Yolo
    
  3. YOLOv8 ๋ฆด๋ฆฌ์Šค์—์„œ ์›ํ•˜๋Š” ํƒ์ง€ ๋ชจ๋ธ(.pt)์„ Ultralytics YOLOv8 ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ๋Š” yolov8s.pt๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt
    

    ์ฐธ๊ณ 

    ์‚ฌ์šฉ์ž ์ง€์ • ํ›ˆ๋ จ๋œ YOLOv8 ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ๋ชจ๋ธ์„ ๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜ ONNX

    python3 utils/export_yoloV8.py -w yolov8s.pt
    

    ์œ„์˜ ๋ช…๋ น์— ์•„๋ž˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.

    DeepStream 6.0.1์˜ ๊ฒฝ์šฐ opset 12 ์ดํ•˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ opset์€ 16์ž…๋‹ˆ๋‹ค.

    --opset 12
    

    ์ถ”์ • ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด(๊ธฐ๋ณธ๊ฐ’: 640)

    -s SIZE
    --size SIZE
    -s HEIGHT WIDTH
    --size HEIGHT WIDTH
    

    1280์˜ ์˜ˆ:

    -s 1280
    or
    -s 1280 1280
    

    ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด ONNX ๋ชจ๋ธ(DeepStream >= 6.0)

    --simplify
    

    ๋™์  ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด(DeepStream >= 6.1)

    --dynamic
    

    ์ •์  batch-size๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด(batch-size = 4์˜ ์˜ˆ)

    --batch 4
    
  5. ์„ค์น˜๋œ JetPack ๋ฒ„์ „์— ๋”ฐ๋ผ CUDA ๋ฒ„์ „์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    JetPack 4.6.4์˜ ๊ฒฝ์šฐ:

    export CUDA_VER=10.2
    

    JetPack 5.1.3์˜ ๊ฒฝ์šฐ:

    export CUDA_VER=11.4
    
  6. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ปดํŒŒ์ผ

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  7. ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. config_infer_primary_yoloV8.txt file ๋ชจ๋ธ์— ๋”ฐ๋ผ( YOLOv8s 80๊ฐœ ์ˆ˜์—…)

    [property]
    ...
    onnx-file=yolov8s.onnx
    ...
    num-detected-classes=80
    ...
    
  8. ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. deepstream_app_config ํŒŒ์ผ

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  9. ๋‹ค์Œ์—์„œ ๋น„๋””์˜ค ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. deepstream_app_config ํŒŒ์ผ. ์—ฌ๊ธฐ์— ๊ธฐ๋ณธ ๋น„๋””์˜ค ํŒŒ์ผ์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค

    ...
    [source0]
    ...
    uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
    

์ถ”๋ก  ์‹คํ–‰

deepstream-app -c deepstream_app_config.txt

์ฐธ๊ณ 

์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. TensorRT ์ถ”๋ก ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์—”์ง„ ํŒŒ์ผ. ๊ทธ๋Ÿฌ๋‹ˆ ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค ์ฃผ์‹ญ์‹œ์˜ค.

YOLOv8 ๋”ฅ์ŠคํŠธ๋ฆผ์œผ๋กœ

ํŒ

๋ชจ๋ธ์„ FP16 ์ •๋ฐ€๋„๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด model-engine-file=model_b1_gpu0_fp16.engine ๊ทธ๋ฆฌ๊ณ  network-mode=2 ๋‚ด๋ถ€ config_infer_primary_yoloV8.txt

INT8 ๋ณด์ •

์ถ”๋ก ์— INT8 ์ •๋ฐ€๋„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ง‘ํ•ฉ OPENCV ํ™˜๊ฒฝ ๋ณ€์ˆ˜(environment variable)

    export OPENCV=1
    
  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ปดํŒŒ์ผ

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. COCO ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ val2017๋ฅผ ํด๋ฆญํ•˜๊ณ  ์ถ”์ถœํ•œ ๋‹ค์Œ DeepStream-Yolo ํด๋”

  4. ๋ณด์ • ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ ์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋งŒ๋“ค๊ธฐ

    mkdir calibration
    
  5. ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ COCO ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ๋ณด์ •์„ ์‹คํ–‰ํ•  1000๊ฐœ์˜ ๋ฌด์ž‘์œ„ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
        cp ${jpg} calibration/; \
    done
    

    ์ฐธ๊ณ 

    NVIDIA๋Š” ์ข‹์€ ์ •ํ™•๋„๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ตœ์†Œ 500๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋” ๋‚˜์€ ์ •ํ™•๋„๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด 1000๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ •ํ™•๋„๊ฐ€ ๋†’์•„์ง). ํ—ค๋“œ -1000์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€๊ฐ€ 2000๊ฐœ์ธ ๊ฒฝ์šฐ -2000์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. calibration.txt ์„ ํƒํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ

    realpath calibration/*jpg > calibration.txt
    
  7. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    ์ฐธ๊ณ 

    INT8_CALIB_BATCH_SIZE ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ์ •ํ™•๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ๊ต์ • ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. GPU ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋ผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

  8. ์—…๋ฐ์ดํŠธ config_infer_primary_yoloV8.txt ํŒŒ์ผ

    ์—์„œ

    ...
    model-engine-file=model_b1_gpu0_fp32.engine
    #int8-calib-file=calib.table
    ...
    network-mode=0
    ...
    

    To

    ...
    model-engine-file=model_b1_gpu0_int8.engine
    int8-calib-file=calib.table
    ...
    network-mode=1
    ...
    

์ถ”๋ก  ์‹คํ–‰

deepstream-app -c deepstream_app_config.txt

๋ฉ€ํ‹ฐ์ŠคํŠธ๋ฆผ ์„ค์ •

๋‹จ์ผ ๋”ฅ์ŠคํŠธ๋ฆผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. deepstream_app_config.txt ํŒŒ์ผ

  1. ํ–‰๊ณผ ์—ด์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์›ํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ˆ˜์— ๋”ฐ๋ผ ๊ทธ๋ฆฌ๋“œ ํ‘œ์‹œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 4๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด 2๊ฐœ์˜ ํ–‰๊ณผ 2๊ฐœ์˜ ์—ด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    [tiled-display]
    rows=2
    columns=2
    
  2. ์ง‘ํ•ฉ num-sources=4 ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ uri 4 ๊ฐœ์˜ ๋ชจ๋“  ์ŠคํŠธ๋ฆผ ์ค‘

    [source0]
    enable=1
    type=3
    uri=<path_to_video>
    uri=<path_to_video>
    uri=<path_to_video>
    uri=<path_to_video>
    num-sources=4
    

์ถ”๋ก  ์‹คํ–‰

deepstream-app -c deepstream_app_config.txt
๋ฉ€ํ‹ฐ์ŠคํŠธ๋ฆผ ์„ค์ •

๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ

๋‹ค์Œ ํ‘œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์š”์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. YOLOv8s ๋ชจ๋ธ์€ ๋‹ค๋ฅธ TensorRT NVIDIA Jetson Orin NX 16GB์—์„œ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ 640x640์ธ ์ •๋ฐ€๋„ ์ˆ˜์ค€.

๋ชจ๋ธ ์ด๋ฆ„ ์ •๋ฐ€๋„ ์ถ”๋ก  ์‹œ๊ฐ„(ms/im) FPS
YOLOv8s FP32 15.63 64
FP16 7.94 126
INT8 5.53 181

์Šน์ธ

์ด ๊ฐ€์ด๋“œ๋Š” ์ฒ˜์Œ์— Seeed Studio, Lakshantha, Elaine์˜ ์นœ๊ตฌ๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.



์ƒ์„ฑ 2024-07-01, ์—…๋ฐ์ดํŠธ 2024-07-01
์ž‘์„ฑ์ž: lakshanthad (1)

๋Œ“๊ธ€