Refactor array copying

This commit is contained in:
Barzan Hayati 2025-09-17 22:49:07 +00:00
parent e70c9bbd6a
commit e7c20e08ea
2 changed files with 45 additions and 46 deletions

View File

@ -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;
}

View File

@ -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<float *>(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;
}