Untitled

 avatar
unknown
plain_text
a year ago
2.2 kB
4
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