Unable to draw bounding boxes in deepstream using a multi-task classifier model

Please provide complete information as applicable to your setup.

**• Hardware Platform (Jetson / GPU) Jetson Orin
**• DeepStream Version 6.1.1
**• JetPack Version (valid for Jetson only) 5.0.2
**• TensorRT Version 8.4.1
**• Issue Type( questions, new requirements, bugs) Question

I am trying to get a multi-task classifier set up in deepstream 6.1.1 and i am following the instructions located at the following link:

the last step in the process states:

Create label mapping and set in nvdsinfer_customclassifier_multi_task_tao.cpp

I cannot find where this file would be located. It does not appear to be located in either deepstream nor deepstream_tao_apps, but I may be missing something obvious.

As it stands, running a test configuration will crash as soon as the first instance where the multi-task classification is used.

test configuration:

main config:

[application]
enable-perf-measurement=1
perf-measurement-interval-sec=5
#gie-kitti-output-dir=streamscl

[tiled-display]
enable=0
rows=1
columns=1
width=1280
height=720
gpu-id=0
#(0): nvbuf-mem-default - Default memory allocated, specific to particular platform
#(1): nvbuf-mem-cuda-pinned - Allocate Pinned/Host cuda memory applicable for Tesla
#(2): nvbuf-mem-cuda-device - Allocate Device cuda memory applicable for Tesla
#(3): nvbuf-mem-cuda-unified - Allocate Unified cuda memory applicable for Tesla
#(4): nvbuf-mem-surface-array - Allocate Surface Array memory, applicable for Jetson
nvbuf-memory-type=0

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP
type=3
uri=file:/home/nvidia/Videos/example.mp4
num-sources=1
#drop-frame-interval=2
gpu-id=0
# (0): memtype_device   - Memory type Device
# (1): memtype_pinned   - Memory type Host Pinned
# (2): memtype_unified  - Memory type Unified
cudadec-memtype=0

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File 7=nv3dsink (Jetson only)
type=2
sync=1
source-id=0
gpu-id=0
nvbuf-memory-type=0

[sink1]
enable=0
type=3
#1=mp4 2=mkv
container=1
#1=h264 2=h265
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
#iframeinterval=10
bitrate=2000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
output-file=out.mp4
source-id=0

[sink2]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming
type=4
#1=h264 2=h265
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=4000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
# set below properties in case of RTSPStreaming
rtsp-port=8554
udp-port=5400

[osd]
enable=1
gpu-id=0
border-width=1
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Serif
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;0
nvbuf-memory-type=0

[streammux]
gpu-id=0
##Boolean property to inform muxer that sources are live
live-source=0
buffer-pool-size=1
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
## Set muxer output width and height
width=1280
height=720
##Enable to maintain aspect ratio wrt source, and allow black borders, works
##along with width, height properties
enable-padding=0
nvbuf-memory-type=0
## If set to TRUE, system timestamp will be attached as ntp timestamp
## If set to FALSE, ntp timestamp from rtspsrc, if available, will be attached
# attach-sys-ts-as-ntp=1

# config-file property is mandatory for any gie section.
# Other properties are optional and if set will override the properties set in
# the infer config file.
[primary-gie]
enable=1
gpu-id=0
model-engine-file=/home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
batch-size=1
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
interval=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary.txt

[secondary-gie0]
enable=1
model-engine-file=/home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
gpu-id=0
batch-size=1
gie-unique-id=2
operate-on-gie-id=1
operate-on-class-ids=3;
config-file=config_infer_secondary_MT_people.txt

[tests]
file-loop=0

Primary object detection config:

[property]
gpu-id=0
net-scale-factor=1
offsets=103.939;116.779;123.68
model-color-format=1
output-tensor-meta=0

labelfile-path=/home/nvidia/engines/PrimaryObjectDetect/labels.txt
model-engine-file=/home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
tlt-encoded-model=/home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt
tlt-model-key=nvidia_tlt
infer-dims=3;736;1280


maintain-aspect-ratio=0
uff-input-order=0
uff-input-blob-name=Input
#is-classifier=0


batch-size=1
process-mode=1
#model-color-format=0
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=0
num-detected-classes=7
interval=0
gie-unique-id=1

