diff --git a/CMakeLists.txt b/CMakeLists.txt index b4b896b..43351cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,7 @@ set_source_files_properties( src/pipeline_manager.cpp src/nv_tracker_manager.cpp src/face_nv_infer_server_manager.cpp + src/nv_osd_manager.cpp PROPERTIES COMPILE_FLAGS "-Wno-missing-field-initializers" ) diff --git a/data/configuration.json b/data/configuration.json index d4c0c28..093eddf 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -66,5 +66,7 @@ "redis_broker_port": 6379, "topic_redis": "redis_stream" }, - "compression_coefficient": 0.125 + "compression_coefficient": 0.125, + "write_full_frame_to_disk": true, + "write_cropped_objects_to_disk": true } \ No newline at end of file diff --git a/src/face_nv_infer_server_manager.cpp b/src/face_nv_infer_server_manager.cpp index aef8960..051c3f3 100644 --- a/src/face_nv_infer_server_manager.cpp +++ b/src/face_nv_infer_server_manager.cpp @@ -9,6 +9,7 @@ #define PGIE_CLASS_ID_PERSON 0 #define PGIE_DETECTED_CLASS_NUM 1 #define SGIE_DETECTED_CLASS_NUM 1 +#define BODY_COMPONENT_ID 1 #define IMPRECISE_FACE_COMPONENT_ID 2 #define FINAL_FACE_COMPONENT_ID 3 @@ -1164,14 +1165,26 @@ void FaceNvInferServerManager::encode_objects_attach_meta( /* Preset */ // objData.objNum = num_rects; /* Quality */ - objData.quality = 80; + // objData.quality = 80; /* Set to calculate time taken to encode JPG image. */ // if (calc_enc) { // objData.calcEncodeTime = 1; // } /*Main Function Call */ + + // bool nvds_obj_enc_process (NvDsObjEncCtxHandle, NvDsObjEncUsrArgs *, + // NvBufSurface *, NvDsObjectMeta *, NvDsFrameMeta *); nvds_obj_enc_process(static_cast(ctx), &objData, ip_surf, obj_meta, frame_meta); + if (obj_meta->unique_component_id == 1) { + std::cout << "obj_meta->unique_component_id = " + << obj_meta->unique_component_id + << " obj_meta->rect_params.width = " + << obj_meta->rect_params.width + << " obj_meta->rect_params.height = " + << obj_meta->rect_params.height << std::endl; + std::quick_exit(0); + } } void FaceNvInferServerManager::encode_full_frame_attach_meta( @@ -1198,7 +1211,7 @@ void FaceNvInferServerManager::encode_full_frame_attach_meta( } // AVX check function -bool FaceNvInferServerManager::allZeroAVX(const float *data, size_t size) { +bool FaceNvInferServerManager::all_zero_avx(const float *data, size_t size) { size_t i = 0; __m256 zero = _mm256_setzero_ps(); // 8 floats of 0.0 for (; i + 8 <= size; i += 8) { @@ -1213,7 +1226,7 @@ bool FaceNvInferServerManager::allZeroAVX(const float *data, size_t size) { return true; } -bool FaceNvInferServerManager::allZero(const float *data, size_t size) { +bool FaceNvInferServerManager::all_zero(const float *data, size_t size) { size_t i = 0; #if defined(__AVX512F__) @@ -1293,12 +1306,34 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( for (NvDsMetaList *l_obj = frame_meta->obj_meta_list; l_obj != NULL; l_obj = l_obj->next) { NvDsObjectMeta *obj_meta = (NvDsObjectMeta *)l_obj->data; - NvDsObjectMeta *parent = NULL; - if (obj_meta->unique_component_id != 1) { - NvDsObjectMeta *parent = obj_meta->parent; - (void)parent; + + if (obj_meta->unique_component_id == 1 && + obj_meta->obj_user_meta_list != NULL) { + // body object obj_user_meta_list list is empty so + // for loop : Iterate user metadata in object to search SGIE's + // tensor data could not execute. + std::cout << "obj_meta->unique_component_id = " + << obj_meta->unique_component_id + << " obj_meta->rect_params.width = " + << obj_meta->rect_params.width + << " obj_meta->rect_params.height = " + << obj_meta->rect_params.height << std::endl; } - (void)parent; + // if (obj_meta->unique_component_id == 2) { + // body = obj_meta->parent; + + // // if(body) + // // { + // // std::cout<<"body->class_id = "<class_id + // // << " body->unique_component_id = + // "<unique_component_id<unique_component_id==1){ + // // std::quick_exit(0); + // // } + // // } + + // } + // (void)parent; // if (obj_meta->unique_component_id != // IMPRECISE_FACE_COMPONENT_ID){ // continue; @@ -1331,7 +1366,9 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( // // std::cout<<"obj_meta->class_id =" // <class_id<class_id = "<class_id + // << " obj_meta->unique_component_id = + // "<unique_component_id<obj_user_meta_list; l_user != NULL; l_user = l_user->next) { @@ -1442,7 +1479,7 @@ 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 = allZero(data_face, 512); + is_zero_embedding_vector = all_zero(data_face, 512); // is_zero_embedding_vector = 1 where approximately // 3 times more than is_zero_embedding_vector 0 } else { @@ -1556,8 +1593,6 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( // um1->base_meta.release_func = // (NvDsMetaReleaseFunc)release_user_meta; // nvds_add_user_meta_to_obj(obj_meta, um1); - nvds_add_obj_meta_to_frame(frame_meta, final_face_obj, - obj_meta); // nvds_add_obj_meta_to_frame(frame_meta, final_face_obj, // NULL); if (is_zero_embedding_vector == false) { @@ -1571,6 +1606,8 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( encode_objects_attach_meta(ctx, ip_surf, frame_meta, final_face_obj); } + nvds_add_obj_meta_to_frame(frame_meta, final_face_obj, + obj_meta); } // for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) { diff --git a/src/face_nv_infer_server_manager.hpp b/src/face_nv_infer_server_manager.hpp index 4e8f135..cd3b32b 100644 --- a/src/face_nv_infer_server_manager.hpp +++ b/src/face_nv_infer_server_manager.hpp @@ -66,8 +66,8 @@ class FaceNvInferServerManager { static NvOSD_RectParams *allign_postprocess(NvOSD_RectParams &, float *); static float numpy_clip(float, float, float); static void add_face_body(int, float); - static bool allZeroAVX(const float *, size_t); - static bool allZero(const float *, size_t); + static bool all_zero_avx(const float *, size_t); + static bool all_zero(const float *, size_t); static void encode_full_frame_attach_meta(gpointer, NvBufSurface *, NvDsFrameMeta *); static void encode_objects_attach_meta(gpointer, NvBufSurface *, diff --git a/src/nv_osd_manager.cpp b/src/nv_osd_manager.cpp index fd13065..6c4c6c5 100644 --- a/src/nv_osd_manager.cpp +++ b/src/nv_osd_manager.cpp @@ -11,8 +11,16 @@ #define PGIE_CLASS_ID_PERSON 0 gint NvOsdManager::frame_number = 0; +bool NvOsdManager::write_full_frame_to_disk = false; +bool NvOsdManager::write_cropped_objects_to_disk = false; -NvOsdManager::NvOsdManager() {} +NvOsdManager::NvOsdManager() { + const auto &config = ConfigManager::get_instance().get_config(); + write_full_frame_to_disk = + config.at("write_full_frame_to_disk").get(); + write_cropped_objects_to_disk = + config.at("write_cropped_objects_to_disk").get(); +} bool NvOsdManager::create_nv_osd() { /* Create OSD to draw on the converted RGBA buffer */ @@ -30,7 +38,8 @@ bool NvOsdManager::create_nv_osd() { } // Attach probe to a pad in the pipeline -void NvOsdManager::attach_probe_to_src_nvosd() { +void NvOsdManager::attach_probe_to_src_nvosd( + NvDsObjEncCtxHandle obj_ctx_handle) { GstPad *src_pad = gst_element_get_static_pad(nvosd, "src"); if (!src_pad) { std::cerr << "Unable to get nvosd src pad\n"; @@ -38,10 +47,82 @@ void NvOsdManager::attach_probe_to_src_nvosd() { } gst_pad_add_probe(src_pad, GST_PAD_PROBE_TYPE_BUFFER, - osd_src_pad_buffer_probe, NULL, NULL); + osd_src_pad_buffer_probe, (gpointer)obj_ctx_handle, NULL); gst_object_unref(src_pad); } +void NvOsdManager::save_full_frame(NvDsFrameMeta *frame_meta) { + char fileFrameNameString[FILE_NAME_SIZE]; + const char *osd_string = "OSD"; + + /* For Demonstration Purposes we are writing metadata to jpeg images of + * the first 10 frames only. + * The files generated have an 'OSD' prefix. */ + NvDsUserMetaList *usrMetaList = frame_meta->frame_user_meta_list; + FILE *file; + int stream_num = 0; + while (usrMetaList != NULL) { + NvDsUserMeta *usrMetaData = (NvDsUserMeta *)usrMetaList->data; + // std::cout<<"usrMetaData->base_meta.meta_type frame = + // "<base_meta.meta_type<base_meta.meta_type == NVDS_CROP_IMAGE_META) { + snprintf(fileFrameNameString, FILE_NAME_SIZE, "%s_frame_%d_%d.jpg", + osd_string, frame_number, stream_num++); + NvDsObjEncOutParams *enc_jpeg_image = + (NvDsObjEncOutParams *)usrMetaData->user_meta_data; + /* Write to File */ + file = fopen(fileFrameNameString, "wb"); + fwrite(enc_jpeg_image->outBuffer, sizeof(uint8_t), + enc_jpeg_image->outLen, file); + fclose(file); + // std::cout<<"fileFrameNameString = + // "<next; + } +} + +void NvOsdManager::save_cropped_objects(NvDsFrameMeta *frame_meta, + NvDsObjectMeta *obj_meta, + guint num_rects) { + const char *osd_string = "OSD"; + // std::cout<<"obj_meta->unique_component_id = + // "<unique_component_id<obj_user_meta_list; + FILE *file; + while (usrMetaList != NULL) { + NvDsUserMeta *usrMetaData = (NvDsUserMeta *)usrMetaList->data; + // std::cout<<"usrMetaData->base_meta.meta_type object = + // "<base_meta.meta_type<base_meta.meta_type == NVDS_CROP_IMAGE_META) { + NvDsObjEncOutParams *enc_jpeg_image = + (NvDsObjEncOutParams *)usrMetaData->user_meta_data; + + snprintf(fileObjNameString, FILE_NAME_SIZE, "%s_%d_%d_%d_%s.jpg", + osd_string, frame_number, frame_meta->batch_id, num_rects, + obj_meta->obj_label); + /* Write to File */ + file = fopen(fileObjNameString, "wb"); + fwrite(enc_jpeg_image->outBuffer, sizeof(uint8_t), + enc_jpeg_image->outLen, file); + fclose(file); + std::cout << "fileObjNameString = " << fileObjNameString + << " obj_meta->class_id =" << obj_meta->class_id + << std::endl; + usrMetaList = NULL; + } else { + usrMetaList = usrMetaList->next; + } + } +} + /* This is the buffer probe function that we have registered on the sink pad * of the OSD element. All the infer elements in the pipeline shall attach * their metadata to the GstBuffer, here we will iterate & process the metadata @@ -65,6 +146,7 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_probe(GstPad *pad, l_frame = l_frame->next) { NvDsFrameMeta *frame_meta = (NvDsFrameMeta *)(l_frame->data); int offset = 0; + if (write_full_frame_to_disk == true) save_full_frame(frame_meta); for (l_obj = frame_meta->obj_meta_list; l_obj != NULL; l_obj = l_obj->next) { obj_meta = (NvDsObjectMeta *)(l_obj->data); @@ -80,6 +162,8 @@ GstPadProbeReturn NvOsdManager::osd_src_pad_buffer_probe(GstPad *pad, // << " Object ID: " << obj_meta->object_id // << std::endl; } + if (write_cropped_objects_to_disk == true) + save_cropped_objects(frame_meta, obj_meta, num_rects); } display_meta = nvds_acquire_display_meta_from_pool(batch_meta); NvOSD_TextParams *txt_params = &display_meta->text_params[0]; diff --git a/src/nv_osd_manager.hpp b/src/nv_osd_manager.hpp index d74af28..f3338e3 100644 --- a/src/nv_osd_manager.hpp +++ b/src/nv_osd_manager.hpp @@ -4,16 +4,19 @@ #include #include "gstnvdsmeta.h" +#include "config_manager.hpp" +#include "custom_gstnvdsinfer.hpp" class NvOsdManager { private: public: GstElement *nvosd = NULL; + static bool write_full_frame_to_disk, write_cropped_objects_to_disk; NvOsdManager(); bool create_nv_osd(); ~NvOsdManager(); static gint frame_number; - void attach_probe_to_src_nvosd(); + void attach_probe_to_src_nvosd(NvDsObjEncCtxHandle); static GstPadProbeReturn osd_src_pad_buffer_probe(GstPad *, GstPadProbeInfo *, gpointer); @@ -21,4 +24,6 @@ class NvOsdManager { static GstPadProbeReturn osd_sink_pad_buffer_probe(GstPad *, GstPadProbeInfo *, gpointer); + static void save_full_frame(NvDsFrameMeta *); + static void save_cropped_objects(NvDsFrameMeta *, NvDsObjectMeta *, guint); }; \ No newline at end of file diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index 296e867..c6c5e4f 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -623,8 +623,8 @@ bool PipelineManager::create_pipeline_elements(int num_sources, face_nv_infer_server_manager->create_face_nv_infer_server(num_sources); - nv_osd_manager - ->attach_probe_to_src_nvosd(); // nvinfer Or use "nvtracker" if after + nv_osd_manager->attach_probe_to_src_nvosd( + obj_ctx_handle); // nvinfer Or use "nvtracker" if after message_handling->create_message_handler(pipeline, g_run_forever, loop); setup_pipeline();