能力定位:FReID 接收同一帧图像及人脸 106 点检测结果,输出 face_id 到稳定 track_id 的映射,用于人员离开画面后再次出现时维持身份标识。FReID 依赖人脸检测,不是独立的全身行人 ReID 接口。
- 初始化人脸检测;初始化配置必须包含所需模型、检测模式和人脸能力。Java 侧随后必须调用 FaceDetect.setFaceDetectConfig() 设置运行时检测配置,该配置应为初始化配置的子集。
- 如需跨进程保留记忆,配置离线 TrackID 缓存文件,再加载 FReID 模型。
- 逐帧执行人脸检测,将同一帧图像及其人脸结果传入 FReID。
同帧约束:人脸检测与 FReID 必须使用同一帧图像以及相同的宽、高、stride、像素格式和 orientation。Java 侧必须使用 detectFaceForFreid(),不能用普通 detectFace() 的结果代替。
运行参数对 C 和 Java 含义一致。业务没有明确调优需求时使用默认值,不需要主动设置。
C 使用 bef_effect_ai_freid_set_param_f() 或 bef_effect_ai_freid_set_param_i();Java 使用 FreidDetect.setParam(...) 的 float 或 int 重载。内部 Demo 未主动设置运行参数,普通接入建议使用模型默认配置;USE_BUFFER、BUFFER_IMMEDIATE_MODE 和 MODEL_TYPE 等高级参数仅在技术支持指导下设置。
公开接口定义于 bef_effect_ai_freid.h,公共类型与错误码定义于 bef_effect_ai_public_define.h,人脸输入结构定义于 bef_effect_ai_face_detect.h。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC,其他返回值参见 bef_effect_ai_public_define.h。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;授权无效或授权文件未包含 FReID(人脸重识别)能力时返回对应错误码。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;授权无效或授权文件未包含 FReID(人脸重识别)能力时返回对应错误码。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;空路径返回 BEF_RESULT_INVALID_PARAM_VALUE,模型不可读或无效时返回模型相关错误码。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;不支持的参数类型返回 BEF_RESULT_INVALID_PARAM_VALUE。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;不支持的参数类型返回 BEF_RESULT_INVALID_PARAM_VALUE。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;路径或保存模式无效时返回 BEF_RESULT_INVALID_PARAM_VALUE。句柄已初始化时,配置成功后会立即尝试恢复已有缓存。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;缓存文件不存在时返回 BEF_RESULT_FILE_NOT_FIND,配置无效时返回 BEF_RESULT_INVALID_PARAM_VALUE。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;配置无效、序列化失败或文件写入失败时返回对应错误码。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;model_param 为空时返回 BEF_RESULT_INVALID_PARAM_VALUE。
代码块
参数说明
返回值
当前实现完成资源释放后返回 BEF_RESULT_SUC。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;空指针、方向无效或像素格式不支持时返回对应错误码。
ptr_base_info 必须来自同一帧人脸检测结果,并保留 ID、tracking_cnt、after_det。输出中的 face_id 是当前人脸跟踪 ID,track_id 是业务用于跨重新入镜关联身份的 FReID ID。
FReID 主类为 FreidDetect。FReID 所需的人脸输入由 FaceDetect.detectFaceForFreid() 生成;该方法属于 FaceDetect,调用前必须成功执行 FaceDetect.init() 和 FaceDetect.setFaceDetectConfig()。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC。失败时返回 Java 包装层或 native 层错误码,统一按本文“错误处理”章节排查;不要仅根据 EffectsSDKResultCode 中同名常量推断所有 native 错误。重复初始化直接返回成功。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;未初始化时由 Java 包装层返回 -4,参数类型不受支持时 native 返回 BEF_RESULT_INVALID_PARAM_VALUE(-47)。错误码来源差异见本文“错误处理”。
代码块
参数说明
返回值
成功返回 BEF_RESULT_SUC;参数无效时返回 BEF_RESULT_INVALID_PARAM_VALUE。该方法允许在 init() 前调用,配置会在初始化过程中应用。
代码块
参数说明
无。
返回值
成功返回 BEF_RESULT_SUC;未初始化时由 Java 包装层返回 -4,缓存不存在时 native 返回 BEF_RESULT_FILE_NOT_FIND(-2),配置无效时返回 BEF_RESULT_INVALID_PARAM_VALUE(-47)。
代码块
参数说明
无。
返回值
成功返回 BEF_RESULT_SUC;未初始化时由 Java 包装层返回 -4,配置无效、序列化失败或文件写入失败时返回对应 native 错误码。
代码块
参数说明
无。
返回值
成功返回 BefFreidKeyParam,其中包含 model_version、model_thresh 和 trackid_num;未初始化或 native 调用失败时返回 null。
代码块
参数说明
无。
返回值
无。已初始化时释放 native 句柄;native 层释放前会尝试写入已配置的离线 TrackID。
代码块
参数说明
返回值
成功返回 BefFreidFaceInfo,包含普通人脸检测结果及逐脸的 faceId、trackingCnt、afterDet;未初始化、未配置人脸检测参数或检测失败时返回 null。
代码块
参数说明
返回值
成功返回 BefFreidDetectResult;通过 count 和 freid_pairs 提供 face_id → track_id 映射。未初始化或 native 调用失败时返回 null。
imageBuffer 必须是 DirectByteBuffer。BefFreidFaceInfo 额外保存每张脸的 faceId、trackingCnt 和 afterDet;调用 detect() 时必须传入同一帧对应的对象。
缓存文件作用:缓存文件保存 FReID 已建立的 TrackID 记忆状态。只要文件没有被删除、覆盖或更换路径,并在下次初始化时成功加载,FReID 就会延续此前记忆。freid_buffer.dat 只是 Demo 使用的文件名,客户可以自定义文件名、目录、保存时机、恢复时机和清理策略。
- 建议在 init 前配置缓存路径;初始化会自动尝试恢复,首次运行没有缓存文件不视为失败。
- 两种模式均可显式调用 flush;不要只依赖 release,因为异常退出时无法保证执行。
- 删除、清空或替换缓存文件会丢失既有记忆;更换路径会进入另一份独立记忆。
- 模型、算法版本或业务身份域变化时,建议使用新的缓存文件。
- Android 建议使用 App 私有、稳定且可写的路径,例如 new File(context.getFilesDir(), "freid_buffer.dat")。内部 Demo 会在初始化和销毁时删除该文件以便重复演示,这不是 SDK 要求;正式业务需要跨启动保留身份时不要复制该删除逻辑,仅在用户主动重置身份库时清理文件。
Java 错误码说明:FreidDetect 的部分初始化状态检查由 Java 包装层完成,其他错误由 JNI/native 返回。当前 EffectsSDKResultCode 中个别旧常量与 native 公共错误码同名但数值不同,因此请按实际返回的整数值和下表排查,不要只按 Java 常量名称推断 native 错误。
普通 Java 人脸结果不包含 FReID 所需的完整逐脸跟踪字段。请调用 detectFaceForFreid(),并将返回的 BefFreidFaceInfo 原样传入 FreidDetect.detect()。
为什么同一个人重新入镜后 face_id 会变化?
face_id 是人脸检测器的连续跟踪 ID,跟踪丢失后重新检测可能变化。业务身份关联应使用 FReID 输出的 track_id。
检查两次启动使用的缓存路径是否一致、应用是否具有读写权限,以及业务是否删除或覆盖了缓存文件。手动模式还必须在退出前成功调用 flush。