network-type=0


cluster-mode=3
output-blob-names=BatchedNMS
force-implicit-batch-dim=1
parse-bbox-func-name=NvDsInferParseCustomBatchedNMSTLT
custom-lib-path=/home/nvidia/deepstream-tao-apps/post_processor/libnvds_infercustomparser_tao.so
## 1=DBSCAN, 2=NMS, 3= DBSCAN+NMS Hybrid, 4 = None(No clustering)

[class-attrs-all]
pre-cluster-threshold=0.3
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0
detected-max-h=0

Multi-task Classifier secondary config:

[property]
gpu-id=0
net-scale-factor=1.0
offsets=103.939;116.779;123.68
model-color-format=1
labelfile-path=/home/nvidia/engines/PeopleMultitask/labels.txt
tlt-encoded-model=/home/nvidia/engines/PeopleMultitask/mcls_export.etlt
tlt-model-key=nvidia_tlt
model-engine-file=/home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
infer-dims=3;80;60
uff-input-blob-name=input_1
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=0
interval=0
gie-unique-id=1
network-type=0
scaling-filter=1
scaling-compute-hw=1
output-blob-names=action/Softmax;object/Softmax;pose/Softmax
uff-input-blob-name=input_1
classifier-threshold=0.5
maintain-aspect-ratio=0
output-tensor-meta=0

log of the run:

$ deepstream-app -c testconfig.txt

Using winsys: x11 
0:00:00.106779776  8135 0xaaaaca778490 WARN                 nvinfer gstnvinfer.cpp:643:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Warning from NvDsInferContextImpl::initialize() <nvdsinfer_context_impl.cpp:1170> [UID = 2]: Warning, OpenCV has been deprecated. Using NMS for clustering instead of cv::groupRectangles with topK = 20 and NMS Threshold = 0.5
0:00:03.629342560  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Info from NvDsInferContextImpl::deserializeEngineAndBackend() <nvdsinfer_context_impl.cpp:1909> [UID = 2]: deserialized trt engine from :/home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
INFO: [Implicit Engine Info]: layers num: 4
0   INPUT  kFLOAT input_1         3x80x60         
1   OUTPUT kFLOAT pose/Softmax    5x1x1           
2   OUTPUT kFLOAT object/Softmax  2x1x1           
3   OUTPUT kFLOAT action/Softmax  6x1x1           

0:00:03.790128416  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Info from NvDsInferContextImpl::generateBackendContext() <nvdsinfer_context_impl.cpp:2012> [UID = 2]: Use deserialized engine model: /home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
0:00:03.797837152  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer_impl.cpp:328:notifyLoadModelStatus:<secondary_gie_0> [UID 2]: Load new model:/home/nvidia/deepstream-app/multitask/config_infer_secondary_MT_people.txt sucessfully
0:00:05.777702272  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<primary_gie> NvDsInferContext[UID 1]: Info from NvDsInferContextImpl::deserializeEngineAndBackend() <nvdsinfer_context_impl.cpp:1909> [UID = 1]: deserialized trt engine from :/home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
INFO: [Implicit Engine Info]: layers num: 5
0   INPUT  kFLOAT Input           3x736x1280      
1   OUTPUT kINT32 BatchedNMS      1               
2   OUTPUT kFLOAT BatchedNMS_1    200x4           
3   OUTPUT kFLOAT BatchedNMS_2    200             
4   OUTPUT kFLOAT BatchedNMS_3    200             

0:00:05.943919040  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<primary_gie> NvDsInferContext[UID 1]: Info from NvDsInferContextImpl::generateBackendContext() <nvdsinfer_context_impl.cpp:2012> [UID = 1]: Use deserialized engine model: /home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
0:00:05.959729984  8135 0xaaaaca778490 INFO                 nvinfer gstnvinfer_impl.cpp:328:notifyLoadModelStatus:<primary_gie> [UID 1]: Load new model:/home/nvidia/deepstream-app/multitask/config_infer_primary.txt sucessfully

Runtime commands:
	h: Print this help
	q: Quit

	p: Pause
	r: Resume


