Attach embedding vector in sgie fetch in nvosd
This commit is contained in:
parent
b7e93c949e
commit
394402b37c
@ -4,6 +4,9 @@
|
|||||||
// (nvds_get_user_meta_type("NVIDIA.NVINFER.USER_META"))
|
// (nvds_get_user_meta_type("NVIDIA.NVINFER.USER_META"))
|
||||||
#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \
|
#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \
|
||||||
(nvds_get_user_meta_type(const_cast<gchar *>("NVIDIA.NVINFER.USER_META")))
|
(nvds_get_user_meta_type(const_cast<gchar *>("NVIDIA.NVINFER.USER_META")))
|
||||||
|
#define NVDS_USER_EMBEDDING_VECTOR_META \
|
||||||
|
(nvds_get_user_meta_type( \
|
||||||
|
const_cast<gchar *>("NVIDIA.NVINFER.EMBEDDING_VECTOR.USER_META")))
|
||||||
|
|
||||||
#define MAX_DISPLAY_LEN 64
|
#define MAX_DISPLAY_LEN 64
|
||||||
#define PGIE_CLASS_ID_PERSON 0
|
#define PGIE_CLASS_ID_PERSON 0
|
||||||
@ -12,6 +15,7 @@
|
|||||||
#define BODY_COMPONENT_ID 1
|
#define BODY_COMPONENT_ID 1
|
||||||
#define IMPRECISE_FACE_COMPONENT_ID 2
|
#define IMPRECISE_FACE_COMPONENT_ID 2
|
||||||
#define FINAL_FACE_COMPONENT_ID 3
|
#define FINAL_FACE_COMPONENT_ID 3
|
||||||
|
#define EMBEDDING_VECTOR_SIZE 512
|
||||||
|
|
||||||
gint FaceNvInferServerManager::frame_number = 0;
|
gint FaceNvInferServerManager::frame_number = 0;
|
||||||
unsigned int FaceNvInferServerManager::FACE_NET_WIDTH = 1;
|
unsigned int FaceNvInferServerManager::FACE_NET_WIDTH = 1;
|
||||||
@ -1364,6 +1368,8 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
|||||||
|
|
||||||
float score_face = 0;
|
float score_face = 0;
|
||||||
float *face_location = (float *)g_malloc0(4 * sizeof(float));
|
float *face_location = (float *)g_malloc0(4 * sizeof(float));
|
||||||
|
float *embedding_vector =
|
||||||
|
(float *)g_malloc0(EMBEDDING_VECTOR_SIZE * sizeof(float));
|
||||||
for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) {
|
for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) {
|
||||||
const NvDsInferLayerInfo &layer = outputLayersInfo[jkl];
|
const NvDsInferLayerInfo &layer = outputLayersInfo[jkl];
|
||||||
|
|
||||||
@ -1416,25 +1422,27 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
|||||||
0.0f) // if the first element is zero, then its
|
0.0f) // if the first element is zero, then its
|
||||||
// possible all element are zero
|
// possible all element are zero
|
||||||
{
|
{
|
||||||
is_zero_embedding_vector = all_zero(data_face, 512);
|
is_zero_embedding_vector =
|
||||||
|
all_zero(data_face, EMBEDDING_VECTOR_SIZE);
|
||||||
// is_zero_embedding_vector = 1 where approximately
|
// is_zero_embedding_vector = 1 where approximately
|
||||||
// 3 times more than is_zero_embedding_vector 0
|
// 3 times more than is_zero_embedding_vector 0
|
||||||
} else {
|
} else {
|
||||||
is_zero_embedding_vector =
|
is_zero_embedding_vector = std::all_of(
|
||||||
std::all_of(data_face, data_face + 512,
|
data_face, data_face + EMBEDDING_VECTOR_SIZE,
|
||||||
[](float v) { return v == 0.0f; });
|
[](float v) { return v == 0.0f; });
|
||||||
// is_zero_embedding_vector = 0;
|
// is_zero_embedding_vector = 0;
|
||||||
}
|
}
|
||||||
// std::cout<<"is_zero_embedding_vector =
|
|
||||||
// "<<is_zero_embedding_vector<<std::endl; for (int l =
|
if (is_zero_embedding_vector == false) {
|
||||||
// 0; l < 512; l++) {
|
// copy the values
|
||||||
// std::cout << "face_location[" << l
|
std::memcpy(embedding_vector, data_face,
|
||||||
// << "]= " << data_face[l] << std::endl;
|
EMBEDDING_VECTOR_SIZE * sizeof(float));
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (score_face > threshold_face_detection) {
|
if (score_face > threshold_face_detection &&
|
||||||
|
is_zero_embedding_vector == false) {
|
||||||
NvOSD_RectParams *updated_bbox = allign_postprocess(
|
NvOSD_RectParams *updated_bbox = allign_postprocess(
|
||||||
obj_meta->rect_params, face_location);
|
obj_meta->rect_params, face_location);
|
||||||
|
|
||||||
@ -1541,6 +1549,23 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
|||||||
encode_objects_attach_meta(ctx, ip_surf, frame_meta,
|
encode_objects_attach_meta(ctx, ip_surf, frame_meta,
|
||||||
final_face_obj);
|
final_face_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adding embedding vector to final_face_obj as
|
||||||
|
// user_meta
|
||||||
|
NvDsUserMeta *user_meta_embedding_vector =
|
||||||
|
nvds_acquire_user_meta_from_pool(batch_meta);
|
||||||
|
assert(user_meta_embedding_vector != NULL);
|
||||||
|
user_meta_embedding_vector->user_meta_data =
|
||||||
|
set_metadata_ptr(
|
||||||
|
embedding_vector); // Add embedding vector
|
||||||
|
user_meta_embedding_vector->base_meta.meta_type =
|
||||||
|
NVDS_USER_EMBEDDING_VECTOR_META;
|
||||||
|
user_meta_embedding_vector->base_meta.copy_func =
|
||||||
|
(NvDsMetaCopyFunc)copy_user_meta;
|
||||||
|
user_meta_embedding_vector->base_meta.release_func =
|
||||||
|
(NvDsMetaReleaseFunc)release_user_meta;
|
||||||
|
nvds_add_user_meta_to_obj(final_face_obj,
|
||||||
|
user_meta_embedding_vector);
|
||||||
}
|
}
|
||||||
nvds_add_obj_meta_to_frame(frame_meta, final_face_obj,
|
nvds_add_obj_meta_to_frame(frame_meta, final_face_obj,
|
||||||
obj_meta);
|
obj_meta);
|
||||||
@ -1643,9 +1668,9 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
|||||||
// release_user_meta
|
// release_user_meta
|
||||||
void *FaceNvInferServerManager::set_metadata_ptr(float *arr) {
|
void *FaceNvInferServerManager::set_metadata_ptr(float *arr) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
float *user_metadata = (float *)g_malloc0(512 * sizeof(float));
|
float *user_metadata =
|
||||||
|
(float *)g_malloc0(EMBEDDING_VECTOR_SIZE * sizeof(float));
|
||||||
for (i = 0; i < 512; i++) {
|
for (i = 0; i < EMBEDDING_VECTOR_SIZE; i++) {
|
||||||
user_metadata[i] = arr[i];
|
user_metadata[i] = arr[i];
|
||||||
}
|
}
|
||||||
return (void *)user_metadata;
|
return (void *)user_metadata;
|
||||||
@ -1656,8 +1681,10 @@ gpointer FaceNvInferServerManager::copy_user_meta(gpointer data,
|
|||||||
(void)user_data;
|
(void)user_data;
|
||||||
NvDsUserMeta *user_meta = (NvDsUserMeta *)data;
|
NvDsUserMeta *user_meta = (NvDsUserMeta *)data;
|
||||||
gfloat *src_user_metadata = (gfloat *)user_meta->user_meta_data;
|
gfloat *src_user_metadata = (gfloat *)user_meta->user_meta_data;
|
||||||
gfloat *dst_user_metadata = (gfloat *)g_malloc0(512 * sizeof(gfloat));
|
gfloat *dst_user_metadata =
|
||||||
memcpy(dst_user_metadata, src_user_metadata, 512 * sizeof(gfloat));
|
(gfloat *)g_malloc0(EMBEDDING_VECTOR_SIZE * sizeof(gfloat));
|
||||||
|
memcpy(dst_user_metadata, src_user_metadata,
|
||||||
|
EMBEDDING_VECTOR_SIZE * sizeof(gfloat));
|
||||||
return (gpointer)dst_user_metadata;
|
return (gpointer)dst_user_metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
#include "nv_osd_manager.hpp"
|
#include "nv_osd_manager.hpp"
|
||||||
|
|
||||||
|
#define NVDS_USER_EMBEDDING_VECTOR_META \
|
||||||
|
(nvds_get_user_meta_type( \
|
||||||
|
const_cast<gchar *>("NVIDIA.NVINFER.EMBEDDING_VECTOR.USER_META")))
|
||||||
// #define ENABLE_DUMP_FILE
|
// #define ENABLE_DUMP_FILE
|
||||||
#ifdef ENABLE_DUMP_FILE
|
#ifdef ENABLE_DUMP_FILE
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
@ -38,6 +41,7 @@ char fileObjNameString[1024];
|
|||||||
#define MAX_TIME_STAMP_LEN 32
|
#define MAX_TIME_STAMP_LEN 32
|
||||||
#define PGIE_CLASS_ID_PERSON 0
|
#define PGIE_CLASS_ID_PERSON 0
|
||||||
#define FACE_CLASS_ID 1
|
#define FACE_CLASS_ID 1
|
||||||
|
#define EMBEDDING_VECTOR_SIZE 512
|
||||||
|
|
||||||
gint msg2p_meta =
|
gint msg2p_meta =
|
||||||
0; //"Type of message schema (0=Full, 1=minimal, 2=protobuf), default=0
|
0; //"Type of message schema (0=Full, 1=minimal, 2=protobuf), default=0
|
||||||
@ -508,7 +512,25 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_metadata_probe(
|
|||||||
* component implementing detection / recognition logic.
|
* component implementing detection / recognition logic.
|
||||||
* Here it demonstrates how to use / attach that meta data.
|
* Here it demonstrates how to use / attach that meta data.
|
||||||
*/
|
*/
|
||||||
if (is_first_object && !(frame_number % frame_interval)) {
|
|
||||||
|
NvDsUserMeta *user_meta = NULL;
|
||||||
|
NvDsMetaList *l_user_meta = NULL;
|
||||||
|
float *user_meta_data = NULL;
|
||||||
|
bool is_meta_type_NVOSD_embedding_vector = false;
|
||||||
|
for (l_user_meta = obj_meta->obj_user_meta_list;
|
||||||
|
l_user_meta != NULL; l_user_meta = l_user_meta->next) {
|
||||||
|
user_meta = (NvDsUserMeta *)(l_user_meta->data);
|
||||||
|
user_meta_data = (float *)user_meta->user_meta_data;
|
||||||
|
if (user_meta->base_meta.meta_type ==
|
||||||
|
NVDS_USER_EMBEDDING_VECTOR_META) {
|
||||||
|
std::cout << "NVOSD_EMBEDDING_VECTOR[" << 0
|
||||||
|
<< "]= " << user_meta_data[0] << std::endl;
|
||||||
|
is_meta_type_NVOSD_embedding_vector = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_first_object && !(frame_number % frame_interval) &&
|
||||||
|
is_meta_type_NVOSD_embedding_vector == true) {
|
||||||
/* Frequency of messages to be send will be based on use case.
|
/* Frequency of messages to be send will be based on use case.
|
||||||
* Here message is being sent for first object every
|
* Here message is being sent for first object every
|
||||||
* frame_interval(default=30).
|
* frame_interval(default=30).
|
||||||
@ -523,6 +545,8 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_metadata_probe(
|
|||||||
msg_meta->frameId = frame_number;
|
msg_meta->frameId = frame_number;
|
||||||
msg_meta->trackingId = obj_meta->object_id;
|
msg_meta->trackingId = obj_meta->object_id;
|
||||||
msg_meta->confidence = obj_meta->confidence;
|
msg_meta->confidence = obj_meta->confidence;
|
||||||
|
msg_meta->embedding.embedding_vector = user_meta_data;
|
||||||
|
msg_meta->embedding.embedding_length = EMBEDDING_VECTOR_SIZE;
|
||||||
generate_event_msg_meta(msg_meta, obj_meta->class_id, obj_meta);
|
generate_event_msg_meta(msg_meta, obj_meta->class_id, obj_meta);
|
||||||
|
|
||||||
NvDsUserMeta *user_event_meta =
|
NvDsUserMeta *user_event_meta =
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user