Cvitek所提供的TDL(Turnkey Deep Learning)集成算法, 用以缩短应用程序开发所需的时间。此架构实现了TDL所需算法包含其前后处理, 提供统一且便捷的编程接口。
TDL_SDK基于算能自研的Middleware和TPU SDK,包括内部两大模块(Core和Service)、算法C接口、算法应用(Application)。
Core提供了算法相关接口,封装复杂的底层操作及算法细节,在内部会对模型进行相应的前后处理,并完成推理。Service提供算法相关辅助API,例如:绘图, 特征比对, 区域入侵判定等功能。C接口实现对现有现有算法模块的功能封装,除了支持TDL SDK内部模型外,还支持开发者自有模型(需按文档进行模型转换)。Application封装应用逻辑,如包含人脸抓拍的应用逻辑。
目前TDL SDK包含 移动侦测, 人脸检测, 人脸识别, 人脸关键点检测, 跌倒检测, 语义分割, 车牌检测, 车牌辨识, 活体识别,声音分类, 人体关键点检测, 车道线识别, 目标追踪, 手势侦测, 手势识别,文字检测,文本识别等算法。
cmake: 包含项目所需的 CMake 配置文件。 docs: 包含项目文档及其生成相关的文件。 doxygen: 包含 Doxygen 配置文件,用于生成 API 文档。 include: 存放项目的头文件,按模块组织。 modules: 包含项目的各个功能模块及核心模块的具体实现。 sample: 提供多个示例程序及其构建脚本,展示项目的功能和用法。 scripts: 包含各种辅助脚本,如代码检查、编译和测试脚本。 tool: 包含各种工具和实用程序代码。 toolchain: 提供不同平台的工具链配置文件。 tutorial: 包含项目的教程文档,帮助用户快速上手和使用项目。 编译产生的中间文件以及第三方库的下载都会位于tmp文件夹内
在编译TDL_SDK前,请确保已完成了开发板固件以及其他依赖库的编译! 否则请参考SG200x SDK软件包中的2~4。 根据开发板芯片的不同,编译需要指定4个参数,此处我们列出所有的开发板对应的参数
CHIP_ARCH | BOARD | SDK_VER | MW_VER |
---|---|---|---|
CV180X |
fpga | glibc_riscv64 |
v2 |
palladium | |||
wdmb_0008a_spinand | musl_riscv64 |
||
wdmb_0008a_spinor | |||
wevb_0008a_spinor | |||
wevb_0009a_spinor | |||
wdmb_0009a_spinor | |||
wevb_0009a_spinand | |||
CV181X |
wdmb_0006a_spinor | musl_riscv64 |
v2 |
wevb_0006a_spinand | |||
wevb_0006a_spinor | |||
wevb_0007a_spinor | |||
sophpi_duo_sd | |||
wevb_0006a_emmc | |||
wevb_0007a_emmc | |||
wevb_0007a_emmc_huashan | |||
wevb_0007a_spinand | |||
wevb_0007a_spinand_huashan | |||
wevb_0007a_spinor_huashan | |||
wevb_riscv64_sd | |||
wevb_0007a_emmc | glibc_riscv64 | ||
wevb_0006a_spinor | 32bit | ||
wevb_0006a_spinand | 64bit | ||
wevb_arm64_sd | |||
wevb_arm64_sd | |||
CV186X |
fpga | 64bit |
v2 |
palladium | |||
wevb_emmc | |||
wevb_spinor | |||
wevb_spinand | |||
palladium_c906 | glibc_riscv64 |
cd tdl_sdk
# export中的参数根据具体开发板给定
export CHIP_ARCH=CV180X BOARD=wevb_riscv64_sd SDK_VER=musl_riscv64 MW_VER=v2
./scripts/native_sdk_release.sh
算法接口 以人脸检测为例子
/**
* @brief Detect face with score.
*
* @param handle An TDL SDK handle.
* @param frame Input video frame.
* @param face_meta Output detect result. The bbox will be given.
* @param model_index The face detection model id selected to use.
* @return int Return CVI_TDL_SUCCESS on success.
*/
DLL_EXPORT CVI_S32 CVI_TDL_FaceDetection(const cvitdl_handle_t handle, VIDEO_FRAME_INFO_S *frame,
CVI_TDL_SUPPORTED_MODEL_E model_index,
cvtdl_face_t *face_meta);
辅助功能接口 以人脸画框为例
/**
* @brief Draw rect to frame with given face meta with a global brush.
* @ingroup core_cvitdlservice
*
* @param handle A service handle.
* @param meta meta structure.
* @param frame In/ out YUV frame.
* @param drawText Choose to draw name of the face.
* @param brush A brush for drawing
* @return CVI_S32 Return CVI_TDL_SUCCESS if succeed.
*/
DLL_EXPORT CVI_S32 CVI_TDL_Service_FaceDrawRect(cvitdl_service_handle_t handle,
const cvtdl_face_t *meta, VIDEO_FRAME_INFO_S *frame,
const bool drawText, cvtdl_service_brush_t brush);
一个简单的调用例子:
#define _GNU_SOURCE
#include <stdio.h>
#include <iostream>
#include <string>
#include "core/utils/vpss_helper.h"
#include "cvi_tdl.h"
#include "cvi_tdl_media.h"
int main(int argc, char *argv[]) {
int vpssgrp_width = 1920;
int vpssgrp_height = 1080;
CVI_S32 ret = MMF_INIT_HELPER2(vpssgrp_width, vpssgrp_height, PIXEL_FORMAT_RGB_888, 1,
vpssgrp_width, vpssgrp_height, PIXEL_FORMAT_RGB_888, 1);
if (ret != CVI_TDL_SUCCESS) {
printf("Init sys failed with %#x!\n", ret);
return ret;
}
cvitdl_handle_t tdl_handle = NULL;
ret = CVI_TDL_CreateHandle(&tdl_handle);
if (ret != CVI_SUCCESS) {
printf("Create tdl handle failed with %#x!\n", ret);
return ret;
}
std::string strf1(argv[2]);
ret = CVI_TDL_OpenModel(tdl_handle, CVI_TDL_SUPPORTED_MODEL_SCRFDFACE, argv[1]);
if (ret != CVI_SUCCESS) {
printf("open model failed with %#x!\n", ret);
return ret;
}
CVI_TDL_UseMmap(tdl_handle, CVI_TDL_SUPPORTED_MODEL_SCRFDFACE, false);
imgprocess_t img_handle;
CVI_TDL_Create_ImageProcessor(&img_handle);
VIDEO_FRAME_INFO_S bg;
// printf("toread image:%s\n",argv[1]);
ret = CVI_TDL_ReadImage(img_handle, strf1.c_str(), &bg, PIXEL_FORMAT_RGB_888_PLANAR);
if (ret != CVI_SUCCESS) {
printf("open img failed with %#x!\n", ret);
return ret;
} else {
printf("image read,width:%d\n", bg.stVFrame.u32Width);
}
std::string str_res;
for (int i = 0; i < 1; i++) {
cvtdl_face_t obj_meta = {0};
ret = CVI_TDL_FaceDetection(tdl_handle, &bg, CVI_TDL_SUPPORTED_MODEL_SCRFDFACE, &obj_meta);
std::stringstream ss;
ss << "boxes=[";
for (uint32_t i = 0; i < obj_meta.size; i++) {
ss << "[" << obj_meta.info[i].bbox.x1 << "," << obj_meta.info[i].bbox.y1 << ","
<< obj_meta.info[i].bbox.x2 << "," << obj_meta.info[i].bbox.y2 << "],";
}
str_res = ss.str();
CVI_TDL_Free(&obj_meta);
}
std::cout << str_res << std::endl;
CVI_TDL_ReleaseImage(img_handle, &bg);
CVI_TDL_DestroyHandle(tdl_handle);
CVI_TDL_Destroy_ImageProcessor(img_handle);
return ret;
}
更多案例还请参考教程
最后,如果您对仓库有任何的疑问或者改进想法,请通过 Issues 提交。我们欢迎所有形式的贡献,包括文档改进、bug 修复、新特性添加等等,直接参与到项目的开发和维护中,帮助我们不断改进。我们期待在您的帮助下,将本项目发展成为更加完善、易于使用的深度学习SDK库。