首页
商城
  • English
  • 简体中文
首页
商城
  • English
  • 简体中文
  • 产品系列

    • FPGA+ARM

      • GM-3568JHF

        • 一、简介

          • GM-3568JHF 简介
        • 二、快速开始

          • 00 前言
          • 01 环境搭建
          • 02 编译说明
          • 03 烧录指南
          • 04 调试工具
          • 05 软件更新
          • 06 查看信息
          • 07 测试命令
          • 08 应用编译
          • 09 源码获取
        • 三、外设与接口

          • 01 USB
          • 02 显示与触摸
          • 03 以太网
          • 04 WIFI
          • 05 蓝牙
          • 06 TF-Card
          • 07 音频
          • 08 串口
          • 09 CAN
          • 10 RTC
        • 四、应用开发

          • 01 UART读写案例
          • 02 按键检测案例
          • 03 LED灯闪烁案例
          • 04 MIPI屏幕检测案例
          • 05 读取 USB 设备信息案例
          • 06 FAN 检测案例
          • 07 FPGA FSPI 通信案例
          • 08 FPGA DMA 读写案例
          • 09 GPS调试案例
          • 10 以太网测试案例
          • 11 RS485读写案例
          • 12 FPGA IIC 读写案例
          • 13 PN532 NFC读卡案例
          • 14 TF卡读写案例
        • 五、QT开发

          • 01 ARM64交叉编译器环境搭建
          • 02 QT 程序加入开机自启服务
        • 六、RKNN_NPU开发

          • 01 RK3568 NPU 概述
          • 02 开发环境搭建
          • 运行官方 YOLOv5 示例
        • 七、FPGA开发

          • ARM与FPGA通讯
          • FPGA开发手册
        • 八、其他

          • 01 根目录文件系统的修改
          • 02 系统自启服务
        • 九、资料下载

          • 资料下载
    • ShimetaPi

      • M4-R1

        • 一、简介

          • M4-R1简介
        • 二、快速上手

          • 01 OpenHarmony概述
          • 02 镜像烧录
          • 03 应用开发快速上手
          • 04 设备开发快速上手
        • 三、应用开发

          • 01 ArkUI

            • 1 ArkTS语言简介
            • 2 UI 组件-Row 容器介绍
            • 3 UI 组件-Column 容器介绍
            • 4 UI 组件-Text 组件
            • 5 UI 组件-Toggle 组件
            • 6 UI 组件-Slider 组件
            • 7 UI 组件-Animation 组件&Transition 组件
          • 02 资料获取

            • 1 OpenHarmony 官方资料
          • 03 开发须知

            • 1 Full-SDK替换教程
            • 2 引入和使用三方库
            • 3 HDC调试
            • 4 命令行恢复出厂模式
            • 5 升级App为system权限
          • 04 构建第一个应用

            • 1 构建第一个ArkTs应用-HelloWorld
          • 05 案例

            • 01 串口调试助手应用案例
            • 02 手写板应用案例
            • 03 数字时钟应用案例
            • 04 WIFI 信息获取应用案例
        • 四、设备开发

          • 1 Ubuntu环境开发

            • 01 环境搭建
            • 02 下载源码
            • 03 编译源码
          • 2 使用DevEco Device Tool 工具

            • 01 工具简介
            • 02 开发环境的搭建
            • 03 导入SDK
            • 04 HUAWEI DevEco Tool 功能介绍
        • 五、内核外设与接口

          • 01 指南
          • 02 设备树介绍
          • 03 NAPI 入门
          • 04 ArkTS入门
          • 05 NAPI开发实战演示
          • 06 GPIO介绍
          • 07 I2C通讯
          • 08 SPI通信
          • 09 PWM 控制
          • 10 串口通讯
          • 11 TF卡
          • 12 屏幕
          • 13 触摸
          • 14 Ethernet(以太网)
          • 15 M.2 硬盘
          • 16 音频
          • 17 WIFI & BT
          • 18 摄像头
        • 六、资料下载

          • 资料下载
      • M5-R1

        • 一、简介

          • M5-R1 开发文档
        • 二、快速上手

          • 镜像烧录
          • 环境搭建
          • 下载源码
        • 三、外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
        • 四、资料下载

          • 资料下载
      • Pico-G1

        • 一、产品概述

          • 01 芯片与硬件平台介绍
          • 02 SDK版本说明
        • 二、快速入门

          • 01 开发环境搭建
          • 02 镜像编译
          • 03 镜像烧录
          • 04 系统登录
          • 05 网络配置
          • 06 文件传输
          • 07 SDK目录结构
          • 08 部署第一个应用程序
          • 09 部署第一个驱动程序
          • 10 SD卡挂载
        • 三、外设与接口

          • 01 GPIO控制
          • 02 UART串口通信
          • 03 I2C 通信
          • 04 SPI 通信
        • 四、MPP媒体开发

          • 01 MPP媒体处理软件
          • 02 图像处理链路
          • 03 视频输入
          • 04 图像编码
        • 五、NPU与AI

          • 01 NPU驱动与运行库架构
          • 02 .xmm 模型加载
          • 03 SVP视频处理
          • 04 AI降噪 (AI_NR)
        • 六、应用程序示例

          • 01 区域运动检测应用
          • 02 MTCNN 人脸检测应用
    • 开源鸿蒙

      • SC-3568HA

        • 一、简介

          • SC-3568HA简介
        • 二、快速上手

          • OpenHarmony概述
          • 镜像烧录
          • 开发环境准备
          • Hello World应用以及部署
        • 三、应用开发

          • ArkUI

            • 第一章 ArkTS语言简介
            • 第二章 UI组件介绍和实际应用(上)
            • 第三章 UI组件介绍和实际应用(中)
            • 第四章 UI组件介绍和实际应用(下)
          • 拓展

            • 第一章 入门指引
            • 第二章 三方库的引用和使用
            • 第三章 应用编译以及部署
            • 第四章 命令行恢复出厂设置
            • 第五章 系统调试--HDC调试
            • 第六章 APP 稳定性测试
            • 第七章 应用测试
        • 四、设备开发

          • 第一章 环境搭建
          • 第二章 下载源码
          • 第三章 编译源码
        • 五、内核的外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • 树莓派拓展板
        • 六、资料下载

          • 资料下载
      • M-K1HSE

        • 一、简介

          • M-K1HSE 简介
        • 二、快速开始

          • 开发环境搭建
          • 源码获取
          • 编译说明
          • 烧录指南
        • 三、应用开发

          • 00 应用开发环境搭建
          • 01 第一个应用-Hello World
        • 四、外设与接口

          • 01 Audio
          • 02 RS485
          • 03 Display
        • 五、系统定制开发

          • 系统移植
          • 系统定制
          • 驱动开发
          • 系统调试
          • OTA升级
        • 六、资料下载

          • 资料下载
    • EVS相机

      • CF-NRS1

        • 一、简介

          • 01-产品介绍
          • 02-相关概念
          • 03-MultiVision Studio 介绍
        • 二、开发

          • 01-ShiMetaPi Hybrid vision SDK 介绍
          • 02-Hybrid_vision_toolkit
          • 03-Hybrid_vision_toolkit API (C++)
          • 04 Hybrid Vision algo
          • 05 Hybrid vision algo API
          • 06 EVS Network Server
          • 07 EVS Time Sync
          • 08 Web Window
        • 三、资料下载

          • 资料下载
        • 四、常见问题

          • 常见问题解决指南
      • CF-CRA2

        • 一、简介

          • CF-NRS2 简介
        • 二、资料下载

          • 资料下载
      • EVS模块

        • 一、相关概念
        • 二、硬件准备与环境配置
        • 三、示例程序使用指南
        • 资料下载
    • AI硬件

      • 1684XB-32T

        • 一、简介

          • AIBOX-1684XB-32简介
        • 二、快速上手

          • 初次使用
          • 网络配置
          • 磁盘使用
          • 内存分配
          • 风扇策略
          • 固件升级
          • 交叉编译
          • 模型量化
        • 三、应用开发

          • 开发简介

            • Sophgo SDK开发
            • SOPHON-DEMO简介
          • 大语言模型

            • 部署Llama3示例
            • Sophon LLM_api_server开发
            • 部署MiniCPM-V-2_6
            • Qwen-2-5-VL图片视频识别DEMO
            • Qwen3-chat-DEMO
            • Qwen3-Qwen Agent-MCP开发
            • Qwen3-langchain-AI Agent
          • 深度学习

            • ResNet(图像分类)
            • LPRNet(车牌识别)
            • SAM(通用图像分割基础模型)
            • YOLOv5(目标检测)
            • OpenPose(人体关键点检测)
            • PP-OCR(光学字符识别)
        • 四、资料下载

          • 资料下载
      • 1684X-416T

        • 简介

          • AIBOX-1684X-416简介
        • Demo简单操作指引

          • shimeta智慧监控demo的简单使用说明
      • RDK-X5

        • 简介

          • RDK-X5 硬件简介
        • 快速开始

          • RDK-X5 快速开始
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-颜色识别检测
            • 实验03-手势识别体验
            • 实验04-YOLOv5物体检测
      • RDK-S100

        • 简介

          • RDK-S100 硬件简介
        • 快速开始

          • RDK-S100 硬件简介
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-图像处理基础
            • 实验03-目标检测
            • 实验04-图像分割
    • 核心板

      • C-3568BQ

        • 简介

          • C-3568BQ 简介
      • C-3588LQ

        • 简介

          • C-3588LQ 简介
      • GC-3568JBAF

        • 简介

          • GC-3568JBAF 简介
      • C-K1BA

        • 简介

          • C-K1BA 简介