**PERF:  FPS 0 (Avg)	
**PERF:  0.00 (0.00)	
** INFO: <bus_callback:194>: Pipeline ready

Opening in BLOCKING MODE 
NvMMLiteOpen : Block : BlockType = 261 
NVMEDIA: Reading vendor.tegra.display-size : status: 6 
NvMMLiteBlockCreate : Block : BlockType = 261 
** INFO: <bus_callback:180>: Pipeline running

**PERF:  33.12 (33.02)	
**PERF:  30.02 (31.46)	
**PERF:  29.97 (30.97)	
**PERF:  30.01 (30.72)	
**PERF:  30.01 (30.57)	
0:00:31.233447712  8135 0xaaaaca297800 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::parseBoundingBox() <nvdsinfer_context_impl_output_parsing.cpp:59> [UID = 2]: Could not find output coverage layer for parsing objects
0:00:31.233489440  8135 0xaaaaca297800 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::fillDetectionOutput() <nvdsinfer_context_impl_output_parsing.cpp:735> [UID = 2]: Failed to parse bboxes
Segmentation fault (core dumped)

Thanks for the help!

Justas

This is the previous method, we are all configured with multi_task_labels.txt now. We’ll delete it from the README in the future.

Could you help to use gdb to debug where the crash is? Thanks

This is the previous method, we are all configured with multi_task_labels.txt now. We’ll delete it from the README in the future.

My label files for multitask classification comply with the format linked.

Could you help to use gdb to debug where the crash is? Thanks

I recompiled the deepstream-app sample app with -g flags everywhere in the make file and ran it through gdb. The results are as follows:

$ gdb /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-app/deepstream-app
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "aarch64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-app/deepstream-app...
(gdb) run -c testconfig.txt
Starting program: /opt/nvidia/deepstream/deepstream-6.1/sources/apps/sample_apps/deepstream-app/deepstream-app -c testconfig.txt
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
[New Thread 0xffffb41fa900 (LWP 6793)]

Using winsys: x11 
[New Thread 0xffffb24e3900 (LWP 6794)]
[New Thread 0xffffb1bcc900 (LWP 6795)]
[New Thread 0xffffb13cb900 (LWP 6796)]
[New Thread 0xffffb0bca900 (LWP 6797)]
[New Thread 0xffff7a6d4900 (LWP 6798)]
[New Thread 0xffff79ed3900 (LWP 6799)]
0:00:00.213177248  6790 0xffff5c002390 WARN                 nvinfer gstnvinfer.cpp:643:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Warning from NvDsInferContextImpl::initialize() <nvdsinfer_context_impl.cpp:1170> [UID = 2]: Warning, OpenCV has been deprecated. Using NMS for clustering instead of cv::groupRectangles with topK = 20 and NMS Threshold = 0.5
0:00:03.622730560  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Info from NvDsInferContextImpl::deserializeEngineAndBackend() <nvdsinfer_context_impl.cpp:1909> [UID = 2]: deserialized trt engine from :/home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
INFO: [Implicit Engine Info]: layers num: 4
0   INPUT  kFLOAT input_1         3x80x60         
1   OUTPUT kFLOAT pose/Softmax    5x1x1           
2   OUTPUT kFLOAT object/Softmax  2x1x1           
3   OUTPUT kFLOAT action/Softmax  6x1x1           

0:00:03.787081248  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Info from NvDsInferContextImpl::generateBackendContext() <nvdsinfer_context_impl.cpp:2012> [UID = 2]: Use deserialized engine model: /home/nvidia/engines/PeopleMultitask/mcls_export.etlt_b1_gpu0_fp32.engine
[New Thread 0xffff7934a900 (LWP 6801)]
[New Thread 0xffff78b49900 (LWP 6802)]
[New Thread 0xffff631e6900 (LWP 6803)]
0:00:03.796126976  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer_impl.cpp:328:notifyLoadModelStatus:<secondary_gie_0> [UID 2]: Load new model:/home/nvidia/deepstream-app/multitask/config_infer_secondary_MT_people.txt sucessfully
[New Thread 0xffff629e5900 (LWP 6804)]
[New Thread 0xffff621e4900 (LWP 6805)]
WARNING: [TRT]: Using an engine plan file across different models of devices is not recommended and is likely to affect performance or even cause errors.
0:00:05.727608640  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<primary_gie> NvDsInferContext[UID 1]: Info from NvDsInferContextImpl::deserializeEngineAndBackend() <nvdsinfer_context_impl.cpp:1909> [UID = 1]: deserialized trt engine from :/home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
INFO: [Implicit Engine Info]: layers num: 5
0   INPUT  kFLOAT Input           3x736x1280      
1   OUTPUT kINT32 BatchedNMS      1               
2   OUTPUT kFLOAT BatchedNMS_1    200x4           
3   OUTPUT kFLOAT BatchedNMS_2    200             
4   OUTPUT kFLOAT BatchedNMS_3    200             

