1. TDL_SDK 简介

TDL_SDK(Turnkey Deep Learning SDK) 是一个基于算能芯片产品的开箱即用深度学习算法SDK, 致力于为用户提供跨平台(端、边)、简单易用、资源节约、性能高效的算法库及应用。 它基于模块化设计,同类型功能模块抽象出基类,遵循高内聚低耦合,仅对外暴露基类,不暴露具体实现;同时具有可扩展性和可维护性。

1.1. TDL_SDK总体结构

tdl_sdk/
  ├── CMakeLists.txt # 根 CMake 构建脚本
  ├── build_tdl_sdk.sh # SDK 构建脚本
  ├── clang-format.sh # 代码格式化脚本
  ├── clang-tidy.sh # 代码静态分析脚本
  ├── .clang-format # Clang 格式化配置
  ├── .clang-tidy # Clang 静态分析配置
  ├── cmake/ # CMake 相关模块
  │   ├── opencv.cmake # OpenCV 依赖查找
  │   ├── middleware.cmake # 多媒体件依赖查找
  │   ├── mlir.cmake # MLIR 依赖查找
  │   └── thirdparty.cmake # 第三方库依赖查找
  ├── configs/ # 模型参数配置文件
  ├── docs/ # 文档目录
  │   ├── README.md # 文档说明
  │   ├── LICENSE # 许可证文件
  │   ├── getting_started/ # 入门指南
  │   ├── developer_guide/ # 开发者文档
  │   ├── api_reference/ # API 参考手册
  │   └── images/ # 文档图片资源
  ├── include/ # 对外导出的头文件
  │   ├── framework/ # 框架层 API
  │   ├── components/ # 组件 API
  │   ├── nn/ # 神经网络模型 API
  │   ├── app/ # app类 API
  │   ├── pipeline/ # pipeline类 API
  │   └── c_apis/ # C 语言 API
  ├── src/ # 内部实现
  │   ├── framework/ # 框架层实现
  │   │   ├── common/ # 公共工具实现
  │   │   ├── image/ # 图像处理实现
  │   │   ├── memory/ # 内存管理实现
  │   │   ├── model/ # 模型实现
  │   │   ├── net/ # 神经网络实现
  │   │   ├── preprocess/ # 预处理实现
  │   │   ├── tensor/ # 张量处理实现
  │   │   └── utils/ # 通用工具实现
  │   ├── components/ # 组件实现
  │   │   ├── cv/ # 视觉相关的检测类实现
  │   │   ├── encoder/ # 编码相关功能实现
  │   │   ├── ive/ # ive图像处理功能实现
  │   │   ├── llm/ # 大模型类实现
  │   │   ├── matcher/ # 特征匹配功能的实现
  │   │   ├── network/ # 网络组件的实现
  │   │   ├── nn/ # 神经网络模型实现
  │   │   ├── tracker/ # 目标跟踪实现
  │   │   ├── snapshot/ # 抓拍实现
  │   │   └── video_decoder/ # 相机和解码实现
  │   ├── c_apis/ # C API 封装
  │   └── python/ # Python 绑定
  ├── sample/ # 示例代码
  │   ├── cpp/ # C++ 示例
  │   ├── c/ # C 示例
  │   └── python/ # Python 示例
  ├── evaluation/ # 性能评估
  ├── tool/ # 工具集
  ├── toolchain/ # 工具链
  ├── scripts/ # 脚本
  └── README.md # 项目说明

1.2. framework 模块

为实现跨平台模型推理的统一框架,基于此框架部署的模型,可以在多种硬件平台运行。该框架包括的模块如下:

  1. common

  • 公共定义和工具,包括错误码、日志、配置等

  • 提供跨模块使用的通用功能

  1. image

  • 图像类的抽象封装,支持多种图像格式和数据类型

  • 提供图像读取、转换、处理等基础功能

  • 支持 OpenCV、VPSS 等多种后端实现

  1. memory

  • 内存池类的抽象封装,用于高效内存管理

  • 支持多种内存类型(系统内存、设备内存等)

  • 提供内存分配、释放和复用机制

  1. model

  • 模型类的抽象封装,用于加载和运行神经网络模型

  • 支持多种模型格式(ONNX、TensorFlow、PyTorch等)

  • 提供模型推理和优化功能

  1. net

  • 神经网络类接口的封装,用于推理结果

  1. preprocess

  • 预处理类的抽象封装,用于图像预处理

  • 支持多种预处理操作(缩放、裁剪、归一化等)

  • 提供 OpenCV、VPSS 等多种后端实现

  1. tensor

  • 张量类的抽象封装,用于表示神经网络模型的输入输出

  • 支持多种数据类型和内存布局

  • 提供张量操作和转换功能

  1. utils

  • 工具类接口的封装,包括有定时计数,图像对齐和计算等工具

1.3. components 组件

具体算法相关的组件,包括:

  1. cv

  • 视觉相关的检测类实现

  • 已支持入侵检测,运动检测和遮挡检测

  1. encoder

  • 编码类接口的实现

  • 支持rtsp出流,实时查看算法效果

  1. ive

  • ive图像处理功能实现

  • 使用tpu进行计算

  1. llm

  • 大模型实现

  • 支持qwen和qwen2-VL

  1. matcher

  • 特征匹配功能的实现

  • 支持使用cpu或tpu进行计算

  1. network

  • 网络功能的实现

  1. nn

  • 各种神经网络模型实现,如目标检测、人脸检测、车牌识别等

  • 提供模型加载、推理和结果解析功能

  1. snapshot

  • 抓拍功能的实现

  1. track

  • 目标跟踪算法实现

  • 支持多种跟踪算法(KCF、SORT、DeepSORT等)

  1. video_decoder

  • 相机和解码功能实现

  • 支持多种相机接口和解码格式

1.4. 其他

  1. c_apis:C 语言 API 封装,提供跨语言调用支持

  • 提供与 C++ API 功能对应的 C 接口

  • 支持 C 语言应用程序集成

  • 提供内存管理和错误处理机制

  1. sample:示例代码,展示 SDK 的使用方法

  • C++ 语言示例,展示框架层和组件层的使用方法

  • C 语言示例,展示 C API 的使用方法

  • Python 语言示例,展示 Python 绑定的使用方法

  1. evaluation:性能评估,用于评估 SDK 的性能

  • 提供性能测试和基准测试功能

  • 支持多种性能指标(吞吐量、延迟、内存使用等)

  • 提供性能分析和优化建议

  1. tool:工具集,提供开发和调试支持

  • 模型转换工具

  • 性能分析工具

  • 调试和日志工具

  1. toolchain:工具链,提供编译和构建支持

  • 交叉编译工具链

  • 依赖库和头文件

  • 构建脚本和配置

  1. scripts:脚本,提供自动化支持

  • 构建脚本

  • 测试脚本

  • 部署脚本

2. TDL_SDK 环境搭建

2.1. 代码拉取及整体编译

TDL_SDK 除了cmodel模式外,都需要依赖sophpi sdk才能正常运行,sophpi sdk的获取方式和编译方式在如下网址中:

https://github.com/sophgo/sophpi

请先按照网址中的教程拉取代码,TDL_SDK也将随着sophpi sdk被下载下来。在进行编译之前,需执行export TPU_REL=1, 这样才能编译到TDL_SDK以及其他相关库,具体的编译流程如下:

export TPU_REL=1
source build/envsetup_soc.sh
defconfig sg2002_wevb_riscv64_sd //这里需要选择对应的板端型号
clean_all
build_all //编译所有组件,包括TDL_SDK

第一次编译时,一定要完整执行如上的步骤。

2.2. TDL_SDK编译方式

进行完上述步骤后,就可以仅编译TDL_SDK,提供了两种编译方式

1.使用makefile定义的伪目标编译

build_tdl_sdk

如果编译失败先使用clean_tdl_sdk将旧的编译产物清除掉再重新编译。

2.使用build_tdl_sdk.sh脚本进行编译

cd tdl_sdk
./build_tdl_sdk.sh all

如果编译失败先使用./build_tdl_sdk.sh clean将旧的编译产物清除掉再重新编译。

build_tdl_sdk.sh提供了一些编译配置供选择,具体如下:

./build_tdl_sdk.sh sample  //仅编译sample,在仅改动sample文件夹下内容时使用,节省编译时间
./build_tdl_sdk.sh static  //编译的sample为静态文件,注意static这个参数仅影响sample,TDL_SDK依旧会编译出静态库和动态库
./build_tdl_sdk.sh debug   //编译时引入debug信息,仅调试时使用

2.3. cmodel模式

TDL_SDK支持cmodel模式,可以支持在PC端模拟芯片的运算逻辑,使得sample能够直接在PC端模拟芯片端运行测试。cmodel使用方式如下:

1.下载第三方依赖库

cd tdl_sdk
./scripts/download_thirdparty.sh

2.获取编译依赖

./scripts/extract_cvitek_tpu_sdk.sh

3.编译TDL_SDK

./build_tdl_sdk.sh CMODEL_CVITEK