03 SVP视频处理

SVP(Smart Video Processing)是智能视频处理的核心模块,为开发人员提供了一套完整的API接口,支持人形、人脸、车辆、烟火、DMS(驾驶员监控系统)等多种智能分析算法。

本文档以 YOLOv5 人形检测为例,完整讲解 NPU 从模型加载到推理结果输出的智能视觉管线全流程。


1. 整体架构概览

GK7206 芯片内部集成了专用的 NPU(神经网络处理单元),可以高效执行卷积神经网络推理。整体数据流如下:

NPU推理架构

关键硬件模块说明:

模块全称功能
VIVideo Input接收 Sensor 采集的原始图像
VPSSVideo Processing Sub-System图像缩放、裁剪,输出多路不同分辨率
NPUNeural Processing Unit神经网络推理(卷积、池化、激活等)
VGSVideo Graphics Sub-System在图像上叠加矩形框、文字等 OSD 信息
VENCVideo EncoderH.264/H.265 视频编码
MMZMedia Memory Zone媒体专用物理连续内存管理

2. SVP视频开发管线

摄像头画面在到达 NPU 之前,需要经过一系列硬件模块处理:

Sensor → VI → VPSS → 通道0: 大图(1920×1080) → VENC(主码流) / VO(显示)
                  └→ 通道1: 小图(640×360)   → NPU推理
                  └→ 通道2: 中图(1280×720)   → VENC(子码流) / NPU(大图模型)

