Untitled
unknown
plain_text
a year ago
2.2 kB
7
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "vsi_nn_pub.h"
static vsi_status vnn_PostProcessNeuralNetwork
(
vsi_nn_graph_t *graph
)
{
vsi_status status = vnn_PostProcessOnnx(graph);
if (status != VSI_SUCCESS)
{
return status;
}
// Số lượng đầu ra
const uint32_t num_detections = 3549;
const uint32_t num_classes = 2;
const uint32_t num_features = 34; // Tổng số tính năng
const float confidence_threshold = 0.35;
// Lấy dữ liệu đầu ra từ tensor
vsi_nn_tensor_t *tensor = vsi_nn_GetTensor(graph, graph->output.tensors[0]);
int16_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 kích thước của tensor
printf("Tensor dimensions: ");
for (uint32_t i = 0; i < tensor->attr.dim_num; i++)
{
printf("%d ", tensor->attr.size[i]);
}
printf("\n");
// Tính toán kích thước của tensor
uint32_t tensor_size = 1;
for (uint32_t j = 0; j < tensor->attr.dim_num; j++)
{
tensor_size *= tensor->attr.size[j];
}
// Dequantize dữ liệu tensor sang float
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++)
{
vsi_nn_DtypeToFloat32(&tensor_data[j], &output_tensor_buf[j], &tensor->attr.dtype);
}
// Duyệt qua các đầu ra
for (uint32_t i = 0; i < num_detections; i++)
{
// Lấy giá trị confidence cuối cùng của mỗi phần tử
float object_confidence = 1 / (1 + exp(-output_tensor_buf[i * num_features + num_features - 1])); // Áp dụng sigmoid
if (object_confidence > confidence_threshold)
{
printf("ok\n");
break; // Chỉ cần in "ok" một lần nếu phát hiện bất kỳ đối tượng nào
}
}
// Giải phóng bộ nhớ
free(output_tensor_buf);
return VSI_SUCCESS;
}
Editor is loading...
Leave a Comment