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

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

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

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

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

常见问题

先用本地模型文件和一张已知图像跑通,再逐步添加分析选项、跟踪、摄像头和硬件预处理。这样更容易区分库加载问题与图像格式问题。

确认实际加载的 SDK

当前 PyPI 包已包含以下诊断接口:

import inspireface as isf

print("Python package:", isf.__version__)
print("Native SDK:", isf.version())
print("C API level:", isf.c_api_level())
print(isf.diagnostic_info())

同时检查 Python 包版本和原生 SDK 版本。如果设置了 INSPIREFACE_LIBRARY_PATH,也记录这个路径:程序会加载它指定的原生库,替代 wheel 自带的库。

1.2.4.post3 PyPI 包的原生版本为 1.2.4,C API level 为 2。旧环境使用 python -m pip install --upgrade inspireface 升级。如果 INSPIREFACE_LIBRARY_PATH 仍指向旧库,清除该设置以使用包内 CPU 库,或同时更新自定义库。更新后重新启动 Python 进程。

导入或加载库失败

现象检查内容
wrong architecture、无效 ELF 或不兼容的 Mach-O库架构须与运行进程一致,包括模拟运行或 32 位 Python。
缺少依赖的 .so 或 .dylib检查原生依赖,安装该构建所需的运行库。
更新 Python 文件后提示缺少函数将封装和原生库一起更新到配套的构建。
本机能导入,设备上失败检查 libc 兼容性、目标 ABI 和打包的依赖路径。

Linux 使用 ldd /path/to/libInspireFace.so 查看动态依赖;macOS 使用 otool -L /path/to/libInspireFace.dylib。

在首次导入前设置 INSPIREFACE_LIBRARY_PATH。修改路径后,重新启动进程以加载指定的库。

Windows Python 加载错误

PyPI 从 1.2.4.post2 开始提供 Windows x64 CPU 包。运行 python -m pip install inspireface opencv-python 即可安装,使用这个 CPU wheel 无需编译 SDK 或配置 GPU 运行环境。

Symptom检查方法
No matching distribution found使用 x64 Python 3.7 或更新版本,并确认当前包索引已有 Windows wheel。暂未提供 Windows x86 或原生 ARM64 wheel。
WinError 193 / not a valid Win32 applicationPython 和 DLL 都应为 x64;64 位 Windows 也可能安装了 32 位 Python。
WinError 126、找不到模块,或缺少 VCRUNTIME140_1.dll / MSVCP140.dll安装或修复 Microsoft Visual C++ v14 x64 运行库。DLL 文件存在时,也可能是它依赖的其他库缺失。
升级后提示找不到原生函数检查 INSPIREFACE_LIBRARY_PATH 是否仍指向自定义旧 DLL;将它与封装一起更新,或清除覆盖路径。
RuntimeError: InspireFace native library not found覆盖路径需要包含完整 .dll 文件名;使用包内库时,重新安装对应 Windows wheel。

在 PowerShell 中检查解释器,并切回包内 CPU 库:

python -c "import platform, struct, sys; print(sys.executable); print(platform.machine()); print(8 * struct.calcsize('P'))"
python -m pip show inspireface
Remove-Item Env:INSPIREFACE_LIBRARY_PATH -ErrorAction SilentlyContinue
python -c "import inspireface as isf; print(isf.__version__); print(isf.version()); print(isf.c_api_level())"

架构应为 AMD64 或 x86_64,指针位数为 64。更换库后重新启动 Python 进程或 notebook kernel。本地构建的 DLL 路径与依赖检查方法见 Python 打包。

Windows 模型路径可以写成 C:/models/Pikachu 或 r"C:\models\Pikachu",向 launch 传入资源包文件,而不是它的上层文件夹。

Java 原生库与缓冲区错误