为什么需要缩放?

  • NPU 模型在训练时使用固定分辨率(如 640×360)
  • VPSS 硬件自动完成缩放,无需 CPU 参与
  • 缩放后的帧直接在物理内存中传递给 NPU,实现零拷贝

相关代码位置:sample_svp_main.c:1108-1161


3. SVP视频处理完整流程

3.1 初始化 SVP 子系统

SVP(Smart Vision Platform)是 GK7206 的智能视觉平台接口。使用 NPU 前必须先初始化:

// 文件: sample_svp_main.c → sample_svp_start()

xmedia_s32 ret;

// 第一步:初始化 SVP 子系统
ret = xmedia_svp_init();
if (ret != XMEDIA_SUCCESS) {
    printf("xmedia_svp_init error.\n");
    return XMEDIA_FAILURE;
}

注意:xmedia_svp_init() 在整个应用生命周期中只需调用一次。


3.2 加载模型与分配内存

NPU 需要专用的物理连续内存来存放模型权重和中间计算结果。

3.2.1 配置模型信息

以人形检测为例,配置模型参数:

xmedia_svp_modules modules[8];  // 最多支持 8 个模型
xmedia_svp_task_cfg task_cfg;

// 配置模型 0:人形检测
modules[0].alg_type  = XMEDIA_SVP_ALG_TYPE_PERSON;           // 算法类型
modules[0].load_mode = XMEDIA_SVP_MODEL_FILE;                 // 从文件加载
modules[0].format    = XMEDIA_SVP_INPUTDATA_FORMAT_RGB888;    // 输入格式
modules[0].pathname  = "./model/gnn_person_detect_640x360_rgb888hwc_v0103_20251203.bin";

task_cfg.module_num = 1;                     // 本任务使用 1 个模型
task_cfg.task_type  = XMEDIA_SVP_TASK_DETECT; // 检测类任务
task_cfg.modules    = modules;

模型配置字段说明:

字段说明可选值
alg_type算法类别XMEDIA_SVP_ALG_TYPE_PERSON、XMEDIA_SVP_ALG_TYPE_FACE、XMEDIA_SVP_ALG_TYPE_CAR 等
load_mode加载方式XMEDIA_SVP_MODEL_FILE(从文件)、XMEDIA_SVP_MODEL_MEM(从内存)
format输入图像格式XMEDIA_SVP_INPUTDATA_FORMAT_RGB888、XMEDIA_SVP_INPUTDATA_FORMAT_YUV420SP
pathname模型文件路径.bin 格式的 NPU 专用模型文件

3.2.2 查询模型内存需求

// 查询模型所需的内存大小
xmedia_cl_mem_info model_mem_info;
ret = xmedia_cl_graph_query_model_info_from_file(
    modules[0].pathname,
    &model_mem_info,
    XMEDIA_CL_MEM_INFO
);

// model_mem_info 中包含:
//   worksize  - NPU 工作缓冲区大小(中间计算用)
//   inputsize - 输入缓冲区大小(存放输入图像)
//   outputsize- 输出缓冲区大小(存放推理原始结果)

3.2.3 分配 NPU 专用内存

xmedia_svp_cfg svp_cfg;
xmedia_svp_get_config(&svp_cfg);

svp_cfg.reuse_type = XMEDIA_SVP_MEM_TYPE_BLOCK;  // 分块复用模式

// 分配工作缓冲区(NPU 内部计算用,需要 cache 属性)
sample_mmz_alloc_and_map_cache(
    XMEDIA_NULL, "npu_work_mem",
    &svp_cfg.workbuf_reuse_mem.phyaddr,   // 物理地址
    &svp_cfg.workbuf_reuse_mem.viraddr,   // 虚拟地址
    svp_cfg.workbuf_reuse_mem.size         // 大小
);

// 分配输入缓冲区(存放输入图像数据)
sample_mmz_alloc_and_map(
    XMEDIA_NULL, "npu_input_mem",
    &svp_cfg.input_reuse_mem.phyaddr,
    &svp_cfg.input_reuse_mem.viraddr,
    svp_cfg.input_reuse_mem.size
);

