#ifndef __SIPEED_KPU_CLASSIFIER_H
#define __SIPEED_KPU_CLASSIFIER_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stdint.h"
#include "stdbool.h"
#include "imdefs.h"
#if 0
typedef struct image {
int w;
int h;
int bpp;
union {
uint8_t *pixels;
uint8_t *data;
};
uint8_t *pix_ai;
} __attribute__((aligned(8)))image_t;
#endif
typedef struct
{
void* kmodel_ctx;
uint32_t model_size;
uint32_t model_addr;
const char* model_path;
uint32_t max_layers;
} __attribute__((aligned(8))) kpu_model_info_t;
int maix_kpu_classifier_init(void** obj, kpu_model_info_t* model, int class_num, int sample_num, bool flag, int flag2, int feature_length);
int maix_kpu_classifier_add_class_img(void* obj, image_t* img, int idx);
int maix_kpu_classifier_add_sample_img(void* obj, image_t* img);
int maix_kpu_classifier_del(void** obj);
int maix_kpu_classifier_train(void* obj);
int maix_kpu_classifier_predict(void* obj, image_t* img, float* min_distance, int* p_x, int* p_y, int* p_w, int* p_h);
int maix_kpu_classifier_rm_class_img(void* obj);
int maix_kpu_classifier_rm_sample_img(void* obj);
int maix_kpu_classifier_save(void* obj, const char* path);
int maix_kpu_classifier_load(void** obj, const char* path, kpu_model_info_t* kmodel, int* class_num, int* sample_num, int feature_length);
int maix_kpu_detector_init(void** obj, kpu_model_info_t* model, int class_num, int sample_num, int crop_size, int feature_length);
int maix_kpu_detector_add_class_img(void* obj, image_t* img);
int maix_kpu_detector_add_sample_img(void* obj, image_t* img);
int maix_kpu_detector_del(void** obj);
int maix_kpu_detector_train(void* obj);
int maix_kpu_detector_predict(void* obj, image_t* img, float* min_distance, int* p_x, int* p_y, int* p_w, int* p_h);
int maix_kpu_detector_rm_class_img(void* obj);
int maix_kpu_detector_rm_sample_img(void* obj);
int maix_kpu_detector_save(void* obj, const char* path);
int maix_kpu_detector_load(void** obj, const char* path, kpu_model_info_t* kmodel, int* class_num, int* sample_num);
#ifdef __cplusplus
}
#endif
#endif