11 综合快速演示应用
本章节介绍 GK7206 的综合快速演示应用示例 —— sample_quickstart。该应用演示了端到端的完整 AI 视觉管线,包括视频采集、VPSS 处理、VENC 编码、NPU 人脸检测以及 Web 展示。
应用源码位于 SDK 目录 sample/quickstart/,是一个快速上手的综合示例,适合了解 GK7206 的完整功能。
1 应用概述
1.1 功能特性
- 端到端 pipeline:采集+VPSS+VENC+NPU 检测
- 实时人脸检测:基于 NPU 的人体检测模型
- Web 可视化:内嵌 HTTP 服务器,浏览器直接查看
- RTSP 推流:支持 RTSP 拉流
- 检测结果叠加:在视频流上叠加检测框
1.2 技术参数
| 参数 | 值 |
|---|---|
传感器分辨率 | 2560 × 1440(SC465SL) |
检测输入分辨率 | 640 × 360 |
NPU 推理帧率 | ~15 FPS |
Web 服务端口 | 80 |
视频编码格式 | MJPEG |
模型格式 | .xmm(GK7206 NPU 专用格式) |
1.3 目录结构
sample/quickstart/
├── Makefile # 构建脚本
├── sample_quickstart.c # 主程序
└── models/ # NPU 模型文件(需单独下载)
└── person_detect.xmm # 人体检测模型2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- NPU 模型准备:需将人体检测模型放到
models/目录 - Sensor 已连接:需连接 SC465SL 或兼容的图像传感器
2.2 编译应用
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 quickstart 示例
make -C quickstart clean && make -C quickstart2.3 部署到板端
# 挂载 SD 卡(推荐)
mkdir -p /sd_card
mount -t vfat /dev/mmcblk1p1 /sd_card
# 使用 SCP 传输到开发板
scp sample/quickstart/sample_quickstart root@<板端IP>:/sd_card/
# 传输 NPU 模型
scp -Or sample/quickstart/models root@<板端IP>:/sd_card/2.4 运行应用
# 添加执行权限
chmod +x /sd_card/sample_quickstart
# 进入 SD 卡目录
cd /sd_card
# 运行
./sample_quickstart2.5 预期输出
成功运行后,终端会输出类似以下信息:
sample_quickstart running
sensor: 2560x1440 @ 30fps
npu: Initializing...
npu: Loading person_detect.xmm
npu: Model loaded!
pipeline: VI→VPSS→VENC(MJPEG) + VPSS→NPU(640x360)
web: http://192.168.1.100/
rtsp://192.168.1.100:554/livestream/0浏览器访问 http://<板端IP>/ 可以看到实时的人脸检测画面。
3 内部执行逻辑详解
3.1 应用架构
本应用采用以下架构:
Sensor → VI → VPSS → VENC(MJPEG) → Web 展示
↓
NPU 推理 → 检测结果叠加3.2 初始化流程
// 步骤 1:初始化视频管线
sample_comm_sys_init(&sys_config);
sample_comm_isp_init();
sample_comm_vi_start(...);
sample_comm_vpss_start(...);
sample_comm_venc_start(...);
// 步骤 2:初始化 NPU
init_npu();
// 步骤 3:启动 NPU 推理线程
pthread_create(&npu_thread, NULL, npu_inference_thread, NULL);
// 步骤 4:启动 Web 服务器
web_server_run();4 关键编程要点
4.1 NPU 模型加载
xmedia_cl_graph graph;
xmedia_u64 work_phy, weight_phy;
void *work_buf, *weight_buf;
// 查询模型所需内存大小
xmedia_cl_graph_querysize_from_file("models/person_detect.xmm",
&worksize, &weightsize);
// 分配 MMZ 内存
work_buf = xmedia_mmz_alloc_map("npu_work", &work_phy, worksize);
weight_buf = xmedia_mmz_alloc_map("npu_weight", &weight_phy, weightsize);
// 加载模型
xmedia_cl_graph_loadmodel_from_file_withmem(&ctx, "models/person_detect.xmm",
work_buf, worksize, weight_buf, weightsize, &graph);4.2 推理循环
void *npu_inference_thread(void *arg)
{
while (running) {
// 从 VPSS 获取帧
xmedia_vpss_acquire_ochn_frame(pipe, ochn, &frame, timeout);
// 前处理(YUV → RGB)
yuv420sp_to_rgb888(frame.y_vir, frame.c_vir, rgb_buf, width, height);
// NPU 推理
xmedia_cl_graph_process(graph);
// 后处理(解析检测结果)
parse_detections(output_buf, &detections);
// 释放帧
xmedia_vpss_release_ochn_frame(pipe, ochn, &frame);
}
}5 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
svp create fail | NPU 模型文件缺失或格式错误 | 检查模型文件是否存在且格式正确 |
| 检测结果不准 | 模型输入图像格式错误 | 检查 YUV→RGB 转换是否正确 |
| 内存不足(OOM) | 26 MB 跑 NPU+视频编码易 OOM | 挂载 SD 卡,释放内存 |
