Skip to content

sophgo/tdl_sdk

Repository files navigation

公版深度学习TDL(turnkey deep learning)

1. 概述

Cvitek所提供的TDL(Turnkey Deep Learning)集成算法, 用以缩短应用程序开发所需的时间。此架构实现了TDL所需算法包含其前后处理, 提供统一且便捷的编程接口。

TDL_SDK基于算能自研的Middleware和TPU SDK,包括内部两大模块(Core和Service)、算法C接口、算法应用(Application)。

TDL SDK系统框架

图1 TDL SDK系统框架

Core提供了算法相关接口,封装复杂的底层操作及算法细节,在内部会对模型进行相应的前后处理,并完成推理。Service提供算法相关辅助API,例如:绘图, 特征比对, 区域入侵判定等功能。C接口实现对现有现有算法模块的功能封装,除了支持TDL SDK内部模型外,还支持开发者自有模型(需按文档进行模型转换)。Application封装应用逻辑,如包含人脸抓拍的应用逻辑。

目前TDL SDK包含 移动侦测人脸检测人脸识别人脸关键点检测跌倒检测语义分割车牌检测车牌辨识活体识别声音分类人体关键点检测车道线识别目标追踪手势侦测手势识别文字检测文本识别等算法。

2. 仓库目录

cmake: 包含项目所需的 CMake 配置文件。 docs: 包含项目文档及其生成相关的文件。 doxygen: 包含 Doxygen 配置文件,用于生成 API 文档。 include: 存放项目的头文件,按模块组织。 modules: 包含项目的各个功能模块及核心模块的具体实现。 sample: 提供多个示例程序及其构建脚本,展示项目的功能和用法。 scripts: 包含各种辅助脚本,如代码检查、编译和测试脚本。 tool: 包含各种工具和实用程序代码。 toolchain: 提供不同平台的工具链配置文件。 tutorial: 包含项目的教程文档,帮助用户快速上手和使用项目。 编译产生的中间文件以及第三方库的下载都会位于tmp文件夹内

3. 编译流程

在编译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

4. 使用案例

算法接口 以人脸检测为例子

/**
 * @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;
}
人脸检测效果

更多案例还请参考教程

5. 开发指南

详见TDL SDK软件开发指南

6. SDK问题反馈

最后,如果您对仓库有任何的疑问或者改进想法,请通过 Issues 提交。我们欢迎所有形式的贡献,包括文档改进、bug 修复、新特性添加等等,直接参与到项目的开发和维护中,帮助我们不断改进。我们期待在您的帮助下,将本项目发展成为更加完善、易于使用的深度学习SDK库。