0:00:05.892889120  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer.cpp:646:gst_nvinfer_logger:<primary_gie> NvDsInferContext[UID 1]: Info from NvDsInferContextImpl::generateBackendContext() <nvdsinfer_context_impl.cpp:2012> [UID = 1]: Use deserialized engine model: /home/nvidia/engines/PrimaryObjectDetect/yolov4_resnet18_epoch_004.etlt_b1_gpu0_fp32.engine
[New Thread 0xffff619e3900 (LWP 6806)]
[New Thread 0xffff611e2900 (LWP 6807)]
[New Thread 0xffff609e1900 (LWP 6808)]
0:00:05.903908448  6790 0xffff5c002390 INFO                 nvinfer gstnvinfer_impl.cpp:328:notifyLoadModelStatus:<primary_gie> [UID 1]: Load new model:/home/nvidia/deepstream-app/multitask/config_infer_primary.txt sucessfully
[New Thread 0xffff5bff9900 (LWP 6809)]
[New Thread 0xffff5b7f8900 (LWP 6810)]
[New Thread 0xffff5aff7900 (LWP 6811)]
[New Thread 0xffff5a7f6900 (LWP 6812)]
[New Thread 0xffff59ff5900 (LWP 6813)]

Runtime commands:
	h: Print this help
	q: Quit

	p: Pause
	r: Resume


**PERF:  FPS 0 (Avg)	
**PERF:  0.00 (0.00)	
** INFO: <bus_callback:194>: Pipeline ready

[New Thread 0xffff597f4900 (LWP 6814)]
[New Thread 0xffff58ff3900 (LWP 6815)]
[Detaching after vfork from child process 6816]
Opening in BLOCKING MODE 
NvMMLiteOpen : Block : BlockType = 261 
NVMEDIA: Reading vendor.tegra.display-size : status: 6 
[New Thread 0xffff4f47d900 (LWP 6819)]
[New Thread 0xffff4ec7c900 (LWP 6820)]
[New Thread 0xffff4e47b900 (LWP 6821)]
NvMMLiteBlockCreate : Block : BlockType = 261 
[New Thread 0xffff4dc7a900 (LWP 6822)]
[New Thread 0xffff4d078900 (LWP 6823)]
** INFO: <bus_callback:180>: Pipeline running

[New Thread 0xffff4c877900 (LWP 6824)]
[New Thread 0xffff0fff9900 (LWP 6825)]
[New Thread 0xffff0f470900 (LWP 6826)]
[New Thread 0xffff0e667900 (LWP 6827)]
**PERF:  33.82 (33.64)	
**PERF:  29.99 (31.72)	
**PERF:  30.01 (31.13)	
[Thread 0xffff4d078900 (LWP 6823) exited]
**PERF:  30.02 (30.84)	
**PERF:  30.00 (30.67)	
0:00:31.302875232  6790 0xaaaaab758000 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::parseBoundingBox() <nvdsinfer_context_impl_output_parsing.cpp:59> [UID = 2]: Could not find output coverage layer for parsing objects
0:00:31.302912864  6790 0xaaaaab758000 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::fillDetectionOutput() <nvdsinfer_context_impl_output_parsing.cpp:735> [UID = 2]: Failed to parse bboxes

Thread 9 "deepstream-app" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xffff7934a900 (LWP 6801)]
0x0000ffffb2f2ddc0 in ?? () from /usr/lib/aarch64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_infer.so
(gdb) q
A debugging session is active.

	Inferior 1 [process 6790] will be killed.