// 分配输出缓冲区(存放推理原始结果)
sample_mmz_alloc_and_map_cache(
    XMEDIA_NULL, "npu_output_mem",
    &svp_cfg.output_reuse_mem.phyaddr,
    &svp_cfg.output_reuse_mem.viraddr,
    svp_cfg.output_reuse_mem.size
);

// 将内存配置设给 SVP
xmedia_svp_set_config(&svp_cfg);

3.3 创建推理任务

将模型配置和内存准备好后,创建 SVP 任务(此时模型真正加载到 NPU):

xmedia_s32 svp_handle;
ret = xmedia_svp_task_create(&svp_handle, task_cfg);
if (ret != XMEDIA_SUCCESS) {
    printf("xmedia_svp_task_create failed!\n");
    return XMEDIA_FAILURE;
}
// svp_handle 是后续所有推理操作的句柄

核心概念:一个 svp_handle 代表一路完整的推理流程,包含模型加载、前后处理等全部资源。


3.4 设置推理参数

创建任务后,可以调整推理参数(阈值、追踪等):

// YOLOv5 检测属性
xmedia_svp_yolov5_attr yolov5_attr;

yolov5_attr.detect_threshold     = 0.65f;   // 检测置信度阈值(低于此值的目标被丢弃)
yolov5_attr.classifier_threshold = 0.8f;    // 分类器置信度阈值
yolov5_attr.iou_threshold        = 0.5f;    // NMS 交并比阈值(重叠框过滤)
yolov5_attr.max_target_num       = 10;      // 单帧最大目标数(不超过 50)
yolov5_attr.bytetrack_enable     = XMEDIA_TRUE;  // 启用 ByteTrack 目标追踪
yolov5_attr.motionless_filter_enable = XMEDIA_TRUE; // 启用运动状态检测
yolov5_attr.stillness_thres      = 0.9f;    // 静止判定灵敏度
yolov5_attr.movement_fps_thres   = 5;       // 连续帧阈值
yolov5_attr.smart_venc_enable    = XMEDIA_FALSE; // 智能编码
yolov5_attr.smart_ae_enable      = XMEDIA_FALSE; // 智能曝光

ret = xmedia_svp_task_set_attr(svp_handle, &yolov5_attr);

参数调优建议:

参数建议值调高效果调低效果
detect_threshold0.65漏检增加,误检减少漏检减少,误检增加
iou_threshold0.5保留更多重叠框合并更多重叠框
max_target_num10处理更多目标,耗时略增限制目标数,性能更稳
bytetrack_enableTRUE跨帧追踪,输出 tracker_id仅单帧检测,无追踪

3.5 启动推理线程

初始化完成后,启动独立线程进入推理循环:

// sample_svp_info 结构体保存了所有运行时信息
sample_svp_info svp_info;
svp_info.detect_type = SAMPLE_SVP_ALG_TYPE_PERSON;
svp_info.svp_handle  = svp_handle;
svp_info.vpss_pipe   = vpss_pipe;
svp_info.vpss_ochn[1] = small_channel;  // 小图通道
svp_info.venc_chn[1]  = venc_channel;    // 编码通道
svp_info.big_stream   = XMEDIA_FALSE;

g_svp_start_flag = XMEDIA_TRUE;

// 创建推理线程
pthread_create(&g_svp_thread, NULL, sample_svp_proc, &svp_info);

4. 帧获取与推理循环

sample_svp_proc() 是推理的主循环线程,不断从 VPSS 取帧、送 NPU 推理、处理结果。

4.1 获取摄像头帧

// sample_svp_main.c → sample_svp_proc()

