commit bf5009458dccf2ec518975f9a3cd3174a8219770 Author: Mukul Godara Date: Sat Jul 4 16:22:53 2026 +0530 [app_tidl_od and app_tidl_front_cam]: Fix post-processing to use all TIDL output tensors Post-processing was incorrectly using numInputBuf instead of numOutputBuf, causing only one output tensor to be processed. This resulted in incorrect class detection where all objects were detected as class 0. Additionally, classnames were being passed as empty strings, preventing any labels from being printed on the display. JIRA: ADASVISION-7306 Signed-off-by: Mukul Godara diff --git a/apps/dl_demos/app_tidl_od/app_common.h b/apps/dl_demos/app_tidl_od/app_common.h index d361dde3..ab824cbe 100644 --- a/apps/dl_demos/app_tidl_od/app_common.h +++ b/apps/dl_demos/app_tidl_od/app_common.h @@ -105,6 +105,10 @@ #define APP_MAX_BUFQ_DEPTH (8) +#define APP_DL_POST_PROC_MAX_NUM_CLASSNAMES (91) +#define APP_DL_POST_PROC_MAX_SIZE_CLASSNAME (64) +#define APP_DL_POST_PROC_MAX_LABEL_OFFSET (81) + #ifdef APP_DEBUG #define APP_PRINTF(f_, ...) printf((f_), ##__VA_ARGS__) #else diff --git a/apps/dl_demos/app_tidl_od/app_post_proc_module.c b/apps/dl_demos/app_tidl_od/app_post_proc_module.c index 5e6ccf02..804d57c7 100644 --- a/apps/dl_demos/app_tidl_od/app_post_proc_module.c +++ b/apps/dl_demos/app_tidl_od/app_post_proc_module.c @@ -113,7 +113,7 @@ vx_status app_update_post_proc(vx_context context, PostProcObj *postProcObj, vx_ ioBufDesc = (sTIDL_IOBufDesc_t *)&tidlParams->ioBufDesc; memcpy(&postProcObj->ioBufDesc, ioBufDesc, sizeof(sTIDL_IOBufDesc_t)); - postProcObj->num_input_tensors = ioBufDesc->numInputBuf; + postProcObj->num_input_tensors = ioBufDesc->numOutputBuf; postProcObj->num_output_tensors = ioBufDesc->numOutputBuf; postProcObj->kernel = tivxAddKernelDLPostProc(context, postProcObj->num_input_tensors); @@ -139,7 +139,7 @@ void app_delete_post_proc(PostProcObj *postProcObj) } } -vx_status app_create_graph_post_proc(vx_graph graph, PostProcObj *postProcObj,vx_object_array out_tensor_arr, vx_object_array input_img_arr) +vx_status app_create_graph_post_proc(vx_graph graph, PostProcObj *postProcObj,vx_object_array out_tensor_arr[], vx_object_array input_img_arr) { vx_status status = VX_SUCCESS; uint32_t i = 0; @@ -150,7 +150,7 @@ vx_status app_create_graph_post_proc(vx_graph graph, PostProcObj *postProcObj,vx vx_tensor input_tensors[APP_MODULES_MAX_TENSORS]; for(i = 0; i < postProcObj->num_input_tensors; i++) { - input_tensors[i] = (vx_tensor)vxGetObjectArrayItem((vx_object_array)out_tensor_arr, i); + input_tensors[i] = (vx_tensor)vxGetObjectArrayItem((vx_object_array)out_tensor_arr[i], 0); } postProcObj->node = tivxDLPostProcNode(graph, diff --git a/apps/dl_demos/app_tidl_od/app_post_proc_module.h b/apps/dl_demos/app_tidl_od/app_post_proc_module.h index 30da5cda..52c7b694 100644 --- a/apps/dl_demos/app_tidl_od/app_post_proc_module.h +++ b/apps/dl_demos/app_tidl_od/app_post_proc_module.h @@ -103,7 +103,7 @@ vx_status app_update_post_proc(vx_context context, PostProcObj *postProcObj, vx_ vx_status app_init_post_proc(vx_context context, PostProcObj *postProcObj, char *objName,vx_int32 bufq_depth); void app_deinit_post_proc(vx_context context, PostProcObj *obj, vx_int32 bufq_depth); void app_delete_post_proc(PostProcObj *obj); -vx_status app_create_graph_post_proc(vx_graph graph, PostProcObj *postProcObj,vx_object_array in_tensor_arr, vx_object_array input_img_arr); +vx_status app_create_graph_post_proc(vx_graph graph, PostProcObj *postProcObj,vx_object_array out_tensor_arr[], vx_object_array input_img_arr); vx_status writePostProcOutput(char* file_name, PostProcObj *postProcObj); diff --git a/apps/dl_demos/app_tidl_od/concerto.mak b/apps/dl_demos/app_tidl_od/concerto.mak index 3931d365..83395962 100644 --- a/apps/dl_demos/app_tidl_od/concerto.mak +++ b/apps/dl_demos/app_tidl_od/concerto.mak @@ -3,8 +3,9 @@ ifeq ($(TARGET_CPU),$(filter $(TARGET_CPU), x86_64 A72 A53 A720)) include $(PRELUDE) TARGET := vx_app_tidl_od - CSOURCES := main.c - CSOURCES += app_pre_proc_module.c + CSOURCES := main.c + CSOURCES += od_class_labels.c + CSOURCES += app_pre_proc_module.c CSOURCES += app_post_proc_module.c ifeq ($(HOST_COMPILER),GCC_LINUX) diff --git a/apps/dl_demos/app_tidl_od/main.c b/apps/dl_demos/app_tidl_od/main.c index 9d2fa8bb..1f9f7468 100644 --- a/apps/dl_demos/app_tidl_od/main.c +++ b/apps/dl_demos/app_tidl_od/main.c @@ -196,8 +196,8 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram static vx_status app_run_graph_for_one_frame_sequential(AppObj *obj, vx_int32 frame_id); #endif -static char img_labels[TIVX_DL_POST_PROC_MAX_NUM_CLASSNAMES][TIVX_DL_POST_PROC_MAX_SIZE_CLASSNAME] = {""}; -static int32_t label_offset3[TIVX_DL_POST_PROC_MAX_NUM_CLASSNAMES] = {0}; +extern const char od_labels[APP_DL_POST_PROC_MAX_NUM_CLASSNAMES][APP_DL_POST_PROC_MAX_SIZE_CLASSNAME]; +extern int32_t od_label_offset[APP_DL_POST_PROC_MAX_LABEL_OFFSET]; #if defined(SOC_AM62A) && defined(QNX) int32_t app_run_screen(AppObj *obj) @@ -1275,7 +1275,7 @@ static vx_status app_create_graph(AppObj *obj) } if(status == VX_SUCCESS) { - status = app_create_graph_post_proc(obj->graph, &obj->postProcObj,obj->tidlObj.output_tensor_arr[0], obj->scalerObj.output[1].arr); + status = app_create_graph_post_proc(obj->graph, &obj->postProcObj,obj->tidlObj.output_tensor_arr, obj->scalerObj.output[1].arr); } vx_int32 idx = 0; @@ -1747,10 +1747,9 @@ static void set_post_proc_defaults_od(PostProcObj *postProcObj){ postProcObj->params.task_type = TIVX_DL_POST_PROC_DETECTION_TASK_TYPE; postProcObj->params.od_prms.labelIndexOffset = 0; + postProcObj->params.od_prms.labelOffset = od_label_offset; - postProcObj->params.od_prms.labelOffset = label_offset3; - - postProcObj->params.od_prms.classnames = img_labels; + postProcObj->params.od_prms.classnames = (char (*)[TIVX_DL_POST_PROC_MAX_SIZE_CLASSNAME])od_labels; postProcObj->params.od_prms.viz_th = 0.4; } diff --git a/apps/dl_demos/app_tidl_od/od_class_labels.c b/apps/dl_demos/app_tidl_od/od_class_labels.c new file mode 100644 index 00000000..f28a093c --- /dev/null +++ b/apps/dl_demos/app_tidl_od/od_class_labels.c @@ -0,0 +1,110 @@ +#include +#include +#include "app_common.h" + +int32_t od_label_offset[APP_DL_POST_PROC_MAX_LABEL_OFFSET] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 26, 27, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, 69, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 83, 84, 85, 86, 87, 88, 89, + 90 +}; + +const char od_labels[APP_DL_POST_PROC_MAX_NUM_CLASSNAMES][APP_DL_POST_PROC_MAX_SIZE_CLASSNAME] = +{ + "person", + "bicycle", + "car", + "motorcycle", + "airplane", + "bus", + "train", + "truck", + "boat", + "traffic light", + "fire hydrant", + "street sign", + "stop sign", + "parking meter", + "bench", + "bird", + "cat", + "dog", + "horse", + "sheep", + "cow", + "elephant", + "bear", + "zebra", + "giraffe", + "hat", + "backpack", + "umbrella", + "shoe", + "eye glasses", + "handbag", + "tie", + "suitcase", + "frisbee", + "skis", + "snowboard", + "sports ball", + "kite", + "baseball bat", + "baseball glove", + "skateboard", + "surfboard", + "tennis racket", + "bottle", + "plate", + "wine glass", + "cup", + "fork", + "knife", + "spoon", + "bowl", + "banana", + "apple", + "sandwich", + "orange", + "broccoli", + "carrot", + "hot dog", + "pizza", + "donut", + "cake", + "chair", + "couch", + "potted plant", + "bed", + "mirror", + "dining table", + "window", + "desk", + "toilet", + "door", + "tv", + "laptop", + "mouse", + "remote", + "keyboard", + "cell phone", + "microwave", + "oven", + "toaster", + "sink", + "refrigerator", + "blender", + "book", + "clock", + "vase", + "scissors", + "teddy bear", + "hair drier", + "toothbrush", + "hair brush" +};