如果编译失败先使用./build_tdl_sdk.sh clean将旧的编译产物清除掉再重新编译。

3. TDL_SDK 模型列表

3.1. 检测类模型列表

模型名称

注释

TDL_MODEL_MBV2_DET_PERSON

人体检测模型(0:person)

TDL_MODEL_YOLOV8N_DET_HAND

手部检测模型(0:hand)

TDL_MODEL_YOLOV8N_DET_PET _PERSON

宠物与人检测模型 (0:猫, 1:狗, 2:人)

TDL_MODEL_YOLOV8N_DET_PERSON _VEHICLE

人与车辆检测模型 (0:车, 1:公交, 2:卡车, 3:骑摩托车者, 4:人, 5:自行车, 6:摩托车)

TDL_MODEL_YOLOV8N_DET_HAND _FACE_PERSON

手、脸与人检测模型 (0:手, 1:脸, 2:人)

TDL_MODEL_YOLOV8N_DET_HEAD _PERSON

人头检测模型 (0:人, 1:头)

TDL_MODEL_YOLOV8N_DET_HEAD _HARDHAT

头部与安全帽检测模型 (0:头, 1:安全帽)

TDL_MODEL_YOLOV8N_DET_FIRE _SMOKE

火与烟检测模型 (0:火, 1:烟)

TDL_MODEL_YOLOV8N_DET_FIRE

火检测模型 (0:火)

TDL_MODEL_YOLOV8N_DET_HEAD _SHOULDER

头肩检测模型 (0:头肩)

TDL_MODEL_YOLOV8N_DET_LICENSE _PLATE

车牌检测模型 (0:车牌)

TDL_MODEL_YOLOV8N_DET_TRAFFIC _LIGHT

交通信号灯检测模型 (0:红, 1:黄, 2:绿, 3:关闭, 4:等待)

TDL_MODEL_YOLOV8N_DET_MONITOR _PERSON

人体检测模型(0:person)

TDL_MODEL_YOLOV5_DET_COCO80

YOLOV5 COCO80检测模型

TDL_MODEL_YOLOV6_DET_COCO80

YOLOV6 COCO80检测模型

TDL_MODEL_YOLOV7_DET_COCO80

YOLOV7 COCO80检测模型

TDL_MODEL_YOLOV8_DET_COCO80

YOLOV8 COCO80检测模型

TDL_MODEL_YOLOV10_DET_COCO80

YOLOV10 COCO80检测模型

TDL_MODEL_PPYOLOE_DET_COCO80

PPYOLOE COCO80检测模型

TDL_MODEL_YOLOX_DET_COCO80

YOLOX COCO80检测模型

3.2. 人脸识别类模型列表

模型名称

注释

TDL_MODEL_SCRFD_DET_FACE

SCRFD 人脸检测模型 (0:人脸 + 关键点)

TDL_MODEL_RETINA_DET_FACE

RETINA 人脸检测模型

TDL_MODEL_RETINA_DET_FACE_IR

RETINA 红外人脸检测模型

3.3. 人脸属性和特征点类模型列表

模型名称

注释

TDL_MODEL_KEYPOINT_FACE_V2

5个关键点 + 模糊评分的人脸检测模型

TDL_MODEL_CLS_ATTRIBUTE_GENDER _AGE_GLASS

人脸属性分类模型 (年龄, 性别, 眼镜)

TDL_MODEL_CLS_ATTRIBUTE_GENDER _AGE_GLASS_MASK

人脸属性分类模型 (年龄, 性别, 眼镜, 口罩)

TDL_MODEL_CLS_ATTRIBUTE_GENDER _AGE_GLASS_EMOTION

人脸属性分类模型 (年龄, 性别, 眼镜, 情绪)

3.4. 图像分类模型列表

模型名称

注释

TDL_MODEL_CLS_MASK

口罩检测模型 (0:戴口罩, 1:不戴口罩)

TDL_MODEL_CLS_RGBLIVENESS

活体检测模型 (0:活体, 1:伪造)

TDL_MODEL_CLS_ISP_SCENE

ISP场景分类模型(“0:雪, 1:雾, 2:逆光, 3:草, 4:普通场景”)

TDL_MODEL_CLS_HAND_GESTURE

手势分类模型 (0:拳头, 1:五指, 2:无, 3:二)

TDL_MODEL_CLS_KEYPOINT_HAND _GESTURE

手势关键点分类模型 (0:拳头, 1:五指, 2:四指, 3:无, 4:好, 5:一, 6:三, 7:三2, 8:二)

3.5. 声音分类模型列表

模型名称

注释

TDL_MODEL_CLS_SOUND_BABAY_CRY

婴儿哭声分类模型 (0:背景, 1:哭声)

TDL_MODEL_CLS_SOUND_COMMAND _NIHAOSHIYUN

命令声音分类模型 (0:背景, 1:nihaoshiyun)

TDL_MODEL_CLS_SOUND_COMMAND _NIHAOSUANNENG

命令声音分类模型 (0:背景, 1:nihaosuanneng)

TDL_MODEL_CLS_SOUND_COMMAND _XIAOAIXIAOAI

命令声音分类模型 (0:背景, 1:xiaoaixiaoai)

TDL_MODEL_CLS_SOUND_COMMAND

命令声音分类模型 (0:背景, 1:命令1, 2:命令2)

3.6. 关键点识别类模型列表

模型名称

注释

TDL_MODEL_KEYPOINT_LICENSE PLATE

车牌关键点检测模型

TDL_MODEL_KEYPOINT_HAND

手部关键点检测模型

TDL_MODEL_KEYPOINT _YOLOV8POSE_PERSON17

人体17个关键点检测模型

TDL_MODEL_KEYPOINT_SIMCC _PERSON17

SIMCC 17个关键点检测模型

3.7. 线识别类模型列表

模型名称

注释

TDL_MODEL_LSTR_DET_LANE

车道检测模型

3.8. 车牌识别类模型列表

模型名称

注释

TDL_MODEL_RECOGNITION_LICENSE _PLATE

车牌识别模型

3.9. 分割类模型列表

TDL_MODEL_YOLOV8_SEG_COCO80

YOLOV8 COCO80分割模型

TDL_MODEL_SEG_PERSON_FACE_VEHICLE

人、脸与车辆分割模型 (0:背景, 1:人, 2:脸, 3:车辆, 4:车牌)

TDL_MODEL_SEG_MOTION

动作分割模型 (0:静态, 2:过渡, 3:运动)

3.10. 特征值提取类模型列表

TDL_MODEL_FEATURE_IMG

图像特征提取模型

TDL_MODEL_IMG_FEATURE_CLIP

CLIP图像嵌入模型

TDL_MODEL_TEXT_FEATURE_CLIP

CLIP文本嵌入模型

TDL_MODEL_FEATURE_CVIFACE

Cviface 256维特征提取模型

TDL_MODEL_FEATURE_BMFACE_R34

ResNet34 512维特征提取模型

TDL_MODEL_FEATURE_BMFACE_R50

ResNet50 512维特征提取模型

4. TDL_SDK 结构体参考

4.1. TDLDataTypeE

【说明】

数据类型枚举类

【定义】

typedef enum {
  TDL_TYPE_INT8 = 0, /**< Equals to int8_t. */
  TDL_TYPE_UINT8,    /**< Equals to uint8_t. */
  TDL_TYPE_INT16,    /**< Equals to int16_t. */
  TDL_TYPE_UINT16,   /**< Equals to uint16_t. */
  TDL_TYPE_INT32,    /**< Equals to int32_t. */
  TDL_TYPE_UINT32,   /**< Equals to uint32_t. */
  TDL_TYPE_BF16,     /**< Equals to bf17. */
  TDL_TYPE_FP16,     /**< Equals to fp16. */
  TDL_TYPE_FP32,     /**< Equals to fp32. */
  TDL_TYPE_UNKOWN    /**< Equals to unkown. */
} TDLDataTypeE;

【成员】

数据类型枚举类

注释

TDL_TYPE_INT8

有符号8位整数

TDL_TYPE_UINT8

无符号8位整数

TDL_TYPE_INT16

有符号16位整数

TDL_TYPE_UINT16

无符号16位整数

TDL_TYPE_INT32

有符号32位整数

TDL_TYPE_UINT32

无符号32位整数

TDL_TYPE_BF16

16位浮点数 (1 位符号, 8 位指数和 7 位尾数)

TDL_TYPE_FP16

16位浮点数 (1 位符号, 5 位指数和 10 位尾数)

FTDL_TYPE_FP32

32位浮点数

4.2. TDLBox

【说明】

box的坐标数据

【定义】

typedef struct {
  float x1;
  float y1;
  float x2;
  float y2;
} TDLBox;

【成员】

数据类型枚举类

注释

x1

box左上角x的坐标

y1

box左上角y的坐标

x2

box右下角x的坐标

y2

box右下角y的坐标

4.3. TDLFeature

【说明】

特征值数据

【定义】

typedef struct {
  int8_t *ptr;
  uint32_t size;
  TDLDataTypeE type;
} TDLFeature;

【成员】

数据类型枚举类

注释

ptr

特征值数据

