InspireFaceInspireFace1.2.4.d3
首页
快速开始
获取和编译
完整示例
  • English
  • 简体中文
GitHub
首页
快速开始
获取和编译
完整示例
  • English
  • 简体中文
GitHub
  • 介绍
  • 快速开始
  • 功能概览
  • 使用指南

    • 架构与生命周期
    • 模型资源包
    • 图像输入与坐标
    • 会话与跟踪
    • 人脸分析
    • 识别与特征库
    • 人脸关键点
    • 活体检测
    • 人脸抓拍
    • 补充 API 示例
  • 语言与平台

    • C API
    • C++
    • Python
    • Android
    • Apple
    • iOS
    • macOS
    • HarmonyOS
  • 获取和编译

    • 概述与下载
    • 源码准备与通用选项
    • Linux
    • macOS
    • Android
    • iOS
    • HarmonyOS
    • NVIDIA TensorRT
    • Rockchip NPU
    • Python 打包
  • 硬件部署

    • ARM
    • NVIDIA TensorRT
    • Rockchip NPU
    • Rockchip 上的 Python
  • InspireCV
  • 完整示例
  • API 功能索引
  • 性能测量
  • 图像处理性能
  • 常见问题

图像处理与预处理性能

InspireCV 的性能测试覆盖图像操作,以及从相机像素到模型输入张量的转换。这里统计的是推理前的处理耗时。人脸检测、跟踪和特征提取的测试见 InspireFace 性能测试。

本页选取三组数据:CPU 图像处理、Task 融合预处理,以及中间结果保留在显存中的连续图像操作。所有耗时单位均为 微秒(µs),1,000 µs 等于 1 ms。

CPU 图像处理

测试使用 AMD Ryzen 5 5600、Ubuntu 22.04 / Linux 6.8、GCC 11.4,以及构建日期为 2026-08-16 的 InspireCV 1.0.1 Release 版本,启用 AVX2。进程绑定到逻辑 CPU 2。OpenCV 5.0.0 使用单线程,关闭 IPP、OpenCL 和 TBB。

输入为固定规则生成的像素。Image 统计公开接口调用中的输出内存分配;Task 复用 Pipeline 和输出缓冲区。每轮预热 10 次、计时 101 次,两套库交替执行。表中数值取 7 轮 P50 的中位数。

OperationInput → outputInspireCV P50 (µs)OpenCV P50 (µs)
Image nearest resize, u8 C3224×224 → 112×1127.20310.780
Image rotate90, u8 C31920×1080 → 1080×1920635.4353,133.380
Image horizontal flip, u8 C31920×1080 → 1920×1080252.8762,171.303
Image SwapRB, u8 C31920×1080 → 1920×1080142.828172.565
Image erode3, u8 C11920×1080 → 1920×1080398.710129.714
Task BGR u8 → RGB f32 CHW224×224 → 224×22477.37594.978
Task BGR u8 → RGB f32 HWC224×224 → 224×22428.56414.517

表中各项输出的字节或浮点位模式均一致。Task 包含通道转换和归一化。这组数据中,旋转、水平翻转在 InspireCV 上更快;腐蚀和 HWC 输出在 OpenCV 上更快。比较时选择应用实际使用的操作和张量布局。

完整的 91 项 CSV 还记录了 P95、多轮波动和输出精度。两套库在线性插值、仿射采样和部分滤波配置上采用不同计算规则,相应数据标为 different_contract。CPU 测试说明 中还有完整方法、Apple M4 数据和 SSE4.1 / AVX2 对比。

运行 CPU 对比

在 InspireCV 项目目录中执行以下命令,先安装 OpenCV 的 core、imgproc 开发库,并将 OpenCV_DIR 改为实际安装位置。下面的 AVX2 选项与 Ryzen 测试配置一致,要求 x86 CPU 支持 AVX2。

cmake -S . -B build-cpu-benchmark \
  -DCMAKE_BUILD_TYPE=Release \
  -DINSPIRECV_BUILD_CPU_BENCHMARKS=ON \
  -DINSPIRECV_ENABLE_AVX2=ON \
  -DOpenCV_DIR=/path/to/opencv/lib/cmake/opencv5
cmake --build build-cpu-benchmark --target inspirecv_cpu_benchmark --parallel 4

for run in 1 2 3 4 5 6 7; do
  taskset -c 2 ./build-cpu-benchmark/inspirecv_cpu_benchmark \
    --suite matrix --samples 101 --warmups 10 --opencv-threads 1 \
    --machine local_cpu --report "matrix_run${run}.csv"
done

python3 scripts/cpu_benchmark_opencv_summary.py \
  --reports matrix_run{1,2,3,4,5,6,7}.csv \
  --candidate-label inspirecv --output matrix_summary.csv

taskset 用于 Linux 的 CPU 绑定,macOS 上去掉这部分即可;ARM 平台还需去掉 AVX2 选项。Apple 的 GCD 负责管理 OpenCV 线程数,因此应同时记录请求值和实际线程数,测试程序会把两者写入 CSV 表头。使用 --suite full 运行较短的一组测试,或使用 --suite u8c3 测试几何变换和通道交换。

CUDA Task 预处理

