Untitled
unknown
plain_text
2 years ago
2.3 kB
20
Indexable
static vsi_status vnn_PostProcessNeuralNetwork
(
vsi_nn_graph_t *graph
)
{
vsi_status status = vnn_PostProcessOnnx(graph);
if (status != VSI_SUCCESS)
{
return status;
}
// Lấy dữ liệu đầu ra từ tensor
vsi_nn_tensor_t *tensor = vsi_nn_GetTensor(graph, graph->output.tensors[0]);
uint8_t *tensor_data = NULL;
vsi_nn_GetTensorHandle(tensor, (void**)&tensor_data);
if (!tensor_data)
{
printf("Error getting tensor data\n");
return VSI_FAILURE;
}
// In ra shape của tensor đầu ra
printf("Output tensor shape: [");
for (uint32_t i = 0; i < tensor->attr.dim_num; i++)
{
printf("%d", tensor->attr.size[i]);
if (i < tensor->attr.dim_num - 1)
{
printf(", ");
}
}
printf("]\n");
// Dequantize dữ liệu tensor từ int16 sang float
uint32_t tensor_size = 1;
for (uint32_t j = 0; j < tensor->attr.dim_num; j++)
{
tensor_size *= tensor->attr.size[j];
}
uint32_t stride = sizeof(int16_t);
float *output_tensor_buf = calloc(tensor_size, sizeof(float));
if (!output_tensor_buf)
{
printf("Error allocating memory for output tensor buffer\n");
return VSI_FAILURE;
}
for (uint32_t j = 0; j < tensor_size; j++)
{
int16_t int16_value = ((int16_t*)tensor_data)[j];
output_tensor_buf[j] = (float)int16_value;
}
const uint32_t num_detections = tensor->attr.size[1]; // Số lượng phát hiện
const uint32_t num_features = tensor->attr.size[0]; // Số lượng đặc trưng
const float confidence_threshold = 0.35;
// Duyệt qua các đầu ra và kiểm tra giá trị confidence
for (uint32_t i = 0; i < num_detections; i++)
{
// Lấy giá trị confidence của hai lớp đầu tiên
float conf_class0 = output_tensor_buf[i * num_features];
float conf_class1 = output_tensor_buf[i * num_features + 1];
if (conf_class0 > confidence_threshold)
{
printf("fire\n");
}
if (conf_class1 > confidence_threshold)
{
printf("smoke\n");
}
}
// Giải phóng bộ nhớ
free(output_tensor_buf);
vsi_nn_Free(tensor_data);
return VSI_SUCCESS;
}
Editor is loading...
Leave a Comment