65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
// Copyright (C) 2018-2025 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
#include "infer_result_util.h"
|
|
|
|
int compare(const void* a, const void* b) {
|
|
const struct infer_result* sa = (const struct infer_result*)a;
|
|
const struct infer_result* sb = (const struct infer_result*)b;
|
|
if (sa->probability < sb->probability) {
|
|
return 1;
|
|
} else if ((sa->probability == sb->probability) && (sa->class_id > sb->class_id)) {
|
|
return 1;
|
|
} else if (sa->probability > sb->probability) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
void infer_result_sort(struct infer_result* results, size_t result_size) {
|
|
qsort(results, result_size, sizeof(struct infer_result), compare);
|
|
}
|
|
|
|
struct infer_result* tensor_to_infer_result(ov_tensor_t* tensor, size_t* result_size) {
|
|
ov_shape_t output_shape = {0};
|
|
ov_status_e status = ov_tensor_get_shape(tensor, &output_shape);
|
|
if (status != OK)
|
|
return NULL;
|
|
|
|
*result_size = output_shape.dims[1];
|
|
|
|
struct infer_result* results = (struct infer_result*)malloc(sizeof(struct infer_result) * (*result_size));
|
|
if (!results) {
|
|
ov_shape_free(&output_shape);
|
|
return NULL;
|
|
}
|
|
|
|
void* data = NULL;
|
|
status = ov_tensor_data(tensor, &data);
|
|
if (status != OK) {
|
|
ov_shape_free(&output_shape);
|
|
free(results);
|
|
return NULL;
|
|
}
|
|
float* float_data = (float*)(data);
|
|
|
|
size_t i;
|
|
for (i = 0; i < *result_size; ++i) {
|
|
results[i].class_id = i;
|
|
results[i].probability = float_data[i];
|
|
}
|
|
|
|
ov_shape_free(&output_shape);
|
|
return results;
|
|
}
|
|
|
|
void print_infer_result(struct infer_result* results, size_t result_size, const char* img_path) {
|
|
printf("\nImage %s\n", img_path);
|
|
printf("\nclassid probability\n");
|
|
printf("------- -----------\n");
|
|
size_t i;
|
|
for (i = 0; i < result_size; ++i) {
|
|
printf("%zu %f\n", results[i].class_id, results[i].probability);
|
|
}
|
|
}
|