size

数据大小

type

数据类型

4.4. TDLPoints

【说明】

坐标队列数据

【定义】

typedef struct {
  float *x;
  float *y;
  uint32_t size;
  float score;
} TDLPoints;

【成员】

数据类型枚举类

注释

x

坐标队列的x数据

y

坐标队列的y数据

size

坐标队列的大小

score

分数

4.5. TDLLandmarkInfo

【说明】

特征点信息

【定义】

typedef struct {
  float x;
  float y;
  float score;
} TDLLandmarkInfo;

【成员】

数据类型枚举类

注释

x

特征点的x坐标

y

特征点的y坐标

score

分数

4.6. TDLObjectInfo

【说明】

目标检测信息

【定义】

typedef struct {
  char name[128];
  TDLBox box;
  float score;
  int class_id;
  uint32_t landmark_size;
  TDLLandmarkInfo *landmark_properity;
  TDLObjectTypeE obj_type;
} TDLObjectInfo;

【成员】

数据类型枚举类

注释

name

目标检测的命名

box

目标检测的框图信息

score

目标检测的分数

class_id

目标检测的类别id

landmark_size

目标检测的特征点大小

TDLLandmarkInfo

目标检测的特征点信息

obj_type

目标检测的类型

4.7. TDLObject

【说明】

目标检测数据

【定义】

typedef struct {
  uint32_t size;
  uint32_t width;
  uint32_t height;

  TDLObjectInfo *info;
} TDLObject;

【成员】

数据类型枚举类

注释

size

目标检测的个数

width

目标检测图像的宽度

height

目标检测图像的高度

info

目标检测信息

4.8. TDLFaceInfo

【说明】

人脸信息

【定义】

typedef struct {
  char name[128];
  float score;
  uint64_t track_id;
  TDLBox box;
  TDLPoints landmarks;
  TDLFeature feature;

  float gender_score;
  float glass_score;
  float age;
  float liveness_score;
  float hardhat_score;
  float mask_score;

  float recog_score;
  float face_quality;
  float pose_score;
  float blurness;
} TDLFaceInfo;

【成员】

数据类型枚举类

注释

name

人脸的姓名

score

人脸的分数

track_id

人脸的追踪id

box

人脸的box信息

landmarks

人脸的特征点

feature

人脸的特征值

gender_score

人脸的性别分数

glass_score

人脸是否带眼镜

age

人脸的年龄

liveness_score

人脸的活体分数

hardhat_score

人脸的是否带安全帽分数

recog_score

人脸的识别罩分数

face_quality

人脸的质量分数

pose_score

人脸的姿态分数

blurness

人脸的模糊度

4.9. TDLFace

【说明】

人脸数据

【定义】

typedef struct {
  uint32_t size;
  uint32_t width;
  uint32_t height;
  TDLFaceInfo *info;
} TDLFace;

【成员】

数据类型枚举类

注释

size

人脸的个数

width

人脸图像的宽度

height

人脸图像的高度

info

人脸信息

4.10. TDLClassInfo

【说明】

分类信息

【定义】

typedef struct {
  int32_t class_id;
  float score;
} TDLClassInfo;

【成员】

数据类型枚举类

注释

class_id

分类的类别

score

分类的分数

4.11. TDLClass

【说明】

分类数据

【定义】

typedef struct {
  uint32_t size;
  TDLClassInfo *info;
} TDLClass;

【成员】

数据类型枚举类

注释

size

分类的个数

info

分类信息

4.12. TDLKeypointInfo

【说明】

关键点信息

【定义】

typedef struct {
  float x;
  float y;
  float score;
} TDLKeypointInfo;

【成员】

数据类型枚举类

注释

x

关键点的x坐标

y

关键点的y坐标

score

关键点的分数

4.13. TDLKeypoint

【说明】

关键点数据

【定义】

typedef struct {
  uint32_t size;
  uint32_t width;
  uint32_t height;
  TDLKeypointInfo *info;
} TDLKeypoint;

【成员】

数据类型枚举类

注释

size

关键点的个数

width

图像的宽度

height

图像的高度

info

关键点信息

4.14. TDLSegmentation

【说明】

语义分割数据

【定义】

typedef struct {
  uint32_t width;
  uint32_t height;
  uint32_t output_width;
  uint32_t output_height;
  uint8_t *class_id;
  uint8_t *class_conf;
} TDLSegmentation;

【成员】

数据类型枚举类

注释

width

图像的宽度

height

图像的高度

output_width

输出图像的宽度

output_height

输出图像的高度

class_id

分类的类别

class_conf

分类的坐标信息

4.15. TDLInstanceSegInfo

【说明】

实例分割信息

【定义】

typedef struct {
  uint8_t *mask;
  float *mask_point;
  uint32_t mask_point_size;
  TDLObjectInfo *obj_info;
} TDLInstanceSegInfo;

【成员】

数据类型枚举类

注释

mask

实例分割的mask队列

mask_point

实例分割的mask_point队列

mask_point_size

实例分割的point个数

obj_info

实例分割的目标检测信息

4.16. TDLInstanceSeg

【说明】

实例分割数据

【定义】

typedef struct {
  uint32_t size;
  uint32_t width;
  uint32_t height;
  uint32_t mask_width;
  uint32_t mask_height;
  TDLInstanceSegInfo *info;
} TDLInstanceSeg;

【成员】

数据类型枚举类

注释

size

实例分割的个数

width

图像的宽度

height

图像的高度

mask_width

mask的宽度

mask_height

mask的高度

info

实例分割信息

4.17. TDLLanePoint

【说明】

线检测的坐标点

【定义】

typedef struct {
  float x[2];
  float y[2];
  float score;
} TDLLanePoint;

【成员】

数据类型枚举类

注释

x

x坐标队列

y

y坐标队列

score

线检测的分数

4.18. TDLLane

【说明】

线检测数据

【定义】

typedef struct {
  uint32_t size;
  uint32_t width;
  uint32_t height;
  TDLLanePoint *lane;
  int lane_state;
} TDLLane;

【成员】

数据类型枚举类

注释

size

线检测的个数

width

图像的宽度

height

图像的高度

lane

线检测坐标点

lane_state

线条状态

4.19. TDLDepthLogits

【说明】

深度估计数据,目前暂未实现对应 C 接口

【定义】

typedef struct {
  int w;
  int h;
  int8_t *int_logits;
} TDLDepthLogits;

【成员】

数据类型枚举类

注释

w

图像的宽度

h

图像的高度

int_logits

深度估计信息

4.20. TDLTracker

【说明】

追踪数据

【定义】

typedef struct {
  uint32_t size;
  uint64_t id;
  TDLBox bbox;
  int out_num;
} TDLTracker;

【成员】

数据类型枚举类

注释

size

追踪目标的个数

id

追踪目标的id

bbox

追踪目标的box

out_num

追踪目标的小时次数

4.21. TDLOcr

【说明】

文本识别数据

【定义】

typedef struct {
  uint32_t size;
  char* text_info;
} TDLOcr;

【成员】

数据类型枚举类

注释

size

文本识别的个数

text_info

文本识别的信息

4.22. TDLSnapshotInfo

【说明】

抓拍信息

【定义】

typedef struct {
  float quality;
  uint64_t snapshot_frame_id;
  uint64_t track_id;
  bool male;
  bool glass;
  uint8_t age;
  uint8_t emotion;
  TDLImage object_image;
} TDLSnapshotInfo;

【成员】

数据类型枚举类

注释

quality

抓拍的质量

snapshot_frame_id

帧id

track_id

追踪id

male

性别分数

glass

眼镜分数

age

年龄分数

emotion

情绪状态

object_image

抓拍的image对象

4.23. TDLCaptureInfo

【说明】

抓拍参数结构体

【定义】

typedef struct {
  uint32_t snapshot_size;
  uint64_t frame_id;
  uint32_t frame_width;
  uint32_t frame_height;
  TDLFace face_meta;
  TDLObject person_meta;
  TDLObject pet_meta;
  TDLTracker track_meta;
  TDLSnapshotInfo *snapshot_info;
  TDLFeature *features;
  TDLImage image;
} TDLCaptureInfo;

【成员】

数据类型枚举类

注释

snapshot_size

抓拍的个数

frame_id

帧id

frame_width

帧宽度

frame_height

帧长度

face_meta

人脸数据

person_meta

行人数据

pet_meta

宠物数据

track_meta

追踪数据

snapshot_info

抓拍信息

features

特征值信息

image

用于检测的原始图像

4.24. TDLObjectCountingInfo

【说明】

客流量统计信息

【定义】

typedef struct {
  uint64_t frame_id;
  uint32_t frame_width;
  uint32_t frame_height;
  uint32_t enter_num;
  uint32_t miss_num;
  int counting_line[4];
  TDLObject object_meta;
  TDLImage image;
} TDLObjectCountingInfo;

【成员】

数据类型枚举类

注释

frame_id

帧id

frame_width

帧宽度

frame_height

帧长度

enter_num

进入的数量

miss_num

出去的数量

counting_line

穿越线,通常位于关键通道口

