From e7c20e08eabfb28efca12520d493a1b047fcb79c Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Wed, 17 Sep 2025 22:49:07 +0000 Subject: [PATCH] Refactor array copying --- src/face_nv_infer_server_manager.cpp | 10 ++-- src/nv_infer_server_manager.cpp | 81 ++++++++++++++-------------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/face_nv_infer_server_manager.cpp b/src/face_nv_infer_server_manager.cpp index 18b3d4c..5eb08dd 100644 --- a/src/face_nv_infer_server_manager.cpp +++ b/src/face_nv_infer_server_manager.cpp @@ -1398,9 +1398,8 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( // std::endl; // } if ((strcmp(layer.layerName, "bbox") == 0)) { - for (int l = 0; l < 4; l++) { - face_location[l] = data_face[l]; - } + std::memcpy(face_location, data_face, + 4 * sizeof(float)); } if ((strcmp(layer.layerName, "score") == 0)) { score_face = data_face[0]; @@ -1634,12 +1633,9 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( // add custom infromation to metadata by: set_metadata_ptr, copy_user_meta, // release_user_meta void *FaceNvInferServerManager::set_metadata_ptr(float *arr) { - int i = 0; float *user_metadata = (float *)g_malloc0(EMBEDDING_VECTOR_SIZE * sizeof(float)); - for (i = 0; i < EMBEDDING_VECTOR_SIZE; i++) { - user_metadata[i] = arr[i]; - } + std::memcpy(user_metadata, &arr[0], EMBEDDING_VECTOR_SIZE * sizeof(float)); return (void *)user_metadata; } diff --git a/src/nv_infer_server_manager.cpp b/src/nv_infer_server_manager.cpp index 4114134..3b3c0da 100644 --- a/src/nv_infer_server_manager.cpp +++ b/src/nv_infer_server_manager.cpp @@ -11,6 +11,8 @@ #define PGIE_DETECTED_CLASS_NUM 1 #define BODY_COMPONENT_ID 1 #define IMPRECISE_FACE_COMPONENT_ID 2 +#define BODY_TENSOR_SIZE 57 +#define MAX_BODY_PER_FRAME 100 gint NvInferServerManager::frame_number = 0; unsigned int NvInferServerManager::PGIE_NET_WIDTH = 1; @@ -339,8 +341,8 @@ uint NvInferServerManager::extract_tensor_metadata( // std::cout << " Dims: ["; // for (unsigned int mno = 0; mno < numDims; ++mno) { // std::cout << layer.inferDims.d[mno]; - // // layer.inferDims.d[0] = 100; - // // layer.inferDims.d[1] = 57; + // // layer.inferDims.d[0] = MAX_BODY_PER_FRAME; + // // layer.inferDims.d[1] = BODY_TENSOR_SIZE; // if (mno < numDims - 1) // std::cout << ", "; // } @@ -350,9 +352,8 @@ uint NvInferServerManager::extract_tensor_metadata( uint detected_persons = 0; float *data = static_cast(layer.buffer); - for (unsigned int jkl = 0; jkl < 100; - jkl++) { // maximum 100 persons for each frame - if (data[jkl * 57 + 4] > threshold_body_detection) { + for (unsigned int jkl = 0; jkl < MAX_BODY_PER_FRAME; jkl++) { + if (data[jkl * BODY_TENSOR_SIZE + 4] > threshold_body_detection) { detected_persons++; } } @@ -404,7 +405,8 @@ void NvInferServerManager::update_frame_with_face_body_meta( // injecting your own custom objects into the pipeline and need // to differentiate your component from PGIE/SGIE. - imprecise_face_obj_meta->confidence = data[index * 57 + 4]; + imprecise_face_obj_meta->confidence = + data[index * BODY_TENSOR_SIZE + 4]; // imprecise_face_obj_meta->object_id = UNTRACKED_OBJECT_ID; imprecise_face_obj_meta->class_id = IMPRECISE_FACE_CLASS_ID; // 0 for body detection @@ -413,17 +415,18 @@ void NvInferServerManager::update_frame_with_face_body_meta( NvOSD_TextParams &text_params_imprecise_face = imprecise_face_obj_meta->text_params; /* Assign bounding box coordinates. */ - rect_params_imprecise_face.left = - (data[index * 57 + 0] * MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + rect_params_imprecise_face.left = (data[index * BODY_TENSOR_SIZE + 0] * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); rect_params_imprecise_face.top = - (data[index * 57 + 1] * MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); + (data[index * BODY_TENSOR_SIZE + 1] * MUXER_OUTPUT_HEIGHT / + PGIE_NET_HEIGHT); Point2D left_down_shoulder = find_left_down_corner_shoulder(data, index); rect_params_imprecise_face.width = - ((left_down_shoulder.x - data[index * 57 + 0]) * + ((left_down_shoulder.x - data[index * BODY_TENSOR_SIZE + 0]) * MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); rect_params_imprecise_face.height = - ((left_down_shoulder.y - data[index * 57 + 1]) * + ((left_down_shoulder.y - data[index * BODY_TENSOR_SIZE + 1]) * MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); /* Border of width 3. */ @@ -448,8 +451,10 @@ void NvInferServerManager::update_frame_with_face_body_meta( // adding landmarks to imprecise_face_obj_meta as user_meta NvDsUserMeta *um1 = nvds_acquire_user_meta_from_pool(batch_meta); assert(um1 != NULL); - um1->user_meta_data = - set_metadata_ptr(&(data[index * 57])); // Add landmarks here + + um1->user_meta_data = set_metadata_ptr( + &(data[index * BODY_TENSOR_SIZE])); // Add landmarks here + um1->base_meta.meta_type = NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; um1->base_meta.copy_func = (NvDsMetaCopyFunc)copy_user_meta; @@ -466,22 +471,22 @@ void NvInferServerManager::update_frame_with_face_body_meta( '\0'; // Ensure null-termination body_obj_meta->unique_component_id = BODY_COMPONENT_ID; // meta->unique_id; - body_obj_meta->confidence = data[index * 57 + 4]; + body_obj_meta->confidence = data[index * BODY_TENSOR_SIZE + 4]; // body_obj_meta->object_id = UNTRACKED_OBJECT_ID; body_obj_meta->class_id = PGIE_CLASS_ID_PERSON; // 0 for body detection NvOSD_RectParams &rect_params_body = body_obj_meta->rect_params; NvOSD_TextParams &text_params_body = body_obj_meta->text_params; /* Assign bounding box coordinates. */ - rect_params_body.left = - (data[index * 57 + 0] * MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); - rect_params_body.top = - (data[index * 57 + 1] * MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); - rect_params_body.width = - ((data[index * 57 + 2] - data[index * 57 + 0]) * - MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); - rect_params_body.height = - ((data[index * 57 + 3] - data[index * 57 + 1]) * - MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); + rect_params_body.left = (data[index * BODY_TENSOR_SIZE + 0] * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + rect_params_body.top = (data[index * BODY_TENSOR_SIZE + 1] * + MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); + rect_params_body.width = ((data[index * BODY_TENSOR_SIZE + 2] - + data[index * BODY_TENSOR_SIZE + 0]) * + MUXER_OUTPUT_WIDTH / PGIE_NET_WIDTH); + rect_params_body.height = ((data[index * BODY_TENSOR_SIZE + 3] - + data[index * BODY_TENSOR_SIZE + 1]) * + MUXER_OUTPUT_HEIGHT / PGIE_NET_HEIGHT); /* Border of width 3. */ rect_params_body.border_width = 3; @@ -506,7 +511,7 @@ void NvInferServerManager::update_frame_with_face_body_meta( // NvDsUserMeta *um1 = // nvds_acquire_user_meta_from_pool(batch_meta); // um1->user_meta_data = set_metadata_ptr( - // &(data[index * 57])); // Add landmarks here + // &(data[index * BODY_TENSOR_SIZE])); // Add landmarks here // um1->base_meta.meta_type = // NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; // um1->base_meta.copy_func = (NvDsMetaCopyFunc)copy_user_meta; @@ -520,12 +525,13 @@ void NvInferServerManager::update_frame_with_face_body_meta( NvInferServerManager::Point2D NvInferServerManager::find_left_down_corner_shoulder(float *data, uint index) { Point2D left_down_shoulder; - if (data[index * 57 + 21] > data[index * 57 + 24]) { - left_down_shoulder.x = data[index * 57 + 21]; - left_down_shoulder.y = data[index * 57 + 22]; + if (data[index * BODY_TENSOR_SIZE + 21] > + data[index * BODY_TENSOR_SIZE + 24]) { + left_down_shoulder.x = data[index * BODY_TENSOR_SIZE + 21]; + left_down_shoulder.y = data[index * BODY_TENSOR_SIZE + 22]; } else { - left_down_shoulder.x = data[index * 57 + 24]; - left_down_shoulder.y = data[index * 57 + 25]; + left_down_shoulder.x = data[index * BODY_TENSOR_SIZE + 24]; + left_down_shoulder.y = data[index * BODY_TENSOR_SIZE + 25]; } return left_down_shoulder; } @@ -533,13 +539,8 @@ NvInferServerManager::find_left_down_corner_shoulder(float *data, uint index) { // add custom infromation to metadata by: set_metadata_ptr, copy_user_meta, // release_user_meta void *NvInferServerManager::set_metadata_ptr(float *arr) { - int i = 0; - float *user_metadata = (float *)g_malloc0(57 * sizeof(float)); - - for (i = 0; i < 57; i++) { - user_metadata[i] = arr[i]; - } - // user_metadata[51] = source_id; + float *user_metadata = (float *)g_malloc0(BODY_TENSOR_SIZE * sizeof(float)); + std::memcpy(user_metadata, &arr[0], BODY_TENSOR_SIZE * sizeof(float)); return (void *)user_metadata; } @@ -548,8 +549,10 @@ gpointer NvInferServerManager::copy_user_meta(gpointer data, (void)user_data; NvDsUserMeta *user_meta = (NvDsUserMeta *)data; gfloat *src_user_metadata = (gfloat *)user_meta->user_meta_data; - gfloat *dst_user_metadata = (gfloat *)g_malloc0(57 * sizeof(gfloat)); - memcpy(dst_user_metadata, src_user_metadata, 57 * sizeof(gfloat)); + gfloat *dst_user_metadata = + (gfloat *)g_malloc0(BODY_TENSOR_SIZE * sizeof(gfloat)); + memcpy(dst_user_metadata, src_user_metadata, + BODY_TENSOR_SIZE * sizeof(gfloat)); return (gpointer)dst_user_metadata; }