diff --git a/src/nv_infer_server_manager.cpp b/src/nv_infer_server_manager.cpp index 9629bf4..2570184 100644 --- a/src/nv_infer_server_manager.cpp +++ b/src/nv_infer_server_manager.cpp @@ -248,79 +248,82 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( NvDsUserMeta *user_meta = (NvDsUserMeta *)l_user->data; if (user_meta->base_meta.meta_type != NVDSINFER_TENSOR_OUTPUT_META) continue; - - /* convert to tensor metadata */ - NvDsInferTensorMeta *meta = - (NvDsInferTensorMeta *)user_meta->user_meta_data; - for (unsigned int i = 0; i < meta->num_output_layers; i++) { - NvDsInferLayerInfo *info = &meta->output_layers_info[i]; - info->buffer = meta->out_buf_ptrs_host[i]; - if (use_device_mem && meta->out_buf_ptrs_dev[i]) { - cudaMemcpy(meta->out_buf_ptrs_host[i], - meta->out_buf_ptrs_dev[i], - info->inferDims.numElements * 4, - cudaMemcpyDeviceToHost); - } - } - /* Parse output tensor and fill detection results into objectList. - */ - std::vector outputLayersInfo( - meta->output_layers_info, - meta->output_layers_info + meta->num_output_layers); -#if NVDS_VERSION_MAJOR >= 5 - if (nvds_lib_major_version >= 5) { - if (meta->network_info.width != networkInfo.width || - meta->network_info.height != networkInfo.height || - meta->network_info.channels != networkInfo.channels) { - g_error("failed to check pgie network info\n"); - } - } -#endif - - float *outputBuffer = (float *)outputLayersInfo[0].buffer; - (void)outputBuffer; - // NvDsInferDims dims = outputLayersInfo[0].inferDims; - - for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) { - const NvDsInferLayerInfo &layer = outputLayersInfo[jkl]; - - unsigned int numDims = layer.inferDims.numDims; - unsigned int numElements = layer.inferDims.numElements; - (void)numElements; - (void)numDims; - - // std::cout << "Layer " << jkl << " (" << layer.layerName << - // "):\n"; std::cout << " Num Dims: " << numDims << "\n"; - // std::cout << " Num Elements: " << numElements << "\n"; - // 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; - // if (mno < numDims - 1) - // std::cout << ", "; - // } - // std::cout << "]\n"; - } - const NvDsInferLayerInfo &layer = - outputLayersInfo[0]; // or loop over all - - uint detected_persons = 0; - float *data = static_cast(layer.buffer); - for (unsigned int jkl = 0; jkl < 100; - jkl++) { // 100 persons for each frame - if (data[jkl * 57 + 4] > threshold_body_detection) { - detected_persons++; - } - } - update_frame_with_face_body_meta(detected_persons, batch_meta, meta, - data, frame_meta); + extract_tensor_metadata(user_meta, networkInfo, batch_meta, + frame_meta); } } // use_device_mem = 1 - use_device_mem; return GST_PAD_PROBE_OK; } +void NvInferServerManager::extract_tensor_metadata( + NvDsUserMeta *user_meta, NvDsInferNetworkInfo networkInfo, + NvDsBatchMeta *batch_meta, NvDsFrameMeta *frame_meta) { + /* convert to tensor metadata */ + NvDsInferTensorMeta *meta = + (NvDsInferTensorMeta *)user_meta->user_meta_data; + for (unsigned int i = 0; i < meta->num_output_layers; i++) { + NvDsInferLayerInfo *info = &meta->output_layers_info[i]; + info->buffer = meta->out_buf_ptrs_host[i]; + if (use_device_mem && meta->out_buf_ptrs_dev[i]) { + cudaMemcpy(meta->out_buf_ptrs_host[i], meta->out_buf_ptrs_dev[i], + info->inferDims.numElements * 4, cudaMemcpyDeviceToHost); + } + } + /* Parse output tensor and fill detection results into objectList. + */ + std::vector outputLayersInfo( + meta->output_layers_info, + meta->output_layers_info + meta->num_output_layers); +#if NVDS_VERSION_MAJOR >= 5 + if (nvds_lib_major_version >= 5) { + if (meta->network_info.width != networkInfo.width || + meta->network_info.height != networkInfo.height || + meta->network_info.channels != networkInfo.channels) { + g_error("failed to check pgie network info\n"); + } + } +#endif + + float *outputBuffer = (float *)outputLayersInfo[0].buffer; + (void)outputBuffer; + // NvDsInferDims dims = outputLayersInfo[0].inferDims; + + for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) { + const NvDsInferLayerInfo &layer = outputLayersInfo[jkl]; + + unsigned int numDims = layer.inferDims.numDims; + unsigned int numElements = layer.inferDims.numElements; + (void)numElements; + (void)numDims; + + // std::cout << "Layer " << jkl << " (" << layer.layerName << + // "):\n"; std::cout << " Num Dims: " << numDims << "\n"; + // std::cout << " Num Elements: " << numElements << "\n"; + // 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; + // if (mno < numDims - 1) + // std::cout << ", "; + // } + // std::cout << "]\n"; + } + const NvDsInferLayerInfo &layer = outputLayersInfo[0]; // or loop over all + + 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) { + detected_persons++; + } + } + update_frame_with_face_body_meta(detected_persons, batch_meta, meta, data, + frame_meta); +} + void NvInferServerManager::update_frame_with_face_body_meta( uint detected_persons, NvDsBatchMeta *batch_meta, NvDsInferTensorMeta *meta, float *data, NvDsFrameMeta *frame_meta) { diff --git a/src/nv_infer_server_manager.hpp b/src/nv_infer_server_manager.hpp index cbc35c4..9c2a077 100644 --- a/src/nv_infer_server_manager.hpp +++ b/src/nv_infer_server_manager.hpp @@ -43,4 +43,6 @@ class NvInferServerManager { static void update_frame_with_face_body_meta(uint, NvDsBatchMeta *, NvDsInferTensorMeta *, float *, NvDsFrameMeta *); + static void extract_tensor_metadata(NvDsUserMeta *, NvDsInferNetworkInfo, + NvDsBatchMeta *, NvDsFrameMeta *); }; \ No newline at end of file