object_meta

目标物体数据

image

用于检测的原始图像

4.25. TDLIspMeta

【说明】

isp数据

【定义】

typedef struct {
  float awb[3];  // rgain, ggain, bgain
  float ccm[9];  // rgb[3][3]
  float blc;
} TDLIspMeta;

【成员】

数据类型枚举类

注释

awb

白平衡信息

ccm

颜色信息

blc

黑电平信息

5. TDL_SDK API参考

5.1. 句柄

【语法】

typedef void *TDLHandle;
typedef void *TDLHandleEx;
typedef void *TDLImage;

【描述】

TDL_SDK句柄,TDLHandle是核心操作句柄,TDLHandleEx是扩展操作句柄,TDLImage是图像数据抽象句柄。

5.2. TDL_CreateHandle

【语法】

TDLHandle TDL_CreateHandle(const int32_t tpu_device_id);

【描述】

创建一个 TDLHandle 对象,用于 tdl api 的管理,在使用核心库(libtdl_core.a或libtdl_core.so)中的api时使用。

【参数】

数据型态

参数名称

说明

输入

const int32_t

tpu_device_id

指定 TPU 设备的 ID,默认设备ID为0,目前暂未开放其他ID的使用

5.3. TDL_CreateHandleEx

【语法】

TDLHandleEx TDL_CreateHandleEx(const int32_t tpu_device_id);

【描述】

创建一个 TDLHandleEx 对象,用于 tdl 拓展 api 的管理,在使用拓展库(libtdl_ex.a或libtdl_ex.so)中的api时使用。

【参数】

数据型态

参数名称

说明

输入

const int32_t

tpu_device_id

指定 TPU 设备的 ID,默认设备ID为0,目前暂未开放其他ID的使用

5.4. TDL_DestroyHandle

【语法】

int32_t TDL_DestroyHandle(TDLHandle handle);

【描述】

销毁一个 TDLHandle 对象,在使用核心库(libtdl_core.a或libtdl_core.so)中的api时使用。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

需要销毁的 TDLHandle 对象

5.5. TDL_DestroyHandleEx

【语法】

int32_t TDL_DestroyHandleEx(TDLHandleEx handle);

【描述】

销毁一个 TDLHandleEx 对象,在使用拓展库(libtdl_ex.a或libtdl_ex.so)中的api时使用。

【参数】

数据型态

参数名称

说明

输入

TDLHandleEx

handle

需要销毁的 TDLHandleEx 对象

5.6. TDL_WrapVPSSFrame

【语法】

TDLImage TDL_WrapVPSSFrame(void *vpss_frame, bool own_memory);

【描述】

包装一个 VPSS 帧为 TDLImage 对象,这里的frame可以是通过多媒体接口获得的frame (例如CVI_VPSS_GetChnFrame);也可以是自己封装的一个frame,示例如下

VIDEO_FRAME_INFO_S Frame;
memset(&Frame, 0, sizeof(VIDEO_FRAME_INFO_S));
Frame.stVFrame.pu8VirAddr[0] = buffer;   // 数据的虚拟地址
Frame.stVFrame.u32Height = 1;            // 数据的高度,示例为一维数据,所以这里为1
Frame.stVFrame.u32Width = u32BufferSize; // 数据的宽度,示例为一维数据,这里就是数据量

TDLImage image = TDL_WrapVPSSFrame((void *)&Frame, false); // 调用接口创建图像

【参数】

数据型态

参数名称

说明

输入

void*

vpss_frame

需要包装的 VPSS 帧

输入

bool

own_memory

是否拥有内存所有权,该功能暂未实现,默认为false

5.7. TDL_ReadImage

TDLImage TDL_ReadImage(const char *path);

【描述】

读取一张图片为 TDLImage 对象,支持jpg, png, bmp, jp2, sr和tiff等常见格式的输入。

【参数】

数据型态

参数名称

说明

输入

const char*

path

图片路径

5.8. TDL_ReadBin

【语法】

TDLImage TDL_ReadBin(const char *path, int count, TDLDataTypeE data_type);

【描述】

读取文件内容为 TDLImage 对象。

【参数】

数据型态

参数名称

说明

输入

const char*

path

bin文件路径

输入

int

count

文件中数据量

输入

TDLDataTypeE

data_type

输入数据类型

5.9. TDL_DestroyImage

【语法】

int32_t TDL_DestroyImage(TDLImage image_handle);

【描述】

销毁一个 TDLImage 对象,在结束对一个 TDLImage 对象的使用时,一定要调用此接口释放内存。

【参数】

数据型态

参数名称

说明

输入

TDLImage

image_handle

需要销毁的 TDLImage 对象

5.10. TDL_OpenModel

【语法】

int32_t TDL_OpenModel(TDLHandle handle,
                                    const TDLModel model_id,
                                    const char *model_path,
                                    const char *model_config_json);

【描述】

加载指定类型的模型到 TDLHandle 对象中,对于参数 model_config_json,若使用 TDL_LoadModelConfig 加载后可以传入NULL; 不使用TDL_LoadModelConfig加载,大部分专有模型也可以传入NULL,此时会使用算法类内部的默认配置, 部分通用模型如特征提取、声音指令等需要传入模型配置信息,可以参考configs/model/model_config.json。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

const char*

model_path

模型文件路径

输入

const char*

model_config_json

模型配置文件的路径,文件路径在tdl_sdk/install/CV184X/configs/model/中,如果模型不需要设定特别的参数,可以为NULL

5.11. TDL_OpenModelFromBuffer

【语法】

int32_t TDL_OpenModelFromBuffer(TDLHandle handle,
                                                  const TDLModel model_id,
                                                  const uint8_t *model_buffer,
                                                  uint32_t model_buffer_size,
                                                  const char *model_config_json);

【描述】

加载指定类型的模型到 TDLHandle 对象中,使用地址来传参。对于参数 model_config_json,若使用 TDL_LoadModelConfig 加载后可以传入NULL; 不使用TDL_LoadModelConfig加载,大部分专有模型也可以传入NULL,此时会使用算法类内部的默认配置, 部分通用模型如特征提取、声音指令等需要传入模型配置信息,可以参考configs/model/model_config.json。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

const uint8_t*

model_buffer

模型文件buffer

输入

uint32_t

model_buffer_size

模型文件buffer大小

输入

const char*

model_config_json

模型配置文件的路径,文件路径在tdl_sdk/install/CV184X/configs/model/中,如果模型不需要设定特别的参数,可以为NULL

5.12. TDL_CloseModel

【语法】

int32_t TDL_CloseModel(TDLHandle handle,
                                    const TDLModel model_id);

【描述】

卸载指定类型的模型并释放相关资源。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

5.13. TDL_Detection

【语法】

int32_t TDL_Detection(TDLHandle handle,
                                  const TDLModel model_id,
                                  TDLImage image_handle,
                                  TDLObject *object_meta);

【描述】

执行指定模型的推理检测,并返回检测结果元数据,详细实例可以参考tdl_sdk/sample/c/sample_object_detection.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLObject*

object_meta

输出检测结果元数据

5.14. TDL_FaceDetection

【语法】

int32_t TDL_FaceDetection(TDLHandle handle,
                                        const TDLModel model_id,
                                        TDLImage image_handle,
                                        TDLFace *face_meta);

【描述】

执行人脸检测并返回人脸检测结果元数据,详细实例可以参考tdl_sdk/sample/c/sample_face_detection.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLFace*

face_meta

输出人脸检测结果元数据

5.15. TDL_FaceAttribute

【语法】

int32_t TDL_FaceAttribute(TDLHandle handle,
                                        const TDLModel model_id,
                                        TDLImage image_handle,
                                        TDLFace *face_meta);

【描述】

执行人脸属性分析,需配合已检测到的人脸框进行特征分析,该模型的内部会对图像进行裁剪以提高精度, 因此在调用此接口前,最好先调用 TDL_FaceDetection 以获取人脸框图, 详细实例可以参考tdl_sdk/sample/c/sample_face_attribute.c, 如果 face_meta 中没有框图数据,则不进行裁剪操作。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输入/输出

TDLFace*

face_meta

输入人脸检测结果,输出补充属性信息

5.16. TDL_FaceLandmark

【语法】

int32_t TDL_FaceLandmark(TDLHandle handle,
                                        const TDLModel model_id,
                                        TDLImage image_handle,
                                        TDLImage *crop_image_handle,
                                        TDLFace *face_meta);

【描述】

执行人脸关键点检测,在已有的人脸检测结果上补充关键点坐标,该模型的内部会对图像进行裁剪以提高精度, 因此在调用此接口前,最好先调用 TDL_FaceDetection 以获取人脸框图,详细实例可以参考tdl_sdk/sample/c/sample_face_recognition.c, 如果 face_meta 中没有框图数据,则不进行裁剪操作。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLImage

crop_image_handle

TDLImage 对象, 裁剪后的图像,为NULL时不生效

输入/输出

TDLFace*

face_meta

输入人脸检测结果,输出补充关键点坐标

5.17. TDL_Classification

【语法】