Quit anyway? (y or n) y

You can use bt command when it crash in gdb to see more info.
Also, from the log attached, Could not find output coverage layer for parsing objects.
Did you train the model by yourself? Are output layers same as the config file you added(action/Softmax;object/Softmax;pose/Softmax)?

You can use bt command when it crash in gdb to see more info.

Ah, my apologies. I am not the most familiar with C++/gdb. Here is the output of the bt command:

0:00:37.632354560  3419 0xaaaaab758000 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::parseBoundingBox() <nvdsinfer_context_impl_output_parsing.cpp:59> [UID = 2]: Could not find output coverage layer for parsing objects
0:00:37.632393600  3419 0xaaaaab758000 ERROR                nvinfer gstnvinfer.cpp:640:gst_nvinfer_logger:<secondary_gie_0> NvDsInferContext[UID 2]: Error in NvDsInferContextImpl::fillDetectionOutput() <nvdsinfer_context_impl_output_parsing.cpp:735> [UID = 2]: Failed to parse bboxes

Thread 9 "deepstream-app" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xffff7934a900 (LWP 3429)]
0x0000ffffb2f2ddc0 in ?? () from /usr/lib/aarch64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_infer.so
(gdb) bt
#0  0x0000ffffb2f2ddc0 in  () at /usr/lib/aarch64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_infer.so
#1  0x0000ffffb2f2760c in  () at /usr/lib/aarch64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_infer.so
#2  0x0000fffff72e047c in  () at /lib/aarch64-linux-gnu/libglib-2.0.so.0
#3  0x0000fffff6e00624 in start_thread (arg=0xfffff7303e30) at pthread_create.c:477
#4  0x0000fffff6f0f49c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
(gdb)

Also, from the log attached, Could not find output coverage layer for parsing objects.
Did you train the model by yourself? Are output layers same as the config file you added(action/Softmax;object/Softmax;pose/Softmax)?

Yes I did train the model myself, Those are my tasks to identify and they are reported as given from the nvinfer_config.txt output post training.

Here is nvinfer_config.txt as output by TAO’s export:

net-scale-factor=1.0
offsets=103.939;116.779;123.68
infer-dims=3;80;60
tlt-model-key=nvidia_tlt
network-type=0
uff-input-order=0
output-blob-names=action/Softmax;object/Softmax;pose/Softmax
uff-input-blob-name=input_1
model-color-format=1
maintain-aspect-ratio=0
output-tensor-meta=0

As a side note, the primary object detector is a yolo_v4 model. Running a yolo_v4 object detector in deepstream gave me a nearly identical bounding box error until I linked the proper .so file from deepstream_tao_apps and specified the proper bbox parsing function as shown below in my config_infer_primary.txt file. I don’t suppose this problem with multi-task classification is similar? Maybe some .so file i may be missing or I am not passing it the proper bbox parsing function?

parse-bbox-func-name=NvDsInferParseCustomBatchedNMSTLT
custom-lib-path=/home/nvidia/deepstream-tao-apps/post_processor/libnvds_infercustomparser_tao.so

Yes, if you model needs prepross or postprocess, you should add the function to process it. Maybe you can refer the topic below:
https://forums.developer.nvidia.com/t/getting-0-0-0-0-output-from-tao-multitask-classifier/210302
Also, you can add your model training process step by step.
At last, There may be some problems about the order of the output layer. You can check it.
In your log:

INFO: [Implicit Engine Info]: layers num: 4
0   INPUT  kFLOAT input_1         3x80x60         
1   OUTPUT kFLOAT pose/Softmax    5x1x1           
2   OUTPUT kFLOAT object/Softmax  2x1x1           
3   OUTPUT kFLOAT action/Softmax  6x1x1    

But in your config file:

output-blob-names=action/Softmax;object/Softmax;pose/Softmax

Yes, if you model needs prepross or postprocess, you should add the function to process it. Maybe you can refer the topic below:
https://forums.developer.nvidia.com/t/getting-0-0-0-0-output-from-tao-multitask-classifier/210302