以下数据测于 2026-08-16,使用 RTX 3060 12 GiB、Ryzen 5 5600、CUDA 12.2、NVIDIA 驱动 550.144.03、Linux 6.8 和 GCC 11.4,采用 Release 构建。保存的 CSV 中,InspireCV 构建版本记为 1.0.0。

Task 将紧密排列的 BGR uint8 输入转换为归一化后的 RGB float32 CHW 张量,采用双线性采样,每个通道按 (value - 127.5) / 128 归一化。CUDA 耗时包含普通主机内存的上传、预处理和结果下载;输入创建不计时。P50、P95 来自 预热 10 次后的 101 次采样,CPU 与 CUDA 输出逐位一致。

Input → tensorCPU P50 / P95 (µs)CUDA round-trip P50 / P95 (µs)
112×112 → 112×112, identity19.407 / 19.47751.649 / 53.472
640×480 → 112×112172.469 / 175.796132.793 / 133.625
1920×1080 → 224×224686.318 / 690.076509.962 / 515.122
2560×1440 → 224×224686.118 / 689.213807.780 / 812.408
3840×2160 → 640×6405,718.820 / 5,806.6872,244.447 / 2,387.390

输出尺寸固定时,输入越大,上传开销越高。因此 2560×1440 → 224×224 这一项的 CUDA 总耗时超过了 CPU。小尺寸的 identity 转换也会出现类似情况:上传、下载和调度开销超过了计算部分节省的时间。

Task 原始报告 包含完整的输入、输出尺寸组合。这组测试用于制定默认 Auto 选择规则:测得的 CUDA P50 至少快 15%,同时 P95 不高于 CPU。CUDA 测试说明 列出了选择范围,以及另外一轮针对 Auto 本身的验证数据。

运行 CUDA 对比

构建需要 CMake 3.18 或更新版本及 CUDA Toolkit。86 对应 RTX 3060,其他 GPU 请设置相应架构。

cmake -S . -B build-cuda \
  -DCMAKE_BUILD_TYPE=Release \
  -DINSPIRECV_BUILD_TESTS=ON \
  -DINSPIRECV_ENABLE_CUDA=ON \
  -DINSPIRECV_CUDA_ARCHITECTURES=86
cmake --build build-cuda --target inspirecv_tests --parallel 4

INSPIRECV_CUDA_THRESHOLD_SAMPLES=101 \
INSPIRECV_CUDA_THRESHOLD_REPORT=task_host.csv \
  ./build-cuda/inspirecv_tests task_cuda_host_auto_threshold_benchmark

./build-cuda/inspirecv_tests task_cuda_auto_dispatch_performance

第一条测试命令保存 CPU / CUDA 测量结果;第二条检查 Auto 是否选择并执行预期后端。运行测试的机器需要可用的 NVIDIA 驱动和 CUDA 设备。

在显存中连续处理图像

多个图像操作可以共享显存中的中间结果。这组测试从三通道 uint8 图像开始,依次执行 双线性缩放至原宽高的 ¾ → 在缩放后尺寸上做一般仿射变换 → rotate90。

存档数据采用前述 RTX 3060 / Ryzen 5 5600 机器和 CUDA 12.2 配置。每轮预热 5 次、采样 51 次,表中数值取 3 轮中位数的中位数。报告收录于 InspireCV 1.0.2 发布记录。

SourceCPU chain (µs)CUDA 每步传输 (µs)仅上传/下载一次 (µs)Device only (µs)
640×4805,452.580444.813194.59447.459
1280×72015,809.8003,167.980497.021123.131
1920×108037,121.2006,979.8201,035.810262.962

“每步传输”会为三个操作分别上传、下载;“仅上传/下载一次”把中间图像留在 GPU,只上传输入并下载最终结果。Device only 从已有显存图像开始计时,包含三个操作完成后的同步。下载结果与 CPU 处理链逐字节一致。

如果后面接 GPU 推理,可以继续把处理后的图像和张量保留在显存中。应用需要 CPU 图像用于显示或其他处理时,将最终下载计入对应流程的耗时。三轮原始 CSV 保存了表中使用的全部数据。

使用同一份 CUDA 构建运行链式处理测试:

for run in 1 2 3; do
  INSPIRECV_DEVICE_IMAGE_BENCHMARK_SAMPLES=51 \
  INSPIRECV_DEVICE_IMAGE_BENCHMARK_REPORT="device_chain_run${run}.csv" \
    ./build-cuda/inspirecv_tests cuda_device_image_chain_benchmark
done

其他测试记录

仓库中还有以下报告,可以按应用的输入格式和执行方式选择查看。

Report测试内容
CUDA Image geometry143 组操作、类型和尺寸组合,覆盖缩放、仿射和旋转,包含主机内存传输。
CUDA YUV preprocessingNV12 转 RGB float32 CHW,采用最近邻采样,分别记录 CPU、主机往返和纯设备耗时。
CUDA Task batching320×240 BGR 显存输入转 112×112 CHW 张量,batch size 为 1、4、8、16。

比较两个 InspireCV 版本时,可使用版本对比工具。工具会成对执行两份程序、保存原始结果,并支持用同一程序做 A/A 对照。新结果中记录代码版本、构建选项和测试机器,方便下一轮复测。

编辑此页
最近更新: 2026/9/28 15:20
贡献者: Jingyu
上一页
性能测量
下一页
常见问题