Files
deepstream_yolo/customModels.md
Marcos Luciano 03740debe9 New updates
* readme.md updated
* Added customModels.md
* Added multipleInferences.md
2020-12-21 11:49:09 -03:00

7.2 KiB

Editing default model to your custom model

How to edit DeepStream files to your custom model

Requirements

Editing default model

  1. Donwload my native folder, rename to yolo and move to your deepstream/sources folder.
  2. Copy and remane your obj.names file to labels.txt to deepstream/sources/yolo directory
  3. Copy your yolo.cfg and yolo.weights files to deepstream/sources/yolo directory.
  4. Edit config_infer_primary.txt for your model (example for YOLOv4)
[property]
...
# CFG
custom-network-config=yolo.cfg
# Weights
model-file=yolo.weights
# Model labels file
labelfile-path=labels.txt
...

Note: if you want to use YOLOv2 or YOLOv2-Tiny models, change deepstream_app_config.txt

[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary_yoloV2.txt

Note: config_infer_primary.txt uses cluster-mode=4 and NMS = 0.45 (via code) when beta_nms isn't available (when beta_nms is available, NMS = beta_nms), while config_infer_primary_yoloV2.txt uses cluster-mode=2 and nms-iou-threshold=0.45 to set NMS.

Compiling edited model

  1. Check your CUDA version (nvcc --version)
  2. Go to deepstream/sources/yolo directory
  3. Type command (example for CUDA 10.2 version):
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo

Understanding and editing deepstream_app_config

To understand and edit deepstream_app_config.txt file, read the DeepStream SDK Development Guide - Configuration Groups

  • Edit tiled-display
[tiled-display]
enable=1
# If you have 1 stream use 1/1 (rows/columns), if you have 4 streams use 2/2 or 4/1 or 1/4 (rows/columns)
rows=1
columns=1
# Resolution of tiled display
width=1280
height=720
gpu-id=0
nvbuf-memory-type=0

  • Edit source

Example for 1 source:

[source0]
enable=1
# 1=Camera (V4L2), 2=URI, 3=MultiURI, 4=RTSP, 5=Camera (CSI; Jetson only)
type=3
# Stream URL
uri=rtsp://192.168.1.2/Streaming/Channels/101/httppreview
# Number of sources copy (if > 1, you need edit rows/columns in tiled-display section and batch-size in streammux section and config_infer_primary.txt; need type=3 for more than 1 source)
num-sources=1
gpu-id=0
cudadec-memtype=0

Example for 1 duplcated source:

[source0]
enable=1
type=3
uri=rtsp://192.168.1.2/Streaming/Channels/101/httppreview
num-sources=2
gpu-id=0
cudadec-memtype=0

Example for 2 sources:

[source0]
enable=1
type=3
uri=rtsp://192.168.1.2/Streaming/Channels/101/httppreview
num-sources=1
gpu-id=0
cudadec-memtype=0

[source1]
enable=1
type=3
uri=rtsp://192.168.1.3/Streaming/Channels/101/httppreview
num-sources=1
gpu-id=0
cudadec-memtype=0

  • Edit sink

Example for 1 source or 1 duplicated source:

[sink0]
enable=1
# 1=Fakesink, 2=EGL (nveglglessink), 3=Filesink, 4=RTSP, 5=Overlay (Jetson only)
type=2
# Indicates how fast the stream is to be rendered (0=As fast as possible, 1=Synchronously)
sync=0
# The ID of the source whose buffers this sink must use
source-id=0
gpu-id=0
nvbuf-memory-type=0

Example for 2 sources:

[sink0]
enable=1
type=2
sync=0
source-id=0
gpu-id=0
nvbuf-memory-type=0

[sink1]
enable=1
type=2
sync=0
source-id=1
gpu-id=0
nvbuf-memory-type=0

  • Edit streammux

Example for 1 source:

[streammux]
gpu-id=0
# Boolean property to inform muxer that sources are live
live-source=1
# Number of sources
batch-size=1
# Time out in usec, to wait after the first buffer is available to push the batch even if the complete batch is not formed
batched-push-timeout=40000
# Resolution of streammux
width=1920
height=1080
enable-padding=0
nvbuf-memory-type=0

Example for 1 duplicated source or 2 sources:

[streammux]
gpu-id=0
live-source=0
batch-size=2
batched-push-timeout=40000
width=1920
height=1080
enable-padding=0
nvbuf-memory-type=0

  • Edit primary-gie
[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary.txt
  • You can remove [tracker] section, if you don't use it.

Understanding and editing config_infer_primary

To understand and edit config_infer_primary.txt file, read the NVIDIA DeepStream Plugin Manual - Gst-nvinfer File Configuration Specifications

  • Edit model-color-format accoding number of channels in yolo.cfg (1=GRAYSCALE, 3=RGB)
# 0=RGB, 1=BGR, 2=GRAYSCALE
model-color-format=0

  • Edit model-engine-file (example for batch-size=1 and network-mode=2)
model-engine-file=model_b1_gpu0_fp16.engine

  • Edit batch-size
# Number of sources
batch-size=1

  • Edit network-mode
# 0=FP32, 1=INT8, 2=FP16
network-mode=0

  • Edit num-detected-classes according number of classes in yolo.cfg
num-detected-classes=80

  • Edit network-type
# 0=Detector, 1=Classifier, 2=Segmentation
network-type=0

  • Add/edit interval (FPS increase if > 0)
# Interval of detection
interval=0

  • Change pre-cluster-threshold (optional)
[class-attrs-all]
# CONF_THRESH
pre-cluster-threshold=0.25

Testing model

To run your custom YOLO model, use command

deepstream-app -c deepstream_app_config.txt

Custom functions in your model

You can get metadata from deepstream in Python and C++. For C++, you need edit deepstream-app or deepstream-test code. For Python your need install and edit this.

You need manipulate NvDsObjectMeta (Python C++), NvDsFrameMeta (Python C++) and NvOSD_RectParams (Python C++) to get label, position, etc. of bboxs.

In C++ deepstream-app application, your code need be in analytics_done_buf_prob function. In C++/Python deepstream-test application, your code need be in osd_sink_pad_buffer_probe/tiler_src_pad_buffer_probe function.

Python is slightly slower than C (about 5-10%).