I am familiar with this post. I have used it previously to develop a batched inferencing tool on a directory filled with images which has worked with this model I have created (and another one as well), but I am not sure if that post shows me how to use multi-task classification with deepstream directly. I imagine there must be some standard bbox parsing function for multitask classification in deepstream/deepstream_tao_apps?

For some further debugging, I tried to run my two models through the standard deepstream_tao_apps apps and I did replicated the same bounding box errors with the multi-task classifier app.

in ~/deepstream_tao_apps-master/apps/tao_detection, ./ds-tao-detection -c ~/deepstream-app/multitask/config_infer_primary.txt -i file:///home/nvidia/Videos/example.mp4 -d ran without a hitch, but I suppose this is expected since the object detector has already been confirmed to work.

whereas:

in ~/deepstream_tao_apps-master/apps/tao_classifier, ./ds-tao-classifier -c ~/deepstream-app/multitask/config_infer_secondary_MT_people.txt -i file:///home/nvidia/Videos/example.mp4 -d failed immediately with the exact same error as reported in the original post. I would imagine that this multi-task classifier app that is packaged with deepstream_tao_apps should not be running into a bounding box issue unless the model was bad, something in my configuration was incorrect or there is some reference to a library with that function that is missing and needs to be linked to my config (similar to what is required to run a yolo_v4 model). I have validated that the model is functional before using the post you have referenced earlier which makes be believe there must be a configuration problem or library reference that i am missing.

The multi-task classification config file packaged with deepstream_tao_apps is as follows:

[property]
gpu-id=0
net-scale-factor=1.0
offsets=103.939;116.779;123.68
model-color-format=1
labelfile-path=multi_task_labels.txt
tlt-encoded-model=../../models/multi_task/abc.etlt
tlt-model-key=nvidia_tlt
model-engine-file=../../models/multi_task/abc.etlt_b1_gpu0_fp16.engine
infer-dims=3;80;60
uff-input-blob-name=input_1
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=2
interval=0
gie-unique-id=1
network-type=1
scaling-filter=1
scaling-compute-hw=1
output-blob-names=base_color/Softmax;category/Softmax;season/Softmax
classifier-threshold=0.5

The configuration file that I have is nearly identical, with the exception of the parameters that was in the nvinfer_config.txt that was generated by TAO.

Is there some model that you may have on hand that you have gotten to work for multi-task classification in deepstream? Deepstream_tao_apps reports that it doesn’t have a standard model for multi-task classification that I could use for testing purpose, but if you have one that you have confirmed to work properly, that may narrow down where I may be having an issue with my setup.

At last, There may be some problems about the order of the output layer. You can check it.
In your log:

That is quite interesting. The order of the output-blob-names i am using was a direct output from tao via nvinfer_config.txt as shown in my earlier post. I did try and swap the order to output-blob-names=pose/Softmax;object/Softmax;action/Softmax and ran into the same bounding box error.

Yes, we have model for this and test it every time we release a new version. But it is used for internal testing and will not be released externally. The config file that we used is the same as it in the deepstream_tao_apps.
Maybe you can use our postprocess to output the origin infered data to debug it.
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvdspostprocess.html

@Justas_J Can you send your model and sample code to us to reproduce the problem?

BTW, " nvdsinfer_customclassifier_multi_task_tao.cpp" is not needed by DeepStream sample, we will correct the document.

exampleMultitask.zip (51.0 MB)

The original multitask model was generated from proprietary data and thus I cannot share it; however, I have generated another multitask model that results in an identical error whose classes are identical in dimensions to the original model.

I have included all configs / tao exports / the .etlt as well as .engine files I generated.

There also is a sample image directory if you wish to inference on something that this model was trained on.

I have not included an .mp4 video, but the videos I commonly use are H.264 codec with 30fps at 1280x720.

please run the model via the classifier model built into deepstream_tao_apps using the following command or similar:

$ ./ds-tao-classifier -c ~/engines/exampleMultitask/config_infer.txt -i file:///home/nvidia/Videos/example.mp4 -d

A log file has been included with my results.

Thank you very much for the help!

You can try to set the network-type=1 as I attached before.

That worked! Very much appreciate the help!

I think the source of my confusion is that nvinfer_config.txt as export by TAO via the multitask toolset does set network-type=0. It sounds like this may be an error.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.