I am trying to run the deepstream-app with a primary-gie as a yolo model and a secondary-gie as a classifier.
The yolo detector works well on the video display, but I can’t find a way to get the secondary-gie inference data in a readable form.
I am using the “infer-raw-output-dir” key in the config file, and receive unreadable bin files in that directory.
How to read these files?
In deepstream_primary_gie_bin.c
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* "gst_buffer_get_nvstream_meta()" can be called on the GstBuffer to get more
* information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
guint j;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* “gst_buffer_get_nvstream_meta()” can be called on the GstBuffer to get more
- information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
guint j;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '\0'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '\0';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* “gst_buffer_get_nvstream_meta()” can be called on the GstBuffer to get more
- information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
guint j;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '\0'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '\0';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
In deepstream_secondary_gie_bin.c
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* "gst_buffer_get_nvstream_meta()" can be called on the GstBuffer to get more
* information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
guint j;
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* “gst_buffer_get_nvstream_meta()” can be called on the GstBuffer to get more
- information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
guint j;
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '\0'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '\0';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '
static void
write_infer_output_to_file (GstBuffer *buf,
NvDsInferNetworkInfo *network_info, NvDsInferLayerInfo *layers_info,
guint num_layers, guint batch_size, gpointer user_data)
{
NvDsGieConfig *config = (NvDsGieConfig *) user_data;
guint i;
/* “gst_buffer_get_nvstream_meta()” can be called on the GstBuffer to get more
- information about the buffer.*/
for (i = 0; i < num_layers; i++) {
NvDsInferLayerInfo *info = &layers_info[i];
guint element_size = 0;
FILE *file;
gchar file_name[PATH_MAX];
gchar layer_name[128];
guint j;
switch (info->dataType) {
case FLOAT: element_size = 4; break;
case HALF: element_size = 2; break;
case INT32: element_size = 4; break;
case INT8: element_size = 1; break;
}
g_strlcpy (layer_name, info->layerName, 128);
for (j = 0; layer_name[j] != '\0'; j++) {
layer_name[j] = (layer_name[j] == '/') ? '_' : layer_name[j];
}
g_snprintf (file_name, PATH_MAX,
"%s/%s_batch%010lu_batchsize%02d.bin",
config->raw_output_directory, layer_name,
config->file_write_frame_num, batch_size);
file_name[PATH_MAX - 1] = '\0';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
';
file = fopen (file_name, "w");
if (!file) {
g_printerr ("Could not open file '%s' for writing:%s\n",
file_name, strerror(errno));
continue;
}
fwrite (info->buffer, element_size, info->dims.numElements * batch_size, file);
fclose (file);
}
config->file_write_frame_num++;
}
NvDsInferLayerInfo:
typedef struct
{
/** Data type of the layer. */
NvDsInferDataType dataType;
/** Dimensions of the layer. */
NvDsInferDims dims;
/** TensorRT binding index of the layer. */
int bindingIndex;
/** Name of the layer. */
const char* layerName;
/** Pointer to the buffer for the layer data. */
void *buffer;
} NvDsInferLayerInfo;