FacethinkAPI  1.0.0
SDK入门简介

本篇主要介绍FaceThink人脸检测引擎,以下简称FT SDK或者SDK。 更多...

本篇主要介绍FaceThink人脸检测引擎,以下简称FT SDK或者SDK。

FT SDK一共分为2个等级,分别为免费注册用户,企业级用户。 在iOS和Android平台上,免费注册用户与企业级用户的功能完全一致。但企业级用户的SDK在模型内存上有特殊优化,比免费用户小1G左右。如果要发布APP,您需要付费成为企业级用户并且务必保证所获得的apikey没有过期;否则SDK所占内存将使您的APP在部分手机上因为内存问题而闪退。 在PC平台上(Windows和Linux),免费注册用户只能使用单线程环境的所有功能,企业级用户则可以使用多线程环境。如果您需要将SDK用于同时响应多个用户的请求,您需要付费成为企业级用户。

FT SDK能够在单线程和多线程环境下工作,但只能工作于二者之一,且一旦初始化后不能在二者之间切换。

在单线程环境下,需要指定当前识别的模式(DETECT_MODE)。目前为止,SDK有人脸检测(DETECT_MODE::FaceDetect),视频流的关键点检测(DETECT_MODE::LandmarkDetectInVideo)和图片的关键点检测(DETECT_MODE::LandmarkDetectInPicture)。在单线程环境下使用任何检测函数之前,都需要调用函数SingleInstanceSetState设定所使用的检测模式。多线程环境没有这个要求。之所以需要显式设定,是因为我们对视频流的关键点检测做了多帧之间的关键点跟踪,以提高视频中关键点检测的速度。众所周知,视频流中两帧之间的内容往往多有相关性,在做关键点检测的时候,我们可以利用这样的相关性来做优化。因此,如果您的检测任务是视频流,那么请显示设置成视频流的关键点检测。同时,当SDK已经处于视频流的关键点检测模式下,如果调用SingleInstanceSetState函数切换成其他模式(比如人脸检测模式),那么在这之前用于跟踪视频中关键点的那些缓存数据将会被清空。当SDK再次从其他模式切换到视频流的关键点检测模式时,SDK只能重新开始关键点检测而不是继续使用跟踪模式。因此,在单线程环境下,请尽量保证视频流的关键点检测执行完毕,避免在检测中切换当前检测模式。但SDK在人脸检测和图片关键点检测之前切换,则没有这些限制。

一个典型的单线程环境人脸检测(或者特征点识别)的过程为:

//应用程序初始化时,根据注册时的信息和得到的apikey调用SDK初始化函数。
init(apikey, platform, packageName, maxFacesNum, modePath);
.
.
.
//在应用的某个地方,使用具体识别函数之前,将SDK初始化成单线程的指定检测模式。
SingleInstanceSetState(detect_mode);
.
.
.
//调用人脸检测或者特征点识别函数。可多次重复调用识别函数。
.
.
.
//应用程序退出时,调用SDK退出函数。
Exit();

在多线程环境下,与单线程环境对应的函数为MultiInstanceSetState,用于初始化SDK的多线程环境。与单线程环境不一样的是,多线程环境不需要指定检测模式。但需要针对每次检测(每次检测我们定义为一个检测Session)通过函数InitSessionMultiInstance注册唯一的SessionID。这是为了让SDK在内部能够唯一确定不同线程的检测任务。而如果当前线程的检测任务已经结束,需要调用函数ReleaseSessionMultiInstance向SDK注销已经注册的SessionID。整个多线程环境在SDK内部实现多线程同步,因此您不需要考虑互斥访问问题。您需要在任何检测任务(包括人脸检测、视频流关键点检测和图片关键点检测)开始之前注册一个唯一SessionID,并且在这个任务完成之后注销它。在SDK内部会维护一个Session对象的对象池,因此您不必担心这种反复注册、注销带来的性能开销。

一个典型的多线程环境人脸检测(或者特征点识别)的过程为:

//应用程序初始化时,根据注册时的信息和得到的apikey调用SDK初始化函数。
init(apikey, platform, packageName, maxFacesNum, modePath);
//将SDK初始化成多线程环境。
.
.
.
//在响应用户请求的地方,有如下典型逻辑:
//首先对本任务注册唯一标识的sessionID。
InitSessionMultiInstance(sessionID);
//调用多线程版的人脸检测或者特征点识别函数(以"Ex"结尾的识别函数)。同一个sessionID可多次重复调用识别函数。
//完成本线程的任务,释放已注册的sessionID。
.
.
.
//应用程序退出时,调用SDK的退出函数。请确保所有使用SDK API的线程都退出之后,再调用Exit函数。
Exit();