int32_t TDL_Classification(TDLHandle handle,
                                        const TDLModel model_id,
                                        TDLImage image_handle,
                                        TDLClassInfo *class_info);

【描述】

执行通用分类识别,包含有活体识别,语音识别和手势识别等,具体可以参考tdl_sdk/sample/c/sample_classification.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLClassInfo*

class_info

输出分类结果

5.18. TDL_InstanceSegmentation

【语法】

int32_t TDL_InstanceSegmentation(TDLHandle handle,
                                                  const TDLModel model_id,
                                                  TDLImage image_handle,
                                                  TDLInstanceSeg *inst_seg_meta);

【描述】

执行实例分割(Instance Segmentation),检测图像中每个独立目标的像素级轮廓, 具体可以参考 tdl_sdk/sample/c/sample_instance_segmentation.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLInstanceSeg*

inst_seg_meta

输出实例分割结果(包含mask和bbox)

5.19. TDL_SemanticSegmentation

【语法】

int32_t TDL_SemanticSegmentation(TDLHandle handle,
                                                    const TDLModel model_id,
                                                    TDLImage image_handle,
                                                    TDLSegmentation *seg_meta);

【描述】

执行语义分割(Semantic Segmentation),对图像进行像素级分类, 具体可以参考 tdl_sdk/sample/c/sample_semantic_segmentation.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLSegmentation*

seg_meta

输出分割结果(类别标签图)

5.20. TDL_FeatureExtraction

【语法】

int32_t TDL_FeatureExtraction(TDLHandle handle,
                                             const TDLModel model_id,
                                             TDLImage image_handle,
                                             TDLFeature *feature_meta);

【描述】

提取图像的深度特征向量,为了提高检测精度,输入的image图像最好是经过裁剪或对齐等方式处理后的图像, 可以参考tdl_sdk/sample/c/sample_face_recognition.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLFeature*

feature_meta

输出特征向量

5.21. TDL_LaneDetection

【语法】

int32_t TDL_LaneDetection(TDLHandle handle,
                                        const TDLModel model_id,
                                        TDLImage image_handle,
                                        TDLLane *lane_meta);

【描述】

检测道路车道线及其属性,具体可以参考 tdl_sdk/sample/c/sample_lane_detection.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLLane*

lane_meta

输出车道线坐标及属性

5.22. TDL_Tracking

【语法】

int32_t TDL_Tracking(TDLHandle handle,
                                  const TDLModel model_id,
                                  TDLImage image_handle,
                                  TDLObject *object_meta,
                                  TDLTracker *tracker_meta);

【描述】

多目标跟踪,基于检测结果进行跨帧目标关联,具体可以参考 tdl_sdk/sample/c/sample_tracking.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输入/输出

TDLObject*

object_meta

输入检测结果,输出补充跟踪ID

输出

TDLTracker*

tracker_meta

输出跟踪器状态信息

5.23. TDL_SetSingleObjectTracking

【语法】

int32_t TDL_SetSingleObjectTracking(TDLHandle handle,
                                                      TDLImage image_handle,
                                                      TDLObject *object_meta,
                                                      int *set_values,
                                                      int size);

【描述】

单目追踪设置追踪目标,根据场景要和 TDL_Detection 配合使用,具体可以参考 tdl_sdk/sample/c/camera/sample_vi_single_object_tracking.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

TDLImage

image_handle

TDLImage 对象

输入

TDLObject*

object_meta

当前帧检测结果

输入/输出

int*

set_values

追踪目标。支持以下3种形式:1. 传入目标框坐标(x1, y1, x2, y2);2. 传入图像中某个点的位置(x, y),(此时object_meta size不能为0);3. 传入object_meta中某个目标的索引,(此时object_meta size不能为0)

输入

int

size

set_values 元素个数(只能为1或2或4)

5.24. TDL_SingleObjectTracking

【语法】

int32_t TDL_SingleObjectTracking(TDLHandle handle,
                                                  TDLImage image_handle,
                                                  TDLTracker *track_meta,
                                                  uint64_t frame_id);

【描述】

执行单目追踪,具体可以参考 tdl_sdk/sample/c/camera/sample_vi_single_object_tracking.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

TDLImage

image_handle

TDLImage 对象

输入

TDLTracker*

track_meta

追踪结果

输入

uint64_t

frame_id

帧id

5.25. TDL_CharacterRecognition

【语法】

int32_t TDL_CharacterRecognition(TDLHandle handle,
                                                  const TDLModel model_id,
                                                  TDLImage image_handle,
                                                  TDLOcr *char_meta);

【描述】

字符识别,支持文本检测与识别,为了提高检测精度,输入的image图像最好是经过裁剪或对齐等方式处理后的图像, 可以参考 tdl_sdk/sample/c/sample_licence_recognition.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

模型类型枚举

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLOcr*

char_meta

输出识别结果(文本内容和位置)

5.26. TDL_LoadModelConfig

【语法】

int32_t TDL_LoadModelConfig(TDLHandle handle,
                                            const char *model_config_json_path);

【描述】

加载模型配置信息,加载后可以仅通过模型id去打开模型。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

model_config_json_path

模型配置文件路径,如果为NULL,默认使用configs/model/model_config.json

5.27. TDL_SetModelDir

【语法】

int32_t TDL_SetModelDir(TDLHandle handle,
                                      const char *model_dir);

【描述】

设置模型文件夹路径,该文件夹下的子文件夹必须要以cv181x等平台名称命名,在子文件夹中放置模型文件。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

model_dir

为tdl_models仓库路径(下面各平台的子文件夹)

5.28. TDL_SetModelThreshold

【语法】

int32_t TDL_SetModelThreshold(TDLHandle handle,
                                              const TDLModel model_id,
                                              float threshold);

【描述】

设置模型的阈值,设置范围为(0,1)。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

要设置的模型类型枚举值

输入

float

threshold

模型的阈值

5.29. TDL_IspClassification

【语法】

int32_t TDL_IspClassification(TDLHandle handle,
                                          const TDLModel model_id,
                                          TDLImage image_handle,
                                          TDLIspMeta *isp_meta,
                                          TDLClass *class_info);

【描述】

执行ISP图像分类任务。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

指定目标分类模型类型枚举值

输入

TDLImage

image_handle

TDLImage 对象

输入

TDLIspMeta*

isp_meta

输入参数,包含isp相关的数据

输出

TDLClass*

class_info

输出参数,存储目标分类结果

5.30. TDL_Keypoint

【语法】

int32_t TDL_Keypoint(TDLHandle handle,
                                  const TDLModel model_id,
                                  TDLImage image_handle,
                                  TDLKeypoint *keypoint_meta);

【描述】

执行关键点检测任务,为了提高检测精度,输入的image图像最好是经过裁剪处理后的图像, 具体例子可以参考tdl_sdk/sample/c/sample_keypoints.c

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

指定关键点检测模型类型枚举值

输入

TDLImage

image_handle

TDLImage 对象

输出

TDLKeypoint*

keypoint_meta

输出参数,存储检测到的关键点坐标及置信度

5.31. TDL_DetectionKeypoint

【语法】

int32_t TDL_DetectionKeypoint(TDLHandle handle,
                                              const TDLModel model_id,
                                              TDLImage image_handle,
                                              TDLObject *object_meta,
                                              TDLImage *crop_image_handle);

【描述】

执行关键点检测任务(根据目标的坐标进行裁剪后再执行关键点检测),如果 object_meta 中包含框图信息, 则 api 内部会对image图像进行裁剪;因此为了提高图像精度,在使用该 api 前最好先调用 TDL_Detection 以获得目标框图信息。具体可以参考 tdl_sdk/sample/c/sample_detect_keypoints.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const TDLModel

model_id

指定关键点检测模型类型枚举值

输入

TDLImage

image_handle

TDLImage 对象

输入/输出

TDLObject*

object_meta

输出参数,存储检测到的关键点坐标及置信度

输出

TDLImage*

crop_image_handle

保存裁剪后的图像,以便后续操作,如果传入 NULL 则不保存

5.32. TDL_IntrusionDetection

【语法】

int32_t TDL_IntrusionDetection(TDLHandle handle,
                                              TDLPoints *regions,
                                              TDLBox *box,
                                              bool *is_intrusion);

【描述】

执行入侵检测,具体可以参考 tdl_sdk/sample/c/sample_intrusion_detection.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

TDLPoints*

regions

背景区域点集数组

输入

TDLBox*

box

检测区域bbox

输出

bool*

is_intrusion

输出参数,存储入侵检测结果

5.33. TDL_MotionDetection

【语法】

int32_t TDL_MotionDetection(TDLHandle handle,
                                           TDLImage background,
                                           TDLImage detect_image,
                                           TDLObject *roi,
                                           uint8_t threshold,
                                           double min_area,
                                           TDLObject *obj_meta);

【描述】

执行移动侦测任务,具体可以参考 tdl_sdk/sample/c/sample_motion_detection.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

TDLImage

background

背景图像

输入

TDLImage

detect_image

检测图像

输入

TDLObject*

roi

检测区域

输入

uint8_t

threshold

阈值

