Adding second primary detector based on test 5

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;
}
1 Like

with test5 you can set sgie work like pgie with property process-mode =1 in [property] groups of sgie config file