Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.3 kB
1
Indexable
Never
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;
}
Leave a Comment