输入

double

min_area

最小面积

输出

TDLObject*

obj_meta

输出参数,存储检测结果

5.34. TDL_APP_Init

【语法】

int32_t TDL_APP_Init(TDLHandle handle,
                                  const char *task,
                                  const char *config_file,
                                  char ***channel_names,
                                  uint8_t *channel_size);

【描述】

初始化APP任务,执行抓拍,客流量计数等复杂的场景,模型配置参数主要在 config_file 中配置, 具体例子可以参考 tdl_sdk/sample/c/camera/sample_vi_face_pet_cap.c。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

task

APP任务名称

输入

const char*

config_file

APP的json配置文件路径,tdl提供了模板,路径在 tdl_sdk/sample/c/config

输出

char***

channel_names

每一路视频流的名称信息

输出

uint8_t*

channel_size

视频流的路数

5.35. TDL_APP_SetFrame

【语法】

int32_t TDL_APP_SetFrame(TDLHandle handle,
                                          const char *channel_name,
                                          TDLImage image_handle,
                                          uint64_t frame_id,
                                          int buffer_size);

【描述】

往APP场景送帧。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

channel_name

当前channel的名称

输入

TDLImage

image_handle

TDLImage 对象

输入

uint64_t

frame_id

当前TDLImage 对象的frame id

输入

int

buffer_size

推理线程缓存的帧数

5.36. TDL_APP_Capture

【语法】

int32_t TDL_APP_Capture(TDLHandle handle,
                                        const char *channel_name,
                                        TDLCaptureInfo *capture_info);

【描述】

执行抓拍任务,可以抓拍人脸,宠物等目标,主要依据配置文件决定,配置文件在 TDL_APP_Init 中调用。

【参数】

数据型态

参数名称

说明

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

channel_name

当前channel的名称

输出

TDLCaptureInfo*

capture_info

抓拍结果

5.37. TDL_APP_ObjectCounting

【语法】

int32_t TDL_APP_ObjectCounting(TDLHandle handle,
                                                  const char *channel_name,
                                                  TDLObjectCountingInfo *object_counting_info);

【描述】

执行客流统计(TDL_APP_Init task 为consumer_counting)或越界检测任务 (TDL_APP_Init task 为cross_detection)

【参数】

数据类型

参数名称

描述

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

channel_name

当前通道名称

输出

TDLObjectCountingInfo*

object_counting_info

统计/检测结果

5.38. TDL_APP_ObjectCountingSetLine

【语法】

int32_t TDL_APP_ObjectCountingSetLine(TDLHandle handle,
                                                            const char *channel_name, int x1,
                                                            int y1, int x2, int y2, int mode);

【描述】

客流统计或越界检测运行过程中重新设置画线位置。

【参数】

数据类型

参数名称

描述

输入

TDLHandle

handle

TDLHandle 对象

输入

const char*

channel_name

当前通道名称

输入

int

x1

端点1横坐标

输入

int

y1

端点1纵坐标

输入

int

x2

端点2横坐标

输入

int

y2

端点2纵坐标

输入

int

mode

对于客流统计: mode为0时, 对于竖直线, 从左到右为进入, 对于非竖直线,从上到下为进入, mode为1相反。对于越界检测: mode为0时, 对于竖直线, 从左到右为越过, 对于非竖直线,从上到下为越过, mode为1相反, mode为2双向检测

5.39. TDL_WrapImage

【语法】

int32_t TDL_WrapImage(TDLImage image,
                                    void *frame);

【描述】

将TDLImage包装为 VIDEO_FRAME_INFO_S 对象。

【参数】

数据类型

参数名称

描述

输入

TDLImage

image

TDLImage 对象

输出

VIDEO_FRAME_INFO_S*

frame

输出参数,存储包装后的帧信息

5.40. TDL_LLMApiCall

【语法】

int32_t TDL_LLMApiCall(TDLHandle handle, const char *client_type,
                                      const char *method_name, const char *params_json,
                                      char *result_buf, size_t buf_size)

【描述】

向指定的LLM客户端发起调用请求,具体例子可以参考 tdl_sdk/sample/c/sample_llm_api.c。

【参数】

数据类型

参数名称

描述

输入

TDLHandle

handle

TDL_CreateHandle返回的上下文句柄

输入

const char*

client_type

LLM客户端类型

输入

const char*

method_name

调用的接口方法名

输入

const char*

params_json

请求体的json字符串

输入

size_t

buf_size

result_buf可用空间大小

输出

char*

result_buf

存放调用返回的JSON结果或错误信息

6. TDL_SDK 模型部署方式

借助TDL_SDK框架,可以使新模型集成变得更加简单,框架可以帮助完成如下工作:

  • 图像预处理,用户只需配置预处理参数,框架内会自动调用预处理设备实现预处理

  • 模型推理,无需编写任何推理相关代码

  • 内存管理,框架内会自动管理内存,用户无需担心内存泄漏问题

6.1. 现有模型类添加新模型文件

现有模型在已在第三章中展示,如需添加新的模型文件,只是需要在模型工厂中添加对应的新模型ID方便调用,操作步骤如下:

  1. 在 tdl_sdk/install/CV184X/include/nn/tdl_model_list.h 中添加新模型的model_id;

  2. 在 tdl_sdk/src/components/nn/tdl_model_factory.cpp 中添加新模型的创建函数;

  3. 在 tdl_sdk/configs/model/model_factory.json 中添加新模型的配置信息。

6.2. 集成新的模型类型

  1. 在 tdl_sdk/src/componets/nn 目录下,根据新模型的任务类型,选择合适的文件夹,假如没有匹配的,就新建一个该任务类型的文件夹;

  2. 在文件夹内添加新模型的头文件和源文件,头文件派生自 tdl_sdk/include/framework/model/base_model.hpp,源文件实现函数 tdl_sdk/include/framework/model/base_model.hpp;

  3. 在 tdl_sdk/include/nn/tdl_model_list.h创建新的模型ID;

  4. 在 tdl_sdk/src/components/nn/tdl_model_factory.cpp 中添加新模型的创建函数;

  5. 在 tdl_sdk/configs/model/model_factory.json 中添加新模型的配置信息;

  6. YOLO系列模型编译可以参考文档《YOLO系列开发指南》,其他类型模型,直接按照标准流程进行编译。

7. TDL_SDK c sample使用方式

以下例子均以cv181x的板端为例,使用模型请更新实际情况替换。

7.1. sample_character_recognition

用于车牌识别场景,支持输入车牌图片,输出识别到的车牌字符文本信息。运行方式如下:

./sample_character_recognition --m ./cv181x/recognition_license_plate_24_96_MIX_cv181x.cvimodel -i ./license_plate_keypoints_0.jpg
 // -m 输入模型  -i 输入图像

输入图像为一张车牌的图片,运行结果将会在串口打印 txt info: 闽D999PN

_images/sample_character_recognition.png

7.2. sample_classification

用于声音分类和图像分类场景,支持输入音频bin文件或图片文件,输出其类别信息和置信度分数。音频识别的运行方式如下:

./sample_classification -m ./cv181x/baby_cry_cnn10_188_40_INT8_cv181x.cvimodel -b ./test_inputs/laugh_1_m4a_3_1.bin -r 16000 -t 3
// -m 输入模型  -b 输入音频bin文件  -r 采样率  -t 音频时长

输入一段音频数据,以及音频数据的采样率和时长,例程将会对音频进行识别,并输出其分数。

图片识别的运行方式如下:

./sample_classification -m ./cv181x/cls_hand_gesture_128_128_INT8_cv181x.cvimodel -i ./test_inputs/hand_two.jpg
// -m 输入模型  -i 输入图像

这里以手势识别为例,输入一张手势图像,将会输出手势以及他的分数。具体的串口打印如下

pred_lable: 0, score = 0.964321

7.3. sample_detect_keypoints

用于多目标关键点检测场景,支持输入单张图片,输出手部、车牌或人体姿态的关键点坐标信息。运行方式如下:

./sample_detect_keypoints -m./cv181x/hand_detection_yolov8n_mv3_050_INT8_cv181x.cvimodel,./cv181x/keypoint_hand_128_128_INT8_cv181x.cvimodel -i ./test_inputs/hand.jpg -o out_d.jpg,out_c.jpg
// -m 输入模型,这个sample需要输入两个模型,分别是检测类模型和关键点类的模型
// -i 输入图像
// -o 输出图像,可以不输入。输出两张图像,一张是检测画框的原图,一张是裁剪后的图片

这里输入一张手部图像,算法将会识别它的关键点,这里的关键点为比例系数,乘上对应的长宽即为坐标点。

