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"))
|
||||
#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \
|
||||
(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 PGIE_CLASS_ID_PERSON 0
|
||||
@ -12,6 +15,7 @@
|
||||
#define BODY_COMPONENT_ID 1
|
||||
#define IMPRECISE_FACE_COMPONENT_ID 2
|
||||
#define FINAL_FACE_COMPONENT_ID 3
|
||||
#define EMBEDDING_VECTOR_SIZE 512
|
||||
|
||||
gint FaceNvInferServerManager::frame_number = 0;
|
||||
unsigned int FaceNvInferServerManager::FACE_NET_WIDTH = 1;
|
||||
@ -1364,6 +1368,8 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
||||
|
||||
float score_face = 0;
|
||||
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++) {
|
||||
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
|
||||
// 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
|
||||
// 3 times more than is_zero_embedding_vector 0
|
||||
} else {
|
||||
is_zero_embedding_vector =
|
||||
std::all_of(data_face, data_face + 512,
|
||||
[](float v) { return v == 0.0f; });
|
||||
is_zero_embedding_vector = std::all_of(
|
||||
data_face, data_face + EMBEDDING_VECTOR_SIZE,
|
||||
[](float v) { return v == 0.0f; });
|
||||
// is_zero_embedding_vector = 0;
|
||||
}
|
||||
// std::cout<<"is_zero_embedding_vector =
|
||||
// "<<is_zero_embedding_vector<<std::endl; for (int l =
|
||||
// 0; l < 512; l++) {
|
||||
// std::cout << "face_location[" << l
|
||||
// << "]= " << data_face[l] << std::endl;
|
||||
// }
|
||||
|
||||
if (is_zero_embedding_vector == false) {
|
||||
// copy the values
|
||||
std::memcpy(embedding_vector, data_face,
|
||||
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(
|
||||
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,
|
||||
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,
|
||||
obj_meta);
|
||||
@ -1643,9 +1668,9 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe(
|
||||
// release_user_meta
|
||||
void *FaceNvInferServerManager::set_metadata_ptr(float *arr) {
|
||||
int i = 0;
|
||||
float *user_metadata = (float *)g_malloc0(512 * sizeof(float));
|
||||
|
||||
for (i = 0; i < 512; i++) {
|
||||
float *user_metadata =
|
||||
(float *)g_malloc0(EMBEDDING_VECTOR_SIZE * sizeof(float));
|
||||
for (i = 0; i < EMBEDDING_VECTOR_SIZE; i++) {
|
||||
user_metadata[i] = arr[i];
|
||||
}
|
||||
return (void *)user_metadata;
|
||||
@ -1656,8 +1681,10 @@ gpointer FaceNvInferServerManager::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(512 * sizeof(gfloat));
|
||||
memcpy(dst_user_metadata, src_user_metadata, 512 * sizeof(gfloat));
|
||||
gfloat *dst_user_metadata =
|
||||
(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;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
#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
|
||||
#ifdef ENABLE_DUMP_FILE
|
||||
FILE *fp;
|
||||
@ -38,6 +41,7 @@ char fileObjNameString[1024];
|
||||
#define MAX_TIME_STAMP_LEN 32
|
||||
#define PGIE_CLASS_ID_PERSON 0
|
||||
#define FACE_CLASS_ID 1
|
||||
#define EMBEDDING_VECTOR_SIZE 512
|
||||
|
||||
gint msg2p_meta =
|
||||
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.
|
||||
* 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.
|
||||
* Here message is being sent for first object every
|
||||
* frame_interval(default=30).
|
||||
@ -523,6 +545,8 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_metadata_probe(
|
||||
msg_meta->frameId = frame_number;
|
||||
msg_meta->trackingId = obj_meta->object_id;
|
||||
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);
|
||||
|
||||
NvDsUserMeta *user_event_meta =
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user