324 lines
12 KiB
Objective-C
Executable File
324 lines
12 KiB
Objective-C
Executable File
//
|
||
// FUAIKit.h
|
||
// FURenderKit
|
||
//
|
||
// Created by liuyang on 2021/3/2.
|
||
//
|
||
|
||
#import <Foundation/Foundation.h>
|
||
#import "CNamaSDK.h"
|
||
#import "FURenderIO.h"
|
||
|
||
@class FUTrackFaceInput;
|
||
|
||
NS_ASSUME_NONNULL_BEGIN
|
||
|
||
/// 人脸检测模式
|
||
typedef enum : NSUInteger {
|
||
FUFaceProcessorDetectModeImage,
|
||
FUFaceProcessorDetectModeVideo,
|
||
} FUFaceProcessorDetectMode;
|
||
|
||
/// 人体检测模式
|
||
typedef enum : NSUInteger {
|
||
FUHumanProcessorDetectModeImage,
|
||
FUHumanProcessorDetectModeVideo
|
||
} FUHumanProcessorDetectMode;
|
||
|
||
/// 人脸点位算法性能
|
||
typedef enum : NSUInteger {
|
||
FUFaceProcessorFaceLandmarkQualityLow,
|
||
FUFaceProcessorFaceLandmarkQualityMedium,
|
||
FUFaceProcessorFaceLandmarkQualityHigh
|
||
} FUFaceProcessorFaceLandmarkQuality;
|
||
|
||
/// 人脸模型设置
|
||
typedef enum : NSInteger {
|
||
FUFaceModelConfigDefault = -1
|
||
} FUFaceModelConfig;
|
||
|
||
/// 人脸算法设置
|
||
typedef enum : NSUInteger {
|
||
FUFaceAlgorithmConfigEnableAll = 0, // 打开全部效果
|
||
FUFaceAlgorithmConfigDisableFaceOccu = 1 << 0, // 关闭全脸分割
|
||
FUFaceAlgorithmConfigDisableSkinSeg = 1 << 1, // 关闭皮肤分割
|
||
FUFaceAlgorithmConfigDisableDelSpot = 1 << 2, // 关闭祛斑痘
|
||
FUFaceAlgorithmConfigDisableARMeshV2 = 1 << 3, // 关闭 ARMeshV2
|
||
FUFaceAlgorithmConfigDisableRACE = 1 << 4, // 关闭人种分类
|
||
FUFaceAlgorithmConfigDisableLANDMARK_HP_OCCU = 1 << 5, //关闭高质量遮挡
|
||
|
||
FUFaceAlgorithmConfigDisableFaceOccuAndSkinSeg = FUFaceAlgorithmConfigDisableFaceOccu | FUFaceAlgorithmConfigDisableSkinSeg,
|
||
FUFaceAlgorithmConfigDisableFaceOccuAndDelSpot = FUFaceAlgorithmConfigDisableFaceOccu | FUFaceAlgorithmConfigDisableDelSpot,
|
||
FUFaceAlgorithmConfigDisableSkinSegAndDelSpot = FUFaceAlgorithmConfigDisableSkinSeg | FUFaceAlgorithmConfigDisableDelSpot,
|
||
FUFaceAlgorithmConfigDisableFaceOccuAndSkinSegAndDelSpot = FUFaceAlgorithmConfigDisableFaceOccu | FUFaceAlgorithmConfigDisableSkinSeg | FUFaceAlgorithmConfigDisableDelSpot,
|
||
FUFaceAlgorithmConfigDisableAll = FUFaceAlgorithmConfigDisableFaceOccu | FUFaceAlgorithmConfigDisableSkinSeg | FUFaceAlgorithmConfigDisableDelSpot | FUFaceAlgorithmConfigDisableARMeshV2 | FUFaceAlgorithmConfigDisableRACE | FUFaceAlgorithmConfigDisableLANDMARK_HP_OCCU
|
||
} FUFaceAlgorithmConfig;
|
||
|
||
/// 人体分割场景
|
||
typedef enum : NSUInteger {
|
||
FUHumanSegmentationSceneTypeMeeting = 0, // 视频会议
|
||
FUHumanSegmentationSceneTypeCommon // 通用
|
||
} FUHumanSegmentationSceneType;
|
||
|
||
/// 人体分割模式
|
||
typedef enum : NSUInteger {
|
||
FUHumanSegmentationModeCPUCommon = 0x00, // CPU通用模式
|
||
FUHumanSegmentationModeGPUCommon = 0x01, // GPU通用模式
|
||
FUHumanSegmentationModeGPUMeeting = 0x02 // GPU会议模式
|
||
} FUHumanSegmentationMode;
|
||
|
||
/// 人体算法设置
|
||
typedef enum : NSUInteger {
|
||
FUHumanAlgorithmConfigEnableAll = 0, // 打开全部效果
|
||
FUHumanAlgorithmConfigDisableSeg = 1 << 0, // 关闭人体分割
|
||
} FUHumanAlgorithmConfig;
|
||
|
||
@interface FUAIKit : NSObject
|
||
|
||
@property (nonatomic, assign) int maxTrackFaces; // 设置最大的人脸跟踪个数 default is 1
|
||
|
||
@property (nonatomic, assign, readonly) int trackedFacesCount; // 跟踪到的人脸个数
|
||
|
||
@property (nonatomic, assign) int maxTrackBodies; // 设置最大的人体跟踪个数 default is 1
|
||
|
||
@property (nonatomic, assign) FUFaceProcessorDetectMode faceProcessorDetectMode; // 人脸检测模式 default is FUFaceProcessorDetectModeVideo
|
||
|
||
@property (nonatomic, assign) FUHumanProcessorDetectMode humanProcessorDetectMode; // 人体检测模式,default is FUHumanProcessorDetectModeVideo
|
||
|
||
@property (nonatomic, assign) BOOL faceProcessorSetFaceLandmarkHpOccu; // 遮挡点位是否使用高精度模型, 默认YES,YES 高精度模型,NO 通用模型
|
||
|
||
@property (nonatomic, assign) BOOL faceProcessorDetectSmallFace; // 是否开启小脸检测,default is NO
|
||
|
||
@property (nonatomic, assign) BOOL asyncTrackFace; //设置是否进行异步人脸跟踪
|
||
|
||
@property (nonatomic, assign) BOOL faceRaceDetect; // 人种检测是否开启,默认关闭
|
||
|
||
@property (nonatomic, assign) FUFaceProcessorFaceLandmarkQuality faceProcessorFaceLandmarkQuality; // 人脸算法质量
|
||
|
||
+ (instancetype)shareKit;
|
||
|
||
/// 人脸模型设置
|
||
/// @param config 枚举值
|
||
/// @note 必须在加载 AI 人脸模型之前设置
|
||
+ (void)setFaceModelConfig:(FUFaceModelConfig)config;
|
||
|
||
/// 人脸算法设置
|
||
/// @param config 枚举值
|
||
/// @note 必须在加载 AI 人脸模型之前设置,默认 FUFaceAlgorithmConfigEnableAll
|
||
+ (void)setFaceAlgorithmConfig:(FUFaceAlgorithmConfig)config;
|
||
|
||
/// 人体模型设置
|
||
/// @param config 枚举值
|
||
/// @note 必须在加载 AI 人体模型之前设置,默认 FUHumanSegmentationModeCPUCommon
|
||
+ (void)setHumanModelConfig:(FUHumanSegmentationMode)config;
|
||
|
||
/// 人体算法设置
|
||
/// @param config 枚举值
|
||
/// @note 必须在加载 AI 人脸模型之前设置,默认 FUHumanAlgorithmConfigEnableAll
|
||
+ (void)setHumanAlgorithmConfig:(FUHumanAlgorithmConfig)config;
|
||
|
||
/// 强制设置使用 CPU 运行 AI 模型
|
||
/// @note 必须在加载 AI 模型之前设置
|
||
+ (void)setModelToCPU;
|
||
|
||
/// 加载AI模型
|
||
/// @param type AI类型
|
||
/// @param dataPath 模型路径
|
||
+ (void)loadAIModeWithAIType:(FUAITYPE)type dataPath:(NSString *)dataPath;
|
||
|
||
/// 加载人体AI模型
|
||
/// @param dataPath 模型路径
|
||
/// @param mode 人体分割模式
|
||
/// @note 使用 loadAIModeWithAIType:dataPath: 接口加载人体模型时默认的分割模式为 FUHumanSegmentationModeCPUCommon
|
||
+ (void)loadAIHumanModelWithDataPath:(NSString *)dataPath segmentationMode:(FUHumanSegmentationMode)mode;
|
||
|
||
/// 卸载AI模型
|
||
/// @param type AI 类型
|
||
+ (void)unloadAIModeForAIType:(FUAITYPE)type;
|
||
|
||
/// 卸载所有的AI模型
|
||
+ (void)unloadAllAIMode;
|
||
|
||
/// 判断某 AI 模型是否加载
|
||
/// @param type AI 类型
|
||
+ (BOOL)loadedAIType:(FUAITYPE)type;
|
||
|
||
/// 加载舌头模型
|
||
/// @param modePath 舌头模型地址
|
||
+ (void)loadTongueMode:(NSString *)modePath;
|
||
|
||
/// 设置 AI 识别类型
|
||
/// @param type AI 识别类型
|
||
+ (void)setTrackFaceAIType:(FUAITYPE)type;
|
||
|
||
/// 对输入的图像进行 AI 识别,支持人脸、身体、手指能类型的识别
|
||
+ (int)trackFaceWithInput:(FUTrackFaceInput *)trackFaceInput;
|
||
|
||
/// 图像明显发生改变时调用该接口重置内部检测结果
|
||
+ (void)resetTrackedResult;
|
||
|
||
/// 跟踪到的人脸数量
|
||
+ (int)aiFaceProcessorNums;
|
||
|
||
/// 设置面部参数
|
||
+ (void)setFaceTrackParam:(NSString *)param value:(int)value;
|
||
|
||
/**
|
||
获取人脸信息:
|
||
- 在程序中需要先运行过视频处理接口( 视频处理接口8 除外)或 人脸信息跟踪接口
|
||
后才能使用该接口来获取人脸信息;
|
||
-
|
||
该接口能获取到的人脸信息与我司颁发的证书有关,普通证书无法通过该接口获取到人脸信息;
|
||
- 具体参数及证书要求如下:
|
||
|
||
landmarks: 2D人脸特征点,返回值为75个二维坐标,长度75*2
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
landmarks_ar: 3D人脸特征点,返回值为75个三维坐标,长度75*3
|
||
证书要求: AVATAR证书
|
||
|
||
rotation: 人脸三维旋转,返回值为旋转四元数,长度4
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
translation: 人脸三维位移,返回值一个三维向量,长度3
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
eye_rotation: 眼球旋转,返回值为旋转四元数,长度4
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
rotation_raw: 人脸三维旋转(不考虑屏幕方向),返回值为旋转四元数,长度4
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
expression: 表情系数,长度46
|
||
证书要求: AVATAR证书
|
||
|
||
projection_matrix: 投影矩阵,长度16
|
||
证书要求: AVATAR证书
|
||
|
||
face_rect: 人脸矩形框,返回值为(xmin,ymin,xmax,ymax),长度4
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
rotation_mode: 人脸朝向,0-3分别对应手机四种朝向,长度1
|
||
证书要求: LANDMARK证书、AVATAR证书
|
||
|
||
@param faceId 被检测的人脸 ID ,未开启多人检测时传 0
|
||
,表示检测第一个人的人脸信息;当开启多人检测时,其取值范围为 [0 ~ maxFaces-1]
|
||
,取其中第几个值就代表检测第几个人的人脸信息
|
||
@param name 人脸信息参数名: "landmarks" , "eye_rotation" , "translation" ,
|
||
"rotation" ....
|
||
@param pret 作为容器使用的 float 数组指针,获取到的人脸信息会被直接写入该 float
|
||
数组。
|
||
@param number float 数组的长度
|
||
@return 返回 1 代表获取成功,返回 0 代表获取失败
|
||
*/
|
||
+ (int)getFaceInfo:(int)faceId
|
||
name:(NSString *)name
|
||
pret:(float *)pret
|
||
number:(int)number;
|
||
|
||
|
||
/*
|
||
* 获取人种分类
|
||
* faceId 被检测的人脸 ID ,未开启多人检测时传 0
|
||
* return -1:unknow, 0:black, 1:white, 2:yellow, 3:brown
|
||
*/
|
||
+ (int)getFaceRace:(int)faceId;
|
||
|
||
/// 设置了InputCameraMatrix之后获取获取人脸信息
|
||
+ (int)getRotatedFaceInfo:(int)faceId
|
||
name:(NSString *)name
|
||
pret:(float *)pret
|
||
number:(int)number;
|
||
|
||
/// 人脸检测置信度
|
||
/// @param index 人脸索引
|
||
+ (float)fuFaceProcessorGetConfidenceScore:(int)index;
|
||
|
||
/// 设置跟踪到人脸时每次检测的间隔帧数
|
||
/// @param frames 帧数
|
||
/// @note 底层默认间隔帧数为7
|
||
+ (void)setFaceProcessorDetectEveryFramesWhenFace:(int)frames;
|
||
|
||
/// 设置未跟踪到人脸时每次检测的间隔帧数
|
||
/// @param frames 帧数
|
||
/// @note 底层默认间隔帧数为7
|
||
+ (void)setFaceProcessorDetectEveryFramesWhenNoFace:(int)frames;
|
||
|
||
/// 设置人脸离开延迟打开或关闭
|
||
/// @param enable YES为打开 NO为关闭
|
||
+ (void)setFaceDelayLeaveEnable:(BOOL)enable;
|
||
|
||
/// 跟踪到的人体数量
|
||
+ (int)aiHumanProcessorNums;
|
||
|
||
/// 重置身体识别
|
||
+ (void)resetHumanProcessor;
|
||
|
||
/// 设置人体分割场景类型
|
||
+ (void)setHumanSegmentationSceneType:(FUHumanSegmentationSceneType)type __attribute__((deprecated("Use loadAIHumanModelWithDataPath: segmentationMode: instead.")));
|
||
|
||
/// 跟踪到的手势数量
|
||
+ (int)aiHandDistinguishNums;
|
||
|
||
/// 获取手势类型
|
||
/// @param handIndex aiHandDistinguishNums返回手的索引
|
||
+ (FUAIGESTURETYPE)fuHandDetectorGetResultGestureType:(int)handIndex;
|
||
|
||
/// 设置未跟踪到手势时每次检测的间隔帧数
|
||
/// @param frames 帧数
|
||
+ (void)setHandDetectEveryFramesWhenNoHand:(int)frames;
|
||
|
||
/// 动作识别: actionId index of fuHumanProcessorGetNumResults
|
||
+ (int)fuHumanProcessorGetResultActionType:(int)actionId;
|
||
|
||
@end
|
||
|
||
|
||
@interface FUAIKit (Test)
|
||
|
||
@property (nonatomic, assign) float use_new_cnn_detection;
|
||
@property (nonatomic, assign) float other_face_detection_frame_step_new;
|
||
@property (nonatomic, assign) float min_facesize_big;
|
||
@property (nonatomic, assign) float small_face_frame_step;
|
||
@property (nonatomic, assign) float min_facesize_small;
|
||
|
||
@property (nonatomic, assign) float other_face_detection_frame_step;
|
||
@property (nonatomic, assign) float size_min;
|
||
|
||
@end
|
||
|
||
|
||
#pragma mark - FUTrackFaceInput
|
||
|
||
@interface FUTrackFaceConfig : NSObject
|
||
/// 是否进行舌头的检测,默认不对舌头进行检测。
|
||
@property (nonatomic, assign) BOOL trackTongue;
|
||
|
||
@property (nonatomic, assign) FUImageOrientation imageOrientation; // 设置人物在原始图像中的方向,默认为 FUImageOrientationUP。
|
||
|
||
@property (nonatomic, assign) BOOL gravityEnable; // 重力开关,开启此功能可以根据已设置的 trackOrientation 自动适配AI检测的方向。
|
||
|
||
|
||
/// 当前图片是否来源于前置摄像头,默认为 NO
|
||
@property (nonatomic, assign) BOOL isFromFrontCamera;
|
||
|
||
/// 当前图片是否来源于镜像摄像头,默认为 NO
|
||
@property (nonatomic, assign) BOOL isFromMirroredCamera;
|
||
@end
|
||
|
||
/// trackFaceWithInput 接口的输入,CVPixelBufferRef、FUImageBuffer只需要传入一个就好,如果传入多个,将按优先级使用其中一种,优先级为:CVPixelBufferRef > FUImageBuffer;
|
||
@interface FUTrackFaceInput : NSObject
|
||
/// 输入的 pixelBuffer
|
||
@property (nonatomic, assign) CVPixelBufferRef pixelBuffer;
|
||
|
||
/// 输入的 imageBuffer
|
||
@property (nonatomic, assign) FUImageBuffer imageBuffer;
|
||
|
||
/// 设置 trackFace 相关的输入配置,详细参数请查看 FUTrackFaceConfig 类的接口注释。
|
||
@property (nonatomic, strong) FUTrackFaceConfig *trackFaceConfig;
|
||
|
||
@end
|
||
|
||
|
||
NS_ASSUME_NONNULL_END
|