obj_meta id: 0, [x, y]: 0.667969, 0.796875
obj_meta id: 0, [x, y]: 0.726562, 0.683594
obj_meta id: 0, [x, y]: 0.683594, 0.570312
obj_meta id: 0, [x, y]: 0.578125, 0.531250
obj_meta id: 0, [x, y]: 0.484375, 0.523438
obj_meta id: 0, [x, y]: 0.578125, 0.451172
obj_meta id: 0, [x, y]: 0.546875, 0.314453
obj_meta id: 0, [x, y]: 0.539062, 0.225586
obj_meta id: 0, [x, y]: 0.523438, 0.153320
obj_meta id: 0, [x, y]: 0.484375, 0.500000
obj_meta id: 0, [x, y]: 0.345703, 0.386719
obj_meta id: 0, [x, y]: 0.250000, 0.314453
obj_meta id: 0, [x, y]: 0.168945, 0.257812
obj_meta id: 0, [x, y]: 0.427734, 0.570312
obj_meta id: 0, [x, y]: 0.322266, 0.500000
obj_meta id: 0, [x, y]: 0.427734, 0.539062
obj_meta id: 0, [x, y]: 0.500000, 0.578125
obj_meta id: 0, [x, y]: 0.386719, 0.652344
obj_meta id: 0, [x, y]: 0.330078, 0.597656
obj_meta id: 0, [x, y]: 0.417969, 0.605469
obj_meta id: 0, [x, y]: 0.484375, 0.628906

依据关键点对图像进行标记的图片如下:

_images/sample_detect_keypoints.png

7.4. sample_keypoints

用于多类型关键点检测,支持输入单张图片,输出手部/车牌/人体姿态的关键点坐标信息及可视化标注图像, 与sample_detect_keypoints不同的是,这个接口需要输入一张已经裁剪后的图像。运行方式如下:

./sample_keypoints -m ./cv181x/keypoint_hand_128_128_INT8_cv181x.cvimodel -i ./test_inputs/hand.jpg -o out.jpg
// -m 输入模型 -i 输入图像 -o 输出图像,可以不输入

这里输入一张手部图像,算法将会识别它的关键点,依据关键点对图像进行标记的图片如下:

_images/sample_detect_keypoints.png

7.5. sample_face_attribute

用于人脸检测与属性分析场景,支持输入单张图片,输出人脸位置及性别、年龄、眼镜、口罩等属性信息。运行方式如下:

./sample_face_attribute -m ./cv181x/scrfd_500m_bnkps_432_768.cvimodel,./cv181x/face_attribute_cls.cvimodel -i ./test_inputs/face.jpg
// -m 输入模型,这个sample需要输入两个模型,分别是人脸检测和人脸属性识别
// -i 输入图像

这里输入一张人脸图像,算法将识别人脸的各个属性输入图像和结果如下所示:

_images/face.png
gender score: 0.992188, age score: 0.640625, glass score: 0.992188, mask score: 0.000000
Gender:Male
Age:Male
Glass:Yes
Mask:no

7.6. sample_face_detection

用于通用人脸检测,支持输入单张图片,输出带有人脸检测框标记的结果图像,并框输出人脸框的左上角的xy坐标和右下角的xy坐标,和置信度分数。运行方式如下:

./sample_face_detection -i ./test_inputs/face.jpg -m ./cv181x/scrfd_det_face_432_768_INT8_cv181x.cvimodel -o ./test_inputs/face_det.jpg
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张人脸图片,依据输出框图对人脸进行标记

_images/sample_face_detection.png

7.7. sample_feature_extraction

用于人脸比对场景,支持输入两张人脸图片,输出其相似度分数及中间处理结果图像。运行方式如下:

./sample_face_landmark -m ./cv181x/keypoint_face_v2_64_64_INT8_cv181x.cvimodel -i ./test_inputs/face.jpg
// -m 输入模型  -i 输入图像

这里输入两个图像,用于特征提取后的对比,输入两个一样的图像时,相似度为1。

similarity is 1.000000

7.8. sample_face_landmark

用于人脸关键点检测场景,输出图像的模糊度得分以及五个人脸关键点坐标点。运行方式如下:

./sample_face_landmark -m ./cv181x/keypoint_face_v2_64_64_INT8_cv181x.cvimodel -i ./test_inputs/face.jpg
// -m 输入模型  -i 输入图像

依据输入图像,串口将输出关键点信息

landmarks id : 0, landmarks x : 43.531250, landmarks y : 51.625000
landmarks id : 1, landmarks x : 73.500000, landmarks y : 51.625000
landmarks id : 2, landmarks x : 63.875000, landmarks y : 65.187500
landmarks id : 3, landmarks x : 45.937500, landmarks y : 82.250000
landmarks id : 4, landmarks x : 68.687500, landmarks y : 81.375000

7.9. sample_instance_segmentation

用于实例分割场景,输入一张图片数据,输出各个实例的坐标框和轮廓坐标点。运行方式如下:

./sample_instance_segmentation  -i ./test_inputs/coco.jpg -o ./test_inputs/coco_o.jpg -m ./cv181x/segmentation_yolov8n_640_640_INT8_cv181x.cvimodel
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张图片,算法将会对其进行分割

_images/sample_instance_segmentation.png

7.10. sample_lane_detection

用于车道线检测场景,支持输入道路图像,输出检测到的车道线坐标信息。运行方式如下:

./sample_lane_detection -m ./cv181x/lstr_det_lane_360_640_MIX_cv181x.cvimodel -i ./test_inputs/result.jpg -o ./out.jpg
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张车道线的图片,串口将会打印车道线信息:

lane 0
0: 506.925018 432.000031
1: 362.094147 576.000000
lane 1
0: 815.652710 432.000031
1: 1038.046509 576.000000

依据结果对图像进行标记:

_images/sample_lane_detection.png

7.11. sample_object_detection

用于通用目标检测sample,输出目标框的左上角的xy坐标和右下角的xy坐标,类别和置信度, 具体适配哪些模型可参看sample_object_detection .c中的get_od_model_info进行参看。运行方式如下:

./sample_object_detection -m ./cv181x/coco80_detection_yolov10n_640_640_INT8_cv181x.cvimodel -i ./test_inputs/coco.jpg -o ./out.jpg
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张图片,串口将会打印识别到的物体类别及框图

obj_meta_index : 0, class_id : 0 , score : 0.943986, boxx : [2.527201 327.880676 226.529968 507.681152]
obj_meta_index : 1, class_id : 0 , score : 0.918415, boxx : [740.277466 1285.450562 171.033188 427.008545]
obj_meta_index : 2, class_id : 4 , score : 0.850404, boxx : [738.621460 834.782410 348.960632 586.001221]
obj_meta_index : 3, class_id : 4 , score : 0.800627, boxx : [669.198853 750.732361 284.652740 555.387817]

依据结果对图像进行标记:

_images/sample_object_detection.png

7.12. sample_pose

用于人体姿态估计,支持输入单张图片,输出17个人体关键点坐标及骨架连接信息,并生成带关键点和骨架标注的可视化结果图。运行方式如下:

./sample_pose -m ./cv181x/keypoint_yolov8pose_person17_384_640_INT8_cv181x.cvimodel  -i ./test_inputs/person.jpg -o ./test_inputs/person_out.jpg
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张图片,串口将会姿态的坐标点和分数

obj_meta_index : 0, class_id : 0[79270.104763], score : 0.934758, bbox : [45.138302 249.390228 102.585884 354.314575]
pose : 0: 142.950653 160.520309 0.980407
pose : 1: 149.029053 148.363525 0.924847
pose : 2: 124.715469 148.363525 0.962615
pose : 3: 161.185822 154.441910 0.573295
pose : 4: 100.401848 166.598709 0.814048
pose : 5: 197.656219 221.304276 0.962615
pose : 6: 82.166672 245.617874 0.986373
pose : 7: 228.048203 324.637054 0.802613
pose : 8: 63.931477 336.793823 0.924847
pose : 9: 136.872238 342.872223 0.778173
pose : 10: 88.245079 257.774658 0.901571
pose : 11: 191.577805 379.342621 0.573295
pose : 12: 112.558662 391.499390 0.676617
pose : 13: 161.185822 403.656189 0.070180
pose : 14: 100.401848 397.577789 0.098429
pose : 15: 100.401848 391.499390 0.012670
pose : 16: 106.480255 367.185822 0.015762

依据结果对图像进行标记:

_images/sample_pose.png

7.13. sample_semantic_segmentation

用于语义分割场景,输入一张图片数据,输出各个像素点的类别信息。运行方式如下:

./sample_semantic_segmentation -m ./cv181x/topformer_seg_person_face_vehicle_384_640_INT8_cv181x.cvimodel -i ./test_inputs/topformer.jpg -o out.jpg
// -m 输入模型  -i 输入图像  -o 输出图像,可以不输入

这里输入一张图片,串口将会打印图像各个像素图点对应的类别

_images/sample_semantic_segmentation1.png _images/sample_semantic_segmentation2.png

7.14. sample_tracking

对输入的图片组进行追踪。运行方式如下:

./sample_tracking -m ./cv181x/scrfd_det_face_432_768_INT8_cv181x.cvimodel,./cv181x/mbv2_det_person_512_896_INT8_cv181x.cvimodel -i input -o output
// -m 输入模型,这个sample需要输入两个个模型,分别是人脸检测和行人检测
// -i 输入图像文件夹,文件夹下包含了一组图片,图片需要按照xxx_001.jpg,xxx_002.jpg这样的顺序排列,如下图
// -o 输出图像文件夹

