InspireFace 错误反馈码(Error Feedback Codes)完整指南:错误码表、数值结构与跨语言排查实践
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
本文以 Error-Feedback-Codes.md 为主体,结合 InspireFace 的 C/C++ 头文件、宏定义、Python 绑定与自动化生成工具,系统梳理 InspireFace 全部错误反馈码的取值、分组结构、传播机制与排查方法。读完本文,你将能在 C API、C++ 接口与 Python 绑定中准确识别错误码含义、定位失败模块,并理解错误码表为何能跨语言保持一致。
InspireFace 是 InsightFace 仓库cpp-package下的跨平台人脸推理引擎,覆盖人脸检测、关键点、识别、跟踪与特征管理(FeatureHub)等能力。在实际运行中,任何一步失败都会以整型错误码的形式回传给调用方。由于 InspireFace 同时提供 C API、C++ API、Python 绑定与 Android JNI 等多语言入口,掌握一套统一、稳定的错误码体系,是快速定位线上问题的关键能力。
一、错误反馈码是什么
InspireFace 的 C 接口约定:所有 API 调用均返回一个整型状态码,HSUCCEED(值为0)表示成功,其余非零值代表各类失败原因。调用方只需与错误码表比对,即可判断失败发生在参数校验、会话(Session)运行、特征库(FeatureHub)、模型归档(Archive)加载还是硬件设备(CUDA)层面,无需阅读冗长日志。
该错误码体系在2025 年 6 月 15 日经历了一次结构性重构:历史版本中的部分遗留码被移除,错误码被重新归类整合为更精简的版本。因此,本文给出的错误码表以当前仓库为准,旧版本项目迁移时需注意码值与含义的对应关系可能发生变化。
二、错误反馈码完整总表
下表完整收录了 InspireFace 当前版本的全部错误反馈码,共 43 个有效码值(含成功码)。Index 为原文表格序号,Comment 为官方注释含义。
| Index | Name | Code | Comment |
|---|---|---|---|
| 1 | HSUCCEED | 0 | Success |
| 2 | HERR_UNKNOWN | 1 | Unknown error (1) |
| 3 | HERR_INVALID_PARAM | 2 | Invalid parameter (2) |
| 4 | HERR_INVALID_IMAGE_STREAM_HANDLE | 3 | Invalid image stream handle (3) |
| 5 | HERR_INVALID_CONTEXT_HANDLE | 4 | Invalid context handle (4) |
| 6 | HERR_INVALID_FACE_TOKEN | 5 | Invalid face token (5) |
| 7 | HERR_INVALID_FACE_FEATURE | 6 | Invalid face feature (6) |
| 8 | HERR_INVALID_FACE_LIST | 7 | Invalid face feature list (7) |
| 9 | HERR_INVALID_BUFFER_SIZE | 8 | Invalid copy token (8) |
| 10 | HERR_INVALID_IMAGE_STREAM_PARAM | 9 | Invalid image param (9) |
| 11 | HERR_INVALID_SERIALIZATION_FAILED | 10 | Invalid face serialization failed (10) |
| 12 | HERR_INVALID_DETECTION_INPUT | 11 | Failed to modify detector input size (11) |
| 13 | HERR_INVALID_IMAGE_BITMAP_HANDLE | 12 | Invalid image bitmap handle (12) |
| 14 | HERR_IMAGE_STREAM_DECODE_FAILED | 13 | ImageStream failed to decode the image (13) |
| 15 | HERR_SESS_FUNCTION_UNUSABLE | 101 | Function not usable (101) |
| 16 | HERR_SESS_TRACKER_FAILURE | 102 | Tracker module not initialized (102) |
| 17 | HERR_SESS_PIPELINE_FAILURE | 103 | Pipeline module not initialized (103) |
| 18 | HERR_SESS_INVALID_RESOURCE | 104 | Invalid static resource (104) |
| 19 | HERR_SESS_LANDMARK_NUM_NOT_MATCH | 105 | The number of input landmark points does not match (105) |
| 20 | HERR_SESS_LANDMARK_NOT_ENABLE | 106 | The landmark model is not enabled (106) |
| 21 | HERR_SESS_KEY_POINT_NUM_NOT_MATCH | 107 | The number of input key points does not match (107) |
| 22 | HERR_SESS_REC_EXTRACT_FAILURE | 108 | Face feature extraction not registered (108) |
| 23 | HERR_SESS_REC_CONTRAST_FEAT_ERR | 109 | Incorrect length of feature vector for comparison (109) |
| 24 | HERR_SESS_FACE_DATA_ERROR | 110 | Face data parsing (110) |
| 25 | HERR_SESS_FACE_REC_OPTION_ERROR | 111 | An optional parameter is incorrect (111) |
| 26 | HERR_FT_HUB_DISABLE | 201 | FeatureHub is disabled (201) |
| 27 | HERR_FT_HUB_INSERT_FAILURE | 202 | Data insertion error (202) |
| 28 | HERR_FT_HUB_NOT_FOUND_FEATURE | 203 | Get face feature error (203) |
| 29 | HERR_ARCHIVE_LOAD_FAILURE | 251 | Archive load failure (251) |
| 30 | HERR_ARCHIVE_LOAD_MODEL_FAILURE | 252 | Model load failure (252) |
| 31 | HERR_ARCHIVE_FILE_FORMAT_ERROR | 253 | The archive format is incorrect (253) |
| 32 | HERR_ARCHIVE_REPETITION_LOAD | 254 | Do not reload the model (254) |
| 33 | HERR_ARCHIVE_NOT_LOAD | 255 | Model not loaded (255) |
| 34 | HERR_DEVICE_CUDA_NOT_SUPPORT | 301 | CUDA not supported (301) |
| 35 | HERR_DEVICE_CUDA_TENSORRT_NOT_SUPPORT | 302 | CUDA TensorRT not supported (302) |
| 36 | HERR_DEVICE_CUDA_UNKNOWN_ERROR | 303 | CUDA unknown error (303) |
| 37 | HERR_DEVICE_CUDA_DISABLE | 304 | CUDA support is disabled (304) |
| 38 | HERR_EXTENSION_ERROR | 351 | Extension module error (351) |
| 39 | HERR_EXTENSION_MLMODEL_LOAD_FAILED | 352 | MLModel load failed (352) |
| 40 | HERR_EXTENSION_HETERO_MODEL_TAG_ERROR | 353 | Incorrect heterogeneous model tag (353) |
| 41 | HERR_EXTENSION_HETERO_REC_HEAD_CONFIG_ERROR | 354 | Rec head config error (354) |
| 42 | HERR_EXTENSION_HETERO_MODEL_NOT_MATCH | 355 | Heterogeneous model dimensions do not match (355) |
| 43 | HERR_EXTENSION_HETERO_MODEL_NOT_LOADED | 356 | Heterogeneous model dimensions not loaded (356) |
三、错误码的数值结构:按模块分组的偏移基址
错误码并非无规律递增,而是按功能模块划分了数值区间(Base),区间内部再以Base + offset的方式叠加。这一点可以直接从 C 头文件 herror.h 的宏定义中得到确认:
// Basic error types (1-99) #define HERR_BASIC_BASE 0x0001 // 基础错误 #define HERR_UNKNOWN HERR_BASIC_BASE // Unknown error (1) #define HERR_INVALID_PARAM (HERR_BASIC_BASE + 1) // Invalid parameter (2) // Session error types (100-199) #define HERR_SESS_BASE 0x0064 // Session 错误基址 (100) #define HERR_SESS_FUNCTION_UNUSABLE (HERR_SESS_BASE + 1) // Function not usable (101) // FeatureHub error types (200-249) #define HERR_FT_HUB_BASE 0x00C8 // FeatureHub 错误基址 (200) // Archive error types (250-299) #define HERR_ARCHIVE_BASE 0x00FA // Archive 错误基址 (250) // Device/Hardware error types (300-349) #define HERR_DEVICE_BASE 0x012C // 硬件错误基址 (300) // Extension module error types (350-549) #define HERR_EXTENSION_BASE 0x015E // 扩展模块错误基址 (350)据此可以归纳出清晰的分组画像:
| 区间 | 模块归属 | 典型触发场景 |
|---|---|---|
| 0 | 成功码 | 所有 API 正常返回 |
| 1–99 | Basic(基础/输入) | 参数非法、句柄无效、缓冲大小错误、图像解码失败 |
| 100–199 | Session(会话) | 跟踪器/流水线未初始化、关键点数量不匹配、特征提取未注册 |
| 200–249 | FeatureHub(特征库) | 特征库被禁用、插入失败、特征未找到 |
| 250–299 | Archive(模型归档) | 模型加载失败、归档格式错误、重复加载、未加载 |
| 300–349 | Device(硬件设备) | CUDA 不支持、CUDA TensorRT 不支持、CUDA 被禁用 |
| 350–549 | Extension(扩展模块) | MLModel 加载失败、异构模型标签/维度不匹配 |
这种“基址 + 偏移”的设计有双重收益:其一,码值区间一眼可辨失败模块,日志中看到2xx即可锁定 FeatureHub 或 Archive;其二,为后续模块扩展预留了充足空间(如 Extension 区间跨度达 200),新增错误码不会与既有码冲突。
四、C/C++ 侧的错误传播与检查机制
4.1 统一返回约定
InspireFace 的 C API(见 inspireface.h)与 C++ 内部模块统一以int32_t返回错误码。内部模块通过 isf_check.h 提供的检查宏快速短路失败路径:
#define INSPIREFACE_RETURN_IF_ERROR(...) \ do { \ const int32_t _status = (__VA_ARGS__); \ if (_status != HSUCCEED) { \ INSPIRE_LOGE("Error code: %d", _status); \ return _status; \ } \ } while (0)该宏会在子调用失败时立即记录日志并向上层原样透传错误码,保证错误码从最深层模块一路传播到最外层调用者而不被吞掉。此外INSPIREFACE_CHECK/INSPIREFACE_CHECK_MSG用于断言式检查,失败时输出致命日志。
4.2 示例:会话创建流程中的逐级校验
以官方示例 sample_create_session.c 为例,可以看到典型的错误处理范式——每个 API 调用后立即比对HSUCCEED,并携带错误码打印日志:
if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Load Resource error: %d", ret); } ... if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Create InspireFace session error: %d", ret); } ... if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Set minimum face pixel size error: %d", ret); }同一模式也贯穿于 sample_face_track.c、sample_face_comparison.c、sample_load_reload.c 等示例中。单元测试同样依赖错误码做断言,例如 test_face_context.cpp 中通过检查返回值是否为HSUCCEED来判断 API 行为是否符合预期。
4.3 关键错误码的底层触发点
- HERR_ARCHIVE_LOAD_FAILURE (251) / HERR_ARCHIVE_LOAD_MODEL_FAILURE (252):模型归档(.pak 文件)读取或模型解析失败,常见于模型文件缺失、路径错误或归档损坏。重复加载同一模型会触发HERR_ARCHIVE_REPETITION_LOAD (254),而未加载即使用会触发HERR_ARCHIVE_NOT_LOAD (255)——这组码在 sample_load_reload.c 中专门演示了加载/重载的正确流程。
- HERR_SESS_TRACKER_FAILURE (102) / HERR_SESS_PIPELINE_FAILURE (103):对应 face_track_module.cpp 与 face_pipeline_module.cpp 中的跟踪器、流水线模块未完成初始化即被调用。
- *HERR_DEVICE_CUDA_(301–304)**:由 cuda_toolkit.cpp 及 TensorRT/CoreML 推理封装层(inference_wrapper_tensorrt.cpp)在硬件能力探测阶段返回,例如运行环境缺少 CUDA 支持或显式关闭了 CUDA 编译选项。
五、Python 绑定中的错误码处理
InspireFace 的 Python 包在python/inspireface/modules/下对错误码做了完整封装,实现“码值 ↔ 异常类型”的自动映射。
5.1 错误码常量:herror.py
herror.py 是由 C 头文件自动生成的错误码常量模块,头文件注释明确标注“Auto-generated error code definitions from cpp/inspireface/include/inspireface/herror.h”。因此 Python 侧与 C 侧的码值保证一一对应:
HSUCCEED = 0 # Success HERR_INVALID_PARAM = 2 # Invalid parameter (2) HERR_SESS_REC_CONTRAST_FEAT_ERR = 109 # Incorrect length of feature vector for comparison (109) HERR_ARCHIVE_REPETITION_LOAD = 254 # Do not reload the model (254) HERR_DEVICE_CUDA_NOT_SUPPORT = 301 # CUDA not supported (301)5.2 异常体系:exception.py 与 check_error
exception.py 定义了以InspireFaceError为基类的异常层次,并通过ERROR_CODE_MAPPING将错误码归类到不同异常类型:
InvalidInputError:参数/数据格式错误(如HERR_INVALID_PARAM、HERR_INVALID_BUFFER_SIZE);SystemNotReadyError:系统未就绪(如HERR_ARCHIVE_NOT_LOAD、HERR_SESS_INVALID_RESOURCE);ProcessingError:处理流程错误(如HERR_SESS_TRACKER_FAILURE、HERR_IMAGE_STREAM_DECODE_FAILED);ResourceError:句柄/资源类错误(如HERR_INVALID_FACE_TOKEN、HERR_INVALID_IMAGE_BITMAP_HANDLE);HardwareError:硬件类错误(HERR_DEVICE_CUDA_NOT_SUPPORT等);FeatureHubError:特征库错误(HERR_FT_HUB_*系列)。
核心入口是check_error(error_code, operation, **context):当 C 库返回非零码时,它会反查错误名、构造形如[HERR_INVALID_PARAM(2)] xxx failed的异常消息,并依据映射表抛出对应子类异常,异常对象上还携带error_code、error_name与context属性便于程序化处理:
try: check_error(ret, "CreateSession") except InspireFaceError as e: print(e.error_name, e.error_code) # 例如 HERR_ARCHIVE_NOT_LOAD 255此外,模块还内置了validate_image_format、validate_feature_data、validate_session_initialized等便捷校验函数,在调用 C 库前先行拦截常见输入错误(如图像非三维数组、通道数不为 3/4、特征数据非 float32),使 Python 侧的错误信息更友好。
六、错误码表的自动化生成与一致性维护
错误码分布在 C 头文件、文档与 Python 模块三处,为杜绝手工维护导致的三处不一致,仓库提供了生成工具:
- generate_error_tabel_to_python.py:解析
herror.h中[Anchor-Begin]与[Anchor-End]锚点之间的宏定义,用正则提取#define行、剥离注释,并通过eval计算BASE + offset表达式得到真实码值,最终输出 Python 格式的错误码表。它跳过_BASE结尾的基址宏,只保留具名错误码。 - output_error_table.py:输出错误码对照表,便于核对文档与代码的一致性。
这也解释了前文观察到的现象——herror.py 与 herror.h 中每个码的名称、数值、注释完全一致,因为后者是前者的唯一事实来源。
七、常见错误码排查速查
| 场景 | 错误码 | 建议处理 |
|---|---|---|
| 首次加载模型即失败 | 251 / 252 | 检查.pak归档路径、文件完整性及格式版本 |
| 反复创建会话导致失败 | 254 | 避免重复加载同一模型,先释放旧会话(参考 sample_load_reload.c) |
| 调用识别接口报 108 | 108 | 确认创建会话时已启用识别并使能对应模型 |
| 人脸特征比对报 109 | 109 | 核对比对双方特征向量长度是否一致 |
| 特征库操作报 201/202/203 | 201–203 | 确认 FeatureHub 已开启;插入前校验特征格式;查询前确认特征已入库 |
| 跟踪功能失效 | 102 | 确认跟踪器已初始化,且已调用HFSetTrackPreviewSize等前置设置 |
| CUDA 推理失败 | 301–304 | 检查编译选项与运行环境是否启用 CUDA/TensorRT,参考 CMake-Option.md |
| 扩展模块/异构模型加载失败 | 351–356 | 核对模型标签(tag)、识别头配置及特征维度与模型归档是否匹配 |
八、结语
InspireFace 的错误反馈码体系是“模块化、可传播、跨语言一致”的典型设计:数值上按 Basic / Session / FeatureHub / Archive / Device / Extension 分组并预留扩展区间;传播上由 C 层宏逐级透传、示例与测试严格校验;消费侧则通过 Python 异常映射与自动化生成工具保证多语言体验一致。无论是排查线上问题、编写健壮的调用代码,还是为 InspireFace 扩展新功能,本文的完整码表与分组画像都可以直接作为参考依据,详细的实现可进一步阅读 Error-Feedback-Codes.md 与 herror.h。
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考