while (g_svp_start_flag == XMEDIA_TRUE) {
    xmedia_video_frame_info video_frame;
    xmedia_s32 milli_sec = 20000;  // 超时 20 秒

    // 从 VPSS 获取一帧小图(640×360)
    ret = xmedia_vpss_acquire_ochn_frame(
        svp_info->vpss_pipe,       // VPSS 管道
        svp_info->vpss_ochn[1],    // 输出通道 1(小图)
        &video_frame,              // 输出帧信息
        milli_sec                  // 超时时间
    );
    if (ret != XMEDIA_SUCCESS) {
        printf("get vpss small frame failed!\n");
        continue;  // 取帧失败,重试
    }

video_frame 包含的关键信息:

video_frame (xmedia_video_frame_info)
  ├── frame.width            = 640
  ├── frame.height           = 360
  ├── frame.addr.y_phy_addr  → Y 分量物理地址
  ├── frame.addr.uv_phy_addr → UV 分量物理地址
  ├── frame.pixel_format     = YUV420SP
  └── pool_id                → VB 缓冲池 ID

注意:帧数据在物理内存中,不需要拷贝。NPU 通过物理地址直接访问。


4.2 提交 NPU 推理

将帧打包为 NPU 输入格式并提交推理:

    // 打包输入
    xmedia_svp_task_input task_input;
    xmedia_video_frame_info frame_info[2];

    frame_info[0] = video_frame;       // 第 0 帧 = 小图
    task_input.frame_num = 1;           // 单帧输入
    task_input.frame = frame_info;

    // 如果需要大图(如车牌识别需要 1920×1080)
    if (svp_info->big_stream == XMEDIA_TRUE) {
        xmedia_video_frame_info video_frame_big;
        ret = xmedia_vpss_acquire_ochn_frame(
            svp_info->vpss_pipe, svp_info->vpss_ochn[2],
            &video_frame_big, milli_sec
        );
        frame_info[1] = video_frame_big;  // 第 1 帧 = 大图
        task_input.frame_num = 2;          // 双帧输入
    }

    // ★★★ 核心:提交推理(同步阻塞调用)★★★
    xmedia_svp_yolov5_output result = {0};
    ret = xmedia_svp_task_process(
        svp_info->svp_handle,   // SVP 任务句柄
        &task_input,            // 输入帧
        &result                 // 输出检测结果
    );
    if (ret != XMEDIA_SUCCESS) {
        printf("xmedia_svp_task_process failed!\n");
    }

4.3 解析检测结果

推理返回后,result 中已经包含了结构化的检测结果:

    if (result.target_num > 0) {
        xmedia_video_rect target_rect[XMEDIA_SVP_MAX_TARGET_NUM];

        for (xmedia_s32 i = 0; i < result.target_num; i++) {
            // 目标边界框(浮点坐标,对应 640×360 图像)
            xmedia_float x1 = result.targets[i].rect.x1;
            xmedia_float y1 = result.targets[i].rect.y1;
            xmedia_float x2 = result.targets[i].rect.x2;
            xmedia_float y2 = result.targets[i].rect.y2;

            // 对齐到偶数像素(硬件要求)
            xmedia_s32 px1 = (xmedia_s32)roundf(x1 / 2) * 2;
            xmedia_s32 py1 = (xmedia_s32)roundf(y1 / 2) * 2;
            xmedia_s32 px2 = (xmedia_s32)roundf(x2 / 2) * 2;
            xmedia_s32 py2 = (xmedia_s32)roundf(y2 / 2) * 2;

            // 目标类别
            xmedia_svp_class_type cls = result.targets[i].class_type;
            // 例如:XMEDIA_SVP_CLASS_TYPE_PERSON

            // 置信度 (0.0 ~ 1.0)
            xmedia_float score = result.targets[i].detect_score;

            // 追踪 ID(启用 ByteTrack 时有效)
            xmedia_s32 tracker_id = result.targets[i].tracker_id;

            // 运动状态
            xmedia_svp_motion_state motion = result.targets[i].motion_state;
            // XMEDIA_SVP_MOTION_STATE_STATIC  = 静止
            // XMEDIA_SVP_MOTION_STATE_MOVING  = 运动

            // 构造画框用的矩形
            target_rect[i].x      = px1;
            target_rect[i].y      = py1;
            target_rect[i].width  = ABS(px2 - px1);
            target_rect[i].height = ABS(py2 - py1);
        }

4.4 画框与送编码

        // 步骤 1:用 VGS 硬件在帧上画检测框(红色矩形)
        sample_svp_draw(&target_rect[0], &video_frame, result);

        // 步骤 2(可选):叠加 OSD 文字信息
        // 需要编译时定义 USE_OSD
        #ifdef USE_OSD
        xmedia_char info_text[64];
        snprintf(info_text, sizeof(info_text),
            "id[%d]scr[%.2f]cls[%.2f]mv[%d]",
            result.targets[0].tracker_id,
            result.targets[0].detect_score,
            result.targets[0].classfier_score,
            result.targets[0].motion_state);
        sample_target_osd(&video_frame, px1, py1, info_text);
        #endif

    }  // end if (result.target_num > 0)

    // 步骤 3:将画好框的帧送给视频编码器
    ret = xmedia_venc_send_frame(
        svp_info->venc_chn[1],
        &video_frame,
        milli_sec
    );

    // 步骤 4:释放帧缓冲(归还给 VPSS)
    ret = xmedia_vpss_release_ochn_frame(
        svp_info->vpss_pipe,
        svp_info->vpss_ochn[1],
        &video_frame
    );

}  // end while → 回到循环开头,取下一帧

5. 关键数据结构

5.1 模型配置

// 单个模型的配置(xmedia_svp.h:173-180)
typedef struct {
    xmedia_svp_model_type      load_mode;    // 加载方式(文件/内存)
    xmedia_svp_inputdata_format format;      // 输入格式(RGB888/YUV420SP)
    xmedia_char               *pathname;     // 模型文件路径
    xmedia_u8                 *buf;          // 内存模式的模型数据
    xmedia_u32                 len;          // 内存模式的模型长度
    xmedia_svp_alg_type        alg_type;     // 算法类型
    xmedia_void               *priv;         // 私有数据
} xmedia_svp_modules;

// 任务配置(xmedia_svp.h:182-187)
typedef struct {
    xmedia_svp_task_type  task_type;    // 任务类型
    xmedia_svp_modules   *modules;      // 模型数组
    xmedia_u8             module_num;   // 模型数量
    xmedia_void          *priv;         // 私有数据
} xmedia_svp_task_cfg;