输入的图片组示例:

_images/sample_tracking_input.png

输入的图片组示例:

_images/sample_tracking_output.png

7.15. sample_face_recognition

识别人脸并进行特征匹配,人脸检测->人脸特征点提取->人脸特征值提取->特征点比较。运行方式如下:

./sample_face_recognition -m ./cv181x/scrfd_det_face_432_768_INT8_cv181x.cvimodel,./cv181x/keypoint_face_v2_64_64_INT8_cv181x.cvimodel,./cv181x/feature_cviface_112_112_INT8_cv181x.cvimodel -i ./test_inputs/face.jpg,./test_inputs/face.jpg  -c ./model_factory.json
// -m 输入模型,这个sample需要输入三个模型,分别是人脸检测,人脸特征点,人脸特征值
// -i 输入图像,这个sample需要输入两张图像,用于提取特征值后的人脸比对
// -c config参数,记录了模型的参数设置

输入两张一样的图像,得到的特征值相似度一致

similarity is 1.000000

7.16. sample_licence_recognition

识别车牌,检测->关键点->识别,支持一张图片多个车牌。运行方式如下:

./sample_licence_recognition -m ./cv181x/yolov8n_det_license_plate_384_640_INT8_cv181x.cvimodel,./cv181x/keypoint_license_plate_64_128_INT8_cv181x.cvimodel,./cv181x/recognition_license_plate_24_96_MIX_cv181x.cvimodel -i ./test_inputs/out_vertical_cv.jpg
// -m 输入模型,这个sample需要输入三个模型,分别是车牌检测,车牌关键点点,车牌识别
// -i 输入图像

这里输入一张包含两个车牌的图像:

_images/sample_licence_recognition.png

串口将有如下打印:

id = 0, txt info: 闽D999PN
id = 1, txt info: 闽D999PN

7.17. sample_vi_detection

连接摄像头进行物体识别。将sensor_cfg.ini(sensor的配置文件可以联系开发者获取)放置在/mnt/data目录下,并使用下列命令运行:

./sample_vi_detection -m ./cv181x/yolov8n_det_hand_384_640_INT8_cv181x.cvimodel -c 0
// -m 输入模型,这里的例子为手部检测
// -c vi的chn,单sensor的情况下为0
// -f config参数,记录了模型的参数设置,可以不输入

这里以手部检测为例,将会打印出检测到的手部的信息

obj_meta_index : 0, class_id : 0, score : 0.861538, bbox : [260.416077 601.567139 103.850037 312.489624]

7.18. sample_vi_face_pet_cap

连连接摄像头进行人脸宠物抓拍,如果有输入-g的参数,则会进行特征点识别,如果有-o的参数,则将抓拍的图像保存下来。

//json文件解析,在使用的过程中,model_dir和model_config一定要根据实际情况修改
{
  "model_dir": "/mnt/sd/models/", //模型的路径,后面会自动匹配cv181x,cv184x等,因此实际的模型路径为/mnt/sd/models/cv181x,这里一定要将模型先放置在cv181x(依据板端类型修改)的文件夹下,再放置在model_dir的路径下
  "model_config": "/mnt/sd/configs/model/model_factory.json", //模型的参数文件
  "frame_buffer_size": 1,
  "pipelines": [
    {
      "name": "face_pet_cap",
      "nodes": {
        "object_detection_node": {
          "config_thresh": 0.5
        },
        "track_node": {
          "fuse_track": true
        },
        "snapshot_node": {          //抓拍参数
          "snapshot_interval": 5,
          "min_snapshot_size": 40,
          "crop_size_min": 128,
          "crop_size_max": 256,
          "snapshot_quality_threshold": 0,
          "crop_square": true
        }
      }
    }
  ]
}

gallery文件夹在tdl中不提供,需要自己生成, 注意必须是0.bin,1.bin……这样的格式。 特征值可以使用TDL_FeatureExtraction获取(参数上述的TDL_FeatureExtraction), 也可以在本sample中的TDLCaptureInfo结构体中获取,在TDL_APP_Capture后, 如果识别到人脸,则TDLCaptureInfo中的TDLFeature参数中的prt会记录特征值,将其保存为文件,下图为参考

_images/sample_vi_face_pet_cap1.png

将sensor_cfg.ini(sensor的配置文件可以联系开发者获取)放置在/mnt/data目录下,并使用下列命令运行

./sample_vi_face_pet_cap -c ./config/face_pet_cap_app.json -v 0 -g ./ipcamera/gallery/ -o out
// -m 配置json文件,记录了要使用哪些功能
// -v vi的chn,单sensor的情况下为0
// -g 特征值数据库,可以不输入
// -o 输出文件夹,可以不输入

7.19. sample_vi_consumer_counting

连接摄像头进行客流量统计。运行方式如下:

./sample_vi_consumer_counting -c ./config/consumer_counting_app_vi.json -v 0

输出结果如下:

enter: 0, miss: 0
+++++++++++++++++++++++++++++++ frame:124, infer time:40.00, fps: 25.00

7.20. sample_vi_cross_detection

连接摄像头进行入侵检测。运行方式如下:

./sample_vi_cross_detection -c ./config/cross_detection_app_vi.json -v 0

输出结果如下:

cross num: 0
+++++++++++++++++++++++++++++++ frame:62, infer time:40.00, fps: 25.00

7.21. sample_vi_single_object_tracking

连接摄像头进行单目追踪,开始运行程序时 TDL_Detection 对目标进行检测。 当需要对某个物体或某块区域进行追踪时,按下I或i即可输入参数。 可以输入box的id(范围为0 - bj_meta.size),box的坐标(x1,y1,x2,y2)或者是一个坐标点(x,y); 输入完成后对目标进行追踪,当目标丢失超过5秒后,恢复 TDL_Detection 检测阶段。 运行方式如下:

./sample_vi_single_object_tracking -d ./cv181x/yolov8n_det_person_vehicle_384_640_INT8_cv181x.cvimodel -s ./cv181x/tracking_feartrack_128_128_256_256_INT8_cv181x.cvimodel
// -d 检测类模型 -s 追踪类模型

输出结果如下:

Usage: input i or I to start tracking ......
Enter bbox x1,y1,x2,y2 or a point x,y or bbox index to track:
0 //追踪id为0的目标
values[0] = 0
The target has been lost for more than 5 seconds, switching to detection state //当目标丢失超过5s时,回到检测状态
Usage: input i or I to start tracking ......

7.22. sample_motion_detection

移动检测,输入一张背景图像和检测图像。运行方式如下:

./sample_motion_detection ./test_inputs/ir.jpg ./test_inputs/ir.jpg

输出结果如下:

Running motion detection with images:
Background: ./test_inputs/ir.jpg
Detect: ./test_inputs/ir.jpg
Setting ROI regions...
Begin motion detection...
Detection completed

7.23. sample_intrusion_detection

入侵检测。运行方式如下:

./sample_intrusion_detection

输出结果如下:

=============矩形区域测试=============
==== 矩形区域 ====
点数: 40: (100.00, 100.00)1: (300.00, 100.00)2: (300.00, 200.00)3: (100.00, 200.00)

内部边界框检测: 入侵
外部边界框检测: 未入侵

=============凹多边形区域测试=============
==== 凹多边形区域 ====
点数: 60: (100.00, 100.00)1: (200.00, 50.00)2: (300.00, 100.00)3: (250.00, 150.00)4: (200.00, 120.00)5: (150.00, 150.00)

内部边界框检测: 入侵
外部边界框检测: 未入侵

测试完成!

8. 常见问题

8.1. 模型打开失败类问题

  1. 缺乏model_config_json

[tdl_model_factory.cpp:80] [I] input model config file is empty, load model config from /configs/model/model_factory.json
[tdl_model_factory.cpp:87] [E] model config file not found: /configs/model/model_factory.json
[tdl_model_factory.cpp:238] [E] model config not found for model type: YOLOV8N_DET_PERSON_VEHICLE
[tdl_model_factory.cpp:248] [I] getModelInstance model_type:YOLOV8N_DET_PERSON_VEHICLE
[tdl_model_factory.cpp:526] [I] createObjectDetectionModel success,model type:5,category:0
[tdl_model_factory.cpp:831] [I] model_path: ./cv184x/yolov8n_det_person_vehicle_384_640_INT8_cv181x.cvimodel
[tdl_model_factory.cpp:238] [E] model config not found for model type: TRACKING_FEARTRACK
[tdl_model_factory.cpp:248] [I] getModelInstance model_type:TRACKING_FEARTRACK
[tdl_model_factory.cpp:831] [I] model_path: ./tracking_feartrack_128_128_256_256_INT8_cv181x.cvimodel
[base_model.cpp:159] [E] mean or std size is not 3
[base_model.cpp:42] [E] Net setup failed

可以看出来参数缺乏mean和std,这是因为在调用TDL_OpenModel时没有传参model_config_json,大部分专有模型是不需要传入的; 部分通用模型如特征提取、声音指令等需要传入模型配置信息,可以参考configs/model/model_config.json。