Symptom检查方法
no InspireFaceJNI in java.library.path启动 JVM 时用 -Djava.library.path 指定原生库目录,或用 -Dinspireface.native.path 指定 JNI 库文件的绝对路径。
JNI 方法缺失或 ABI 校验失败使用同一次构建的 JAR 和原生库,替换后重新启动 JVM。
库文件存在但加载失败检查库与运行中 JVM 的架构是否一致,以及核心库依赖是否完整;arm64 系统也可能运行 x86_64 JVM。
缓冲区触发 IllegalArgumentException使用可写的 direct ByteBuffer,检查 position、limit、对齐与剩余字节数。ByteBuffer.wrap(byte[]) 创建的是堆缓冲区。
其他调用后结果发生变化在有效期内复制所需值,或保留独立快照与对应像素;只保留 ByteBuffer 引用不会保留原生内存。
Java GC 后原生内存仍未释放显式释放 Session、图像流、位图、快照和抓拍句柄。

Native 方法返回 C 状态码;InspireFaceException.check(status) 会在失败时抛出异常,getCode() 保留错误码。记录错误码和消息,方便定位问题。JNI 参数校验也可能在原生调用前抛出 IllegalArgumentException。接入和构建步骤见 Java 接入与 Java 打包。

Android 1.2.4.post1 升级与打包

Symptom检查方法
Gradle 找不到发布版本依赖使用 com.github.HyperInspire:inspireface-android-sdk:v1.2.4.post1,保留 v 前缀,并配置 JitPack 仓库。
查询版本只显示 1.2.4这是原生版本,Android 发布修订为 1.2.4.post1。日志中同时记录依赖版本、原生版本与 C API level。
Duplicate class / duplicate .so检查旧 AAR、本地 JAR、复制的 Java 类和 jniLibs;完整 AAR 已提供这些内容,每个 ABI 只保留配套的一份 SDK 库。
加载 InspireFaceJNI 失败Android 新包加载的是 InspireFace;检查是否混入旧 JAR 或 loader。桌面 JVM 仍使用单独的 JNI 库。
Debug 正常,混淆后的 Release 失败保留完整 AAR 的 consumer rules;自行打包 JAR 时按 Android 构建配置 R8/ProGuard 规则。
图像流释放后仍占用内存或再次释放出错高层创建的流用 ImageStream.close() / InspireFace.ReleaseImageStream;Native 创建的流用 Native.HFReleaseImageStream,不能混用。
旧代码读取 version.information 无法编译改用 InspireFace.QueryInspireFaceDiagnosticInformation();版本对象只读取实际声明的版本字段。

Session、ImageStream、FaceCapture 和 FaceDetectionSnapshot 都支持显式关闭。先停止工作线程,关闭抓拍与帧资源,再关闭 Session。高层复制结果与底层借用视图的区别见 Android 生命周期。

不送帧时 CPU 仍有较高占用

先确认应用已经停止提交帧,并检查相机线程或队列是否仍在循环。当前 SDK 的 CPU 推理默认使用 NORMAL;如果应用显式设置过 HIGH,在创建会话前切回 NORMAL,关闭旧会话后重新创建,再比较空闲占用、帧耗时与温度。

CPUEngine 的设置不会重新配置已初始化的运行时,也不改变模型线程数或数值精度。Java、Android 和 C++ 的调用方式见 CPU 运行策略。

Apple Framework 或相机接入失败

Symptom排查方向
No such module InspireFaceSwift将同一构建中的两个 XCFramework 都加入 Swift target;检查 Framework Search Paths,以及包内是否有目标平台和架构。
链接器报告 iOS 与 iOS Simulator 不匹配选择模拟器切片。真机 arm64 与模拟器 arm64 属于不同平台目标;使用 XCFramework 让 Xcode 自动选择。
原生符号重复移除重复的 SDK 或推理库。新版 iOS InspireFace.framework 已经包含静态推理依赖。
macOS 启动时找不到 FrameworkSwift 应用需要嵌入并签名两个动态 Framework;检查应用内的 Frameworks 目录和 runpath。命令行程序用 -rpath 指定 Framework 所在目录。
iOS Framework 嵌入或签名失败新版 iOS Framework 为静态库,选择 Do Not Embed;应用 target 的签名配置独立于 SDK 构建。
Pixel buffer 构造返回错误检查实际像素格式、每行字节数和各平面布局。带行填充的 BGRA、平面不连续的 NV12 需先重新排列,再交给借用缓冲区接口。
下一帧之后,先前结果发生变化借用指针被保留到了有效范围之外。叠加显示可复制几何数值;延后处理则保留 snapshot 与对应像素。
封装报告无效句柄检查对象或其所有者是否已经关闭。继续持有已关闭对象的强引用,不会重新打开原生句柄。

