Hi, I’ve been trying to add a second detector to the test5 example but I’m facing some issues. I’ve managed to create another primary_gie
under NvDsPrimaryGieBin
but not sure whether this is the right way. I can see that the model has been loaded when I run the program but the output from primary_gie2
is not shown.
Help will be appreciated!
typedef struct
{
GstElement *bin;
GstElement *queue;
GstElement *nvvidconv;
GstElement *primary_gie;
GstElement *primary_gie2;
} NvDsPrimaryGieBin;
gboolean
create_primary_gie_bin (NvDsGieConfig *config, NvDsGieConfig *config2, NvDsPrimaryGieBin *bin)
{
gboolean ret = FALSE;
gst_nvinfer_raw_output_generated_callback out_callback =
write_infer_output_to_file;
bin->bin = gst_bin_new ("primary_gie_bin");
if (!bin->bin) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie_bin'");
goto done;
}
bin->bin = gst_bin_new ("primary_gie2_bin");
if (!bin->bin) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie2_bin'");
goto done;
}
bin->nvvidconv =
gst_element_factory_make (NVDS_ELEM_VIDEO_CONV, "primary_gie_conv");
if (!bin->nvvidconv) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie_conv'");
goto done;
}
bin->queue = gst_element_factory_make (NVDS_ELEM_QUEUE, "primary_gie_queue");
if (!bin->queue) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie_queue'");
goto done;
}
switch (config->plugin_type) {
case NV_DS_GIE_PLUGIN_INFER:
bin->primary_gie =
gst_element_factory_make (NVDS_ELEM_PGIE, "primary_gie");
bin->primary_gie2 =
gst_element_factory_make (NVDS_ELEM_PGIE, "primary_gie2");
break;
case NV_DS_GIE_PLUGIN_INFER_SERVER:
bin->primary_gie =
gst_element_factory_make (NVDS_ELEM_INFER_SERVER, "primary_gie");
bin->primary_gie2 =
gst_element_factory_make (NVDS_ELEM_INFER_SERVER, "primary_gie2");
break;
default:
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie' "
"on unknown plugin_type");
goto done;
}
if (!bin->primary_gie) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie'");
goto done;
}
if (!bin->primary_gie2) {
NVGSTDS_ERR_MSG_V ("Failed to create 'primary_gie2'");
goto done;
}
g_object_set (G_OBJECT (bin->primary_gie),
"config-file-path", GET_FILE_PATH (config->config_file_path),
"process-mode", 1, NULL);
if (config->is_batch_size_set)
g_object_set (G_OBJECT (bin->primary_gie),
"batch-size", config->batch_size, NULL);
if (config->is_interval_set)
g_object_set (G_OBJECT (bin->primary_gie),
"interval", config->interval, NULL);
if (config->is_unique_id_set)
g_object_set (G_OBJECT (bin->primary_gie),
"unique-id", config->unique_id, NULL);
// Second detector
g_object_set (G_OBJECT (bin->primary_gie2),
"config-file-path", GET_FILE_PATH (config2->config_file_path),
"process-mode", 1, NULL);
if (config2->is_batch_size_set)
g_object_set (G_OBJECT (bin->primary_gie2),
"batch-size", config2->batch_size, NULL);
if (config2->is_interval_set)
g_object_set (G_OBJECT (bin->primary_gie2),
"interval", config2->interval, NULL);
if (config2->is_unique_id_set)
g_object_set (G_OBJECT (bin->primary_gie2),
"unique-id", config2->unique_id, NULL);
// --------------------------
if (config->is_gpu_id_set &&
NV_DS_GIE_PLUGIN_INFER_SERVER == config->plugin_type) {
NVGSTDS_INFO_MSG_V ("gpu-id: %u in primary-gie group is ignored, "
"only accept in nvinferserver's config", config->gpu_id);
}
if (config->raw_output_directory) {
g_object_set (G_OBJECT (bin->primary_gie),
"raw-output-generated-callback", out_callback,
"raw-output-generated-userdata", config,
NULL);
}
if (NV_DS_GIE_PLUGIN_INFER == config->plugin_type) {
if (config->is_gpu_id_set)
g_object_set (G_OBJECT (bin->primary_gie),
"gpu-id", config->gpu_id, NULL);
if (config->model_engine_file_path) {
g_object_set (G_OBJECT (bin->primary_gie), "model-engine-file",
GET_FILE_PATH (config->model_engine_file_path), NULL);
}
}
// Second detector
if (NV_DS_GIE_PLUGIN_INFER == config2->plugin_type) {
if (config2->is_gpu_id_set)
g_object_set (G_OBJECT (bin->primary_gie2),
"gpu-id", config2->gpu_id, NULL);
if (config2->model_engine_file_path) {
g_object_set (G_OBJECT (bin->primary_gie2), "model-engine-file",
GET_FILE_PATH (config2->model_engine_file_path), NULL);
}
}
// --------------------------
g_object_set (G_OBJECT (bin->nvvidconv), "gpu-id", config->gpu_id, NULL);
g_object_set (G_OBJECT (bin->nvvidconv), "nvbuf-memory-type",
config->nvbuf_memory_type, NULL);
gst_bin_add_many (GST_BIN (bin->bin), bin->queue,
bin->nvvidconv, bin->primary_gie, bin->primary_gie2, NULL);
NVGSTDS_LINK_ELEMENT (bin->queue, bin->nvvidconv);
NVGSTDS_LINK_ELEMENT (bin->nvvidconv, bin->primary_gie);
NVGSTDS_BIN_ADD_GHOST_PAD (bin->bin, bin->primary_gie, "src");
NVGSTDS_BIN_ADD_GHOST_PAD (bin->bin, bin->primary_gie2, "src");
NVGSTDS_BIN_ADD_GHOST_PAD (bin->bin, bin->queue, "sink");
ret = TRUE;
done:
if (!ret) {
NVGSTDS_ERR_MSG_V ("%s failed", __func__);
}
return ret;
}