5.2 推理输入

// 任务输入(xmedia_svp.h:167-170)
typedef struct {
    xmedia_video_frame_info *frame;    // 帧数组
    xmedia_u8                frame_num; // 帧数量(1=单帧, 2=双帧)
} xmedia_svp_task_input;

5.3 检测结果

// YOLOv5 检测输出(xmedia_svp.h:239-242)
typedef struct {
    xmedia_u32  target_num;                                       // 检测到的目标数量
    xmedia_svp_detect_result targets[XMEDIA_SVP_MAX_TARGET_NUM];  // 目标数组(最多50)
} xmedia_svp_yolov5_output;

// 单个检测结果(xmedia_svp.h:116-127)
typedef struct {
    xmedia_svp_alg_type    alg_type;        // 算法类型
    xmedia_svp_class_type  class_type;      // 目标类别
    xmedia_float           detect_score;    // 检测置信度 (0.0~1.0)
    xmedia_float           classfier_score; // 分类置信度 (0.0~1.0)
    xmedia_s32             tracker_id;      // 追踪 ID
    xmedia_u32             tracker_age;     // 追踪年龄(存活帧数)
    xmedia_svp_rect        rect;            // 边界框坐标 (x1,y1,x2,y2)
    xmedia_bool            special_target;  // 是否特殊目标
    xmedia_float           distance;        // 目标距离
    xmedia_svp_motion_state motion_state;   // 运动状态
} xmedia_svp_detect_result;

// 边界框坐标(xmedia_svp.h:102-108)
typedef struct {
    xmedia_float x1;   // 左上角 X
    xmedia_float y1;   // 左上角 Y
    xmedia_float x2;   // 右下角 X
    xmedia_float y2;   // 右下角 Y
} xmedia_svp_rect;

5.4 推理参数

// YOLOv5 检测参数(xmedia_svp.h:225-237)
typedef struct {
    xmedia_float detect_threshold;           // 置信度阈值,建议 0.65
    xmedia_float classifier_threshold;       // 分类器阈值,建议 0.8
    xmedia_float iou_threshold;              // NMS IOU 阈值,建议 0.5
    xmedia_u32   max_target_num;             // 最大目标数,最大 50
    xmedia_bool  bytetrack_enable;           // 目标追踪开关
    xmedia_bool  motionless_filter_enable;   // 运动状态检测开关
    xmedia_float stillness_thres;            // 静止灵敏度,建议 0.9
    xmedia_u8    movement_fps_thres;         // 连续帧阈值,建议 5
    xmedia_bool  smart_venc_enable;          // 智能编码开关
    xmedia_bool  smart_ae_enable;            // 智能曝光开关
} xmedia_svp_yolov5_attr;

6. 支持的算法类型

6.1 单模型检测

算法类型枚举值模型文件任务类型
人形检测XMEDIA_SVP_ALG_TYPE_PERSONgnn_person_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
人脸检测XMEDIA_SVP_ALG_TYPE_FACEgnn_face_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
车形检测XMEDIA_SVP_ALG_TYPE_CARgnn_car_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
宠物检测XMEDIA_SVP_ALG_TYPE_PETgnn_pet_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
人头检测XMEDIA_SVP_ALG_TYPE_HEADgnn_head_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
非机动车XMEDIA_SVP_ALG_TYPE_NON_MOTORIZED_VEHICLEgnn_nocar_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
烟火检测XMEDIA_SVP_ALG_TYPE_FIREWORKSgnn_fireworks_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT
包裹检测XMEDIA_SVP_ALG_TYPE_PACKAGEgnn_package_detect_640x360_rgb888hwc.binXMEDIA_SVP_TASK_DETECT

6.2 多模型级联

算法类型任务类型模型数量说明
人体关键点XMEDIA_SVP_TASK_DETECT_AND_KEYPOINT1检测人形 + 关键点
手势识别XMEDIA_SVP_TASK_GESTURE2手部检测 + 手势分类
人脸表情XMEDIA_SVP_TASK_EMOTION_CLASSIFITION3人脸检测 + 关键点 + 表情分类
人脸识别XMEDIA_SVP_TASK_FACE_RECOGNITON3人脸检测 + 关键点 + 特征提取
二阶段检测XMEDIA_SVP_TASK_RCNN2初检测 + 精细化
ADASXMEDIA_SVP_TASK_ADAS5车+人+非机动车+车牌+车道线
DMSXMEDIA_SVP_TASK_DMS多个人脸 + 疲劳 + 手机 + 香烟
车牌识别XMEDIA_SVP_TASK_PLATE多个车牌检测 + 字符识别
车辆识别XMEDIA_SVP_TASK_VEHICLE多个车辆检测 + 颜色/类型识别

6.3 输出类别