链接配置见 iOS 与 macOS。Apple API 指南提供完整的 NSError 和 Swift throws 示例。记录错误时保留 domain、数值 code 和 message。

模型启动失败

如果下载的是 ZIP 压缩包,先解压,再把模型包文件传给 SDK。核对下载文件的大小和校验值。

然后检查模型包与后端:Megatron_TRT 需要 TensorRT 构建,Gundam_* 需要对应的 Rockchip 目标。当前构建可使用 validate_resource_pack(path) 区分资源格式问题与后续会话初始化问题。

应用启动时加载一次模型。加载失败时记录错误,修正资源或环境后再创建会话。

检测不到人脸

“无人脸”是处理成功但返回空列表或零数量的正常结果。先测试清晰、正向的人脸图像,再检查:

  • 像素格式:BGR 缓冲区标为 RGB 时,数组形状可能正确,但通道顺序错误。
  • 旋转:避免先旋转像素,再让 SDK 执行一次相同修正。
  • 输入内存:行数据紧密排列、尺寸有效,缓冲区在整个处理期间保持有效。
  • 人脸大小:远处的小脸可能需要更高的受支持检测级别;最小人脸尺寸过滤也可能移除结果。
  • 模式:不相关的静态图片使用 ALWAYS_DETECT,有序视频帧使用跟踪模式。

将实际提交给 SDK 的缓冲区保存成图像,对照相机预览检查颜色和方向,并确认行间是否有填充字节。

人脸框或关键点在预览中偏移

检查原始帧到显示画面的变换。预览的中心裁剪、缩放、旋转和前置镜像都会影响绘制。在画面中心和各个边缘分别测试。详见坐标处理。

分析结果缺失或始终不变

创建会话时启用所需选项,运行分析流水线时再次请求对应功能。调用成功后,读取已启用选项的结果。

使用当前帧对应的 token,并保留图像。C 中普通跟踪结果和部分 getter 数组是借用缓冲区,需要在后续调用覆盖前复制。各类生命周期见架构说明和 C 接入指南。

识别或检索结果不符合预期

录入时明确选择目标人脸,使用同一模型生成的兼容向量,并在读取检索身份前检查 matched。Eager 搜索可能返回第一条满足阈值的记录;需要最佳匹配时使用 exhaustive 搜索。

识别使用 cosine similarity 阈值。检测置信度、活体置信度和抓拍评分各有自己的判断条件。识别阈值的选择与模型迁移见识别与特征库。

抓拍始终无法就绪

持续送入新帧,保证 ID 和毫秒时间戳递增。检查 reject_reasons 和 metrics.available_filters。人数过滤需要会话能够检测多张人脸,姿态和质量过滤则需要启用对应会话选项。

使用快照时,为每个新帧创建快照,让跟踪次数随视频推进。处理离线视频时,使用视频本身的时间戳。

内存或延迟持续增长

复用会话,及时释放图像流和独立创建的检测快照,只缓存需要的候选图像。避免无限增长的帧队列,也不要默认保存所有特征向量或预览位图。释放工作线程的会话前,先停止提交任务。

测量内存时,区分稳定的分配器或运行时缓存,以及未释放句柄的持续增加。当前 Python API 提供 show_system_resource_statistics() 查看 SDK 资源计数,可以比较多轮创建、使用、释放后的数量。

在哪里关注 SDK 的最新更新?

需要更快的问题响应和 SDK 版本更新,可以关注 develop 仓库。

提供可复现的问题

附上原生版本、封装版本、模型标识、平台与后端、准确错误码,以及最小可复现输入或代码。摄像头问题还需说明提交的格式、尺寸、步长和旋转,并附上可公开的测试图片。

所有问题统一提交到 InspireFace Issues。

编辑此页
最近更新: 2026/10/2 20:07
贡献者: Jingyu
上一页
图像处理性能