Files

138 lines
4.9 KiB
C

#ifndef __YOLOV5__
#define __YOLOV5__
#include <stdio.h>
#include <string.h>
#include "xmedia_svp_std.h"
#include "xmedia_svp.h"
#include "svp_nms.h"
#include "xmedia_svp_quantize.h"
#include "svp_core.h"
#include "svp_movement.h"
#include "svp_bytetracker.h"
#ifdef __cplusplus
extern "C" {
#endif
// sigmoid 查表法
#define TABLE_SIZE 100000
#define TABLE_MIN (-100.0f)
#define TABLE_MAX (100.0f)
#define TABLE_200 (200.0f)
#define UNSIGNED_8_BIT_NUM 256
#define TABLE_500 (500.0f)
// 每个特征中的x、y、w、h、socre长度
#define XYWHF_LEN 5
#define XYWH_LEN 4
#define LAYER_MAX_NUM 10
#define LAYER_MIN_NUM 3
#define LAYER_NUM_FOUR 4
// 每层feature_map对应的anchor
#define ANCHOR_NUM 3
/** 模型输入默认分辨率 */
#define INPUT_DEFAULT_WIDE 640
#define INPUT_DEFAULT_HIGH 360
/** 默认检测阈值 */
#define DEFAULT_DETECT_THRESHOLD 0.45f
/** 默认IOU阈值 */
#define DEFAULT_IOU_THRESHOLD 0.5f
/** 分类器默认阈值*/
#define DEFAULT_CLASSIFIER_THRESHOLD 0.01f
#define DEFAULT_BBOX_NUM 512
/** 模型检测类型数量 */
#define DETECTION_MODEL_SINGLE 1
#define DETECTION_MODEL_DOUBLE 2
#define DETECTION_MODEL_TRIPLE 3
#define DETECTION_MODEL_MULTI 4
#define DETECTION_MODEL_SIX 6
#define DETECTION_MODEL_PCNMV_FIRESMOKE 11
#define DETECTION_MODEL_MAX 80
// 稳定框算法系数
#define SVP_IOU_STABLE_THRESH_UPPER 0.85f
#define SVP_IOU_STABLE_THRESH_MIDDLE 0.7f
#define SVP_STABLE_HORIZONTAL_FACTOR 6
#define SVP_STABLE_VERTICAL_FACTOR 5
#define SVP_UNIFORM_FACTOR_A 2
#define SVP_UNIFORM_FACTOR_B 3
#define SVP_STABLE_HISTORY_RATIO 0.8f
#define SVP_STABLE_CURRENT_RATIO 0.2f
// 目标框面积大小限制
#define MAX_AREA_ATTR 4
#define MINI_AREA 100
typedef struct {
xmedia_svp_rect rect;
xmedia_svp_class_type class_type;
} svp_stable_rect;
typedef struct {
svp_stable_rect stable_targets[XMEDIA_SVP_MAX_TARGET_NUM];
xmedia_u32 num;
} svp_stable_box;
typedef struct {
xmedia_svp_point anchors[LAYER_MAX_NUM][ANCHOR_NUM]; // 锚点值
xmedia_u8 layer_num; // 锚点层数
} xmedia_svp_detect_anchors;
typedef struct {
xmedia_u32 w; // 模型支持的图像宽度
xmedia_u32 h; // 模型支持的图像高度
xmedia_u32 num; // 模型的检测类别数量
xmedia_u32 feature[LAYER_MAX_NUM]; // 每个feature_map的大小
xmedia_u32 output_num; // npu输出所有的特征数量
xmedia_float thres_desig; // 检测阈值的反sigmoid值
quanlize_param quanlize[LAYER_MAX_NUM]; // 反量化需要的参数
xmedia_npu_model model; // npu参数
xmedia_svp_alg_type type; // 算法类型
xmedia_float detect_threshold; // 置信度阈值,建议值0.55f
xmedia_float classifier_threshold; // 分类器阈值,建议值0.01f
xmedia_float iou_threshold; // iou相交比阈值,建议值0.5f
xmedia_u32 max_target_num; // 最大目标数,最大值10
xmedia_bool smart_venc_enable;
xmedia_bool smart_ae_enable;
xmedia_bool smart_venc_array[XMEDIA_SVP_MAX_VENC_CHN_NUM];
xmedia_bool smart_ae_array[XMEDIA_SVP_MAX_VI_PIPE_NUM];
svp_stable_box record_result; // 记录历史框,用于稳定算法
xmedia_svp_detect_anchors anchors; // 锚点值
xmedia_u64 cost_time; // process接口耗时
xmedia_bool aov_flag; // 是否为aov模型
xmedia_bool aov_only_target; // 是否仅判断有无目标
svp_movement movement; // 静止过滤相关参数
svp_tracklet tracklet;
xmedia_u8 track_id_arry[SVP_ALG_MAX_TARGET_NUM * SVP_MAX_LOST_COUNT]; // 追踪id数组
xmedia_s32 track_id_grow; // 追踪id增加
xmedia_void *private_data; // 实例私有数据
xmedia_float *sigmoid_table; // sigmoid查表
xmedia_float *sigmoid_dequantize_table;
xmedia_float *sigmoid_dequantize_table_x2;
xmedia_float *sigmoid_dequantize_table_x6;
xmedia_float *sigmoid_dequantize_table_x2_sq;
svp_base_result *bbox;
} yolov5_detect_param;
xmedia_void set_default_yolov5_detect_param(yolov5_detect_param *param);
xmedia_s32 detect_process(yolov5_detect_param *param, const xmedia_video_frame_info *input_image,
xmedia_svp_yolov5_output *result, const xmedia_svp_detect_anchors anchors_yaml);
xmedia_s32 detect_init(yolov5_detect_param *param, const xmedia_svp_alg_type type,
const xmedia_svp_modules *model, xmedia_s32 layer_num);
xmedia_s32 detect_deinit(yolov5_detect_param *param);
xmedia_s32 svp_get_detect_result_yolov5_bz(yolov5_detect_param *param, xmedia_svp_yolov5_output *result,
const xmedia_svp_detect_anchors anchors_yaml);
#ifdef __cplusplus
}
#endif
#endif