// 检测结果的目标类别枚举(xmedia_svp.h:62-89)
typedef enum {
    XMEDIA_SVP_CLASS_TYPE_PERSON,               // 人形
    XMEDIA_SVP_CLASS_TYPE_FACE,                 // 人脸
    XMEDIA_SVP_CLASS_TYPE_CAR,                  // 车辆
    XMEDIA_SVP_CLASS_TYPE_PET,                  // 宠物
    XMEDIA_SVP_CLASS_TYPE_HEAD,                 // 人头
    XMEDIA_SVP_CLASS_TYPE_ELECTRIC_BICYCLE,     // 电瓶车
    XMEDIA_SVP_CLASS_TYPE_MASK,                 // 口罩
    XMEDIA_SVP_CLASS_TYPE_BIKE,                 // 自行车
    XMEDIA_SVP_CLASS_TYPE_BIKER,                // 骑自行车的人
    XMEDIA_SVP_CLASS_TYPE_MOTOR,                // 摩托车
    XMEDIA_SVP_CLASS_TYPE_MOTORER,              // 骑摩托车的人
    XMEDIA_SVP_CLASS_TYPE_TRICYCLE,             // 三轮车
    XMEDIA_SVP_CLASS_TYPE_TRICYCLER,            // 骑三轮车的人
    XMEDIA_SVP_CLASS_TYPE_FIREWORKS_FIRE,       // 火焰
    XMEDIA_SVP_CLASS_TYPE_FIREWORKS_SMOKE,      // 烟雾
    XMEDIA_SVP_CLASS_TYPE_PACKAGE,              // 包裹
} xmedia_svp_class_type;

7. 模型文件说明

7.1 模型文件格式

NPU 使用 .bin 格式的专用模型文件,命名规则:

gnn_<算法>_<输入分辨率>_<输入格式>_<版本号>_<日期>.bin

示例:

gnn_person_detect_640x360_rgb888hwc_v0103_20251203.bin
 │        │         │       │        │       │
 │        │         │       │        │       └─ 日期:2025-12-03
 │        │         │       │        └─ 版本:v01.03
 │        │         │       └─ 输入格式:RGB888 HWC 排列
 │        │         └─ 输入分辨率:640×360
 │        └─ 功能:人形检测
 └─ 前缀:GNN(通用神经网络)

7.2 模型转换流程

模型转换流程图

注意:.bin 文件是经过量化和编译的 NPU 专用格式,无法直接用原始的 .pt 或 .onnx 文件推理。


8. 多模型级联示例

以人脸识别为例,展示多模型级联的使用方式:

// 人脸识别需要 3 个模型级联
xmedia_svp_modules modules[3];

// 模型 1:人脸检测(定位人脸位置)
modules[0].alg_type  = XMEDIA_SVP_ALG_TYPE_FACE;
modules[0].load_mode = XMEDIA_SVP_MODEL_FILE;
modules[0].format    = XMEDIA_SVP_INPUTDATA_FORMAT_RGB888;
modules[0].pathname  = "./model/gnn_face_detect_640x360_rgb888hwc_v0103_20251209.bin";

// 模型 2:人脸关键点(定位 5 个面部特征点)
modules[1].load_mode = XMEDIA_SVP_MODEL_FILE;
modules[1].format    = XMEDIA_SVP_INPUTDATA_FORMAT_RGB888;
modules[1].pathname  = "./model/gnn_face_keypoint_48x48_rgb888hwc_v0101_20250818.bin";

// 模型 3:人脸特征提取(生成 512 维特征向量)
modules[2].load_mode = XMEDIA_SVP_MODEL_FILE;
modules[2].format    = XMEDIA_SVP_INPUTDATA_FORMAT_RGB888;
modules[2].pathname  = "./model/gnn_face_recognition_112x112_rgb888hwc_v0101_20250818.bin";

task_cfg.module_num = 3;
task_cfg.task_type  = XMEDIA_SVP_TASK_FACE_RECOGNITON;
task_cfg.modules    = modules;

// 创建任务
xmedia_svp_task_create(&handle, task_cfg);

推理调用方式相同,SDK 内部自动完成级联:

// 推理调用与单模型完全一致
xmedia_svp_fr_output fr_output = {0};
ret = xmedia_svp_task_process(handle, &task_input, &fr_output);

// fr_output.face_num     → 检测到的人脸数量
// fr_output.fr_result[i] → 每个人脸的 512 维特征向量 + 坐标

9. 内存管理策略

9.1 内存复用模式

SDK 支持三种内存复用模式以节省内存:

typedef enum {
    XMEDIA_SVP_MEM_TYPE_BLOCK,       // 分块复用(推荐)
    XMEDIA_SVP_MEM_TYPE_AINR_SHARE,  // 与 AINR 共享
    XMEDIA_SVP_MEM_TYPE_COMPLETE,    // 完全独立
} xmedia_svp_mem_reuse_type;

9.2 生命周期管理

应用启动
  │
  ├── xmedia_svp_init()                   // 初始化 SVP
  ├── xmedia_cl_graph_query_model_info()  // 查询内存需求
  ├── MMZ 分配 (work/input/output)        // 分配物理连续内存
  ├── xmedia_svp_set_config()             // 配置内存
  ├── xmedia_svp_task_create()            // 创建任务(加载模型)
  │
  │   ┌── while 循环 ──────────────────┐
  │   │  acquire_frame → task_process  │  // 推理循环
  │   │  → draw → venc → release_frame │
  │   └────────────────────────────────┘
  │
  ├── xmedia_svp_task_destroy()           // 销毁任务(卸载模型)
  ├── MMZ 释放 (work/input/output)        // 释放内存
  └── xmedia_svp_uninit()                 // 反初始化 SVP

9.3 MMZ 内存操作

// 分配物理连续内存
xmedia_u64 phy_addr = xmedia_mmz_alloc("mmz_name", "buf_name", size);

// 映射到用户空间虚拟地址
void *virt_addr = xmedia_mmz_map(phy_addr, size, cache_enabled);

// 访问内存(读写)
memcpy(virt_addr, src, size);

// 解除映射
xmedia_mmz_unmap(virt_addr);

// 释放物理内存
xmedia_mmz_free(phy_addr);

10. 常见问题与调试

10.1 推理返回失败

错误现象可能原因解决方法
xmedia_svp_task_process 返回非 0模型文件损坏或不存在检查 .bin 文件路径和权限
推理偶发失败帧获取超时增大 milli_sec 超时时间
内存分配失败MMZ 空间不足检查 mmz 配置,减小 buffer 大小
目标数为 0置信度阈值过高降低 detect_threshold

10.2 性能调优

// 开启耗时统计(编译时定义 SAMPLE_TIME_DEBUG)
#define SAMPLE_TIME_DEBUG 1

// 推理耗时打印
TIME_COST_START();
xmedia_svp_task_process(handle, &input, &result);
TIME_COST_END();
TIME_COST_PRINT("svp process all");
// 输出示例: svp process all cost time: 25000 us

10.3 YUV 文件离线测试

当没有摄像头时,可以使用 YUV 文件作为输入进行离线测试:

// 编译时定义 READ_YUV
#define READ_YUV

// 推理线程会自动从 ./yuv_dir/ 目录读取 .yuv 文件
// 文件分辨率需要与模型输入匹配(如 640×360 的 YUV420SP)

10.4 OSD 文字叠加

需要在编译时定义 USE_OSD 宏,并链接 canvas 和 canvas_font 库:

#ifdef USE_OSD
xmedia_char text[64];
snprintf(text, sizeof(text), "id[%d] score[%.2f]", id, score);
sample_target_osd(&video_frame, x, y, text);
#endif

11. API 速查表

11.1 SVP 生命周期 API

API功能调用时机
xmedia_svp_init()初始化 SVP 子系统应用启动时,仅一次
xmedia_svp_uninit()反初始化 SVP应用退出时
xmedia_svp_set_config()设置 SVP 内存配置创建任务前
xmedia_svp_get_config()获取 SVP 内存配置分配内存前
xmedia_svp_task_create()创建推理任务加载模型
xmedia_svp_task_destroy()销毁推理任务卸载模型
xmedia_svp_task_set_attr()设置任务属性创建后任意时间
xmedia_svp_task_get_attr()获取任务属性任意时间
xmedia_svp_task_process()执行推理循环调用
xmedia_svp_get_version()获取 SVP 版本任意时间

11.2 帧管理 API

API功能
xmedia_vpss_acquire_ochn_frame()从 VPSS 获取帧(阻塞等待)
xmedia_vpss_release_ochn_frame()释放帧(归还缓冲池)
xmedia_venc_send_frame()将帧送给编码器

11.3 绘制 API

API功能
xmedia_vgs_init()初始化 VGS
xmedia_vgs_create_job()创建 VGS 任务
xmedia_vgs_add_task_cover()添加画框任务
xmedia_vgs_add_task_line()添加画线任务
xmedia_vgs_add_task_osd()添加 OSD 叠加任务
xmedia_vgs_add_task_scale()添加缩放任务
xmedia_vgs_submit_job()提交 VGS 任务
xmedia_vgs_wait_job()等待 VGS 完成
xmedia_vgs_cancel_job()取消 VGS 任务

11.4 内存管理 API

API功能
xmedia_mmz_alloc()分配物理连续内存
xmedia_mmz_map()映射到虚拟地址
xmedia_mmz_unmap()解除虚拟地址映射
xmedia_mmz_free()释放物理内存

附录:关键源文件索引

文件路径说明
source/gmp/include/xmedia_svp.hSVP API 定义(所有结构体和函数声明)
sample/npu/demo_ai/sample_svp_main.cSVP视频开发完整示例(主流程)
sample/npu/demo_ai/sample_svp_main.h示例头文件(类型定义)
source/gmp/usr/svp/src/post_process/yolov5.cYOLOv5 后处理实现
source/gmp/usr/svp/src/post_process/yolov5.hYOLOv5 后处理头文件
sample/npu/demo_ai/model/模型文件目录
source/gmp/include/xmedia_mmz.hMMZ 内存管理 API
source/gmp/include/xmedia_vgs.hVGS 图形绘制 API

在 GitHub 上编辑此页
上次更新:
贡献者: ljh
Prev
02 .xmm 模型加载
Next
04 AI降噪 (AI_NR)