文档

AI 检测相关 API

更新时间:

本文主要介绍了 iOS MPIDRSSDK 中 AI 检测相关的 API。

初始化 MPIDRSSDK

+ (void)initWithRecordType:(IDRSRecordType)recordType
                    userId:(NSString *)userId
                     appId:(NSString *)appId
               packageName:(NSString *)packageName
                        AK:(NSString*)ak
                        SK:(NSString*)sk
                     model:(IDRSModelType)modelType
               addDelegate:(id<IDRSDelegate>)delegate
                   success:(void (^)(id responseObject))success
                   failure:(void (^)(NSError *error))failure;

*退出时请使用 releaseResources方法销毁SDK,否则会导致计费异常(会多扣钱哟~~)

请求参数

参数

类型

说明

是否必须

recordType

IDRSRecordType

  • IDRSRecordLocal:本地

  • IDRSRecordRemote:远程

userId

NSString

用户身份的唯一标识,推荐由数字或字母组成

appId

NSString

应用 ID,从控制台中的 应用管理 处获取

packageName

NSString

SDK 包名,从控制台中的 应用管理 处获取

ak

NSString

AccessKey,从控制台中的 用户管理 处获取

sk

NSString

SecretKey,从控制台中的 用户管理 处获取

modelType

IDRSModelType

需要初始化的功能。

如果本地无对应的资源则会先下载资源。

返回值

属性

类型

说明

success

MPIDRSSDK

MPIDRSSDK 实例

failure

NSError

报错信息

代码示例

NSString * userId = [[DemoSetting sharedInstance] userId];
IDRSModelType type = [DemoSetting getSettingConfig];
[MPIDRSSDK initWithRecordType:IDRSRecordLocal userId:userId appId:AppId packageName:PackageName AK:Ak SK:Sk model:type addDelegate:self  success:^(id responseObject) {    self->_idrs = responseObject;
    self->_idrs.nui_tts_delegate = self;
} failure:^(NSError *error) 
    [self showToastWith:@"Code: 1 msg: sdk init error" duration:2];
    NSLog(@"%@",error);
}];

修改录制类型

- (void)setRecordType:(IDRSRecordType)recordType;//实现初始化后更改录制类型

请求参数

参数

类型

说明

是否必须

recordType

IDRSRecordType

枚举值如下:

  • IDRSRecordLocal:本地

  • IDRSRecordRemote:远程

返回值

代码示例

[self.idrs setRecordType:IDRSRecordLocal];

设置人脸检测参数

- (void)setFaceDetectParameter:(float)value forKey:(idrs_face_param_type)key;

请求参数

参数

类型

说明

是否必须

value

float

详见代码中的枚举(阈值)

key

idrs_face_param_type

详见代码中的枚举

返回值

代码示例

[self.idrs setFaceDetectParameter:480 forKey:IDRS_FACE_PARAM_DETECT_IMG_SIZE];

检测人脸特征值

- (NSArray<FaceDetectionOutput *> *)detectFace:(nonnull IDRSFaceDetectParam *)faceDetectParam;

请求参数

参数

类型

说明

是否必须

dataType

IDRSFaceDetectInputType

详见代码中的枚举

inputAngle

float

检测角度,默认为 0

outputAngle

float

结果输出角度,默认为 0

output_flip_axis

float

镜像方式,默认为 0

buffer

CVPixelBufferRef

视频流信息

format

int

视频格式,默认为 0

image

UIImage

图片信息

data

char*

Data 数据信息

width

float

Data 宽度

height

float

Data 高度

supportFaceLiveness

bool

是否返回活体信息

supportFaceRecognition

bool

是否返回人脸特征值

faceNetType

int

检测实例选择

返回值

NSArray<FaceDetectionOutput *>

属性

类型

说明

rect

CGRect

面部表情区域

faceId

NSInteger

每个检测到的人脸有唯一的faceID

keyPoints

CGPoint

人脸 106 关键点的数组

score

CGFloat

人脸置信度

attributes

NSDictionary

人脸属性

feature

NSArray<NSNumber*>

人脸特征值

livenessType

int

活体结果

livenessScore

float

活体结果置信度

label

NSString

人脸名称/检测出结果可放入此处

faceAction

int

人脸动作,例如:

faceAction == 32(张嘴动作)

pitch

CGFloat

俯仰角

代码示例

        UIImage *decodedImage = [UIImage imageWithData: @"人脸照片.png"];
        IDRSFaceDetectParam *dete = [[IDRSFaceDetectParam alloc]init];
        dete.dataType = IDRSFaceDetectInputTypeImage;//使用图片检测
        dete.image = decodedImage;
        dete.inputAngle = 0;
        dete.outputAngle = 90;
        dete.supportFaceLiveness = true;
        dete.supportFaceRecognition = true;
        NSArray<FaceDetectionOutput *> *imageface = [self.idrs detectFace:dete];

人照比对

- (float)faceRecognitionSimilarity:(nonnull NSArray<NSNumber*>*)faceFea1
        feature2:(nonnull NSArray<NSNumber*>*)faceFea2;

请求参数

参数

类型

说明

是否必须

faceFea1

NSArray<NSNumber*>

faceFea1 的特征值

faceFea2

NSArray<NSNumber*>

faceFea2 的特征值

返回值

类型

说明

float

两张人脸的对比分数

代码示例

float score1 = [self.idrs faceRecognitionSimilarity:face.feature feature2:weakSelf.face1Feature];

用图片引擎做人脸追踪

- (void)faceTrackFromImage:(nonnull IDRSFaceDetectParam *)faceDetectParam
        faceDetectionCallback:(void (^)(NSError *error, NSArray<FaceDetectionOutput*> *faces))block;

请求参数

参数

类型

说明

是否必须

dataType

IDRSFaceDetectInputType

详见代码中的枚举

inputAngle

float

检测角度,默认为 0

outputAngle

float

结果输出角度,默认为 0

output_flip_axis

float

镜像方式,默认为 0

buffer

CVPixelBufferRef

视频流信息

format

int

视频格式,默认为 0

image

UIImage

图片信息

data

char*

Data 数据信息

width

float

Data 宽度

height

float

Data 高度

supportFaceLiveness

bool

是否返回活体信息

supportFaceRecognition

bool

是否返回人脸特征值

faceNetType

int

检测实例选择

返回值

NSArray<FaceDetectionOutput *>

属性

类型

说明

rect

CGRect

面部表情区域

faceId

NSInteger

每个检测到的人脸具有唯一的 faceID

keyPoints

CGPoint

人脸 106 关键点的数组

score

CGFloat

人脸置信度

attributes

NSDictionary

人脸属性

feature

NSArray<NSNumber*>

人脸特征值

livenessType

int

活体结果

livenessScore

float

活体结果置信度

label

NSString

此处可能是人脸名称或检测出的结果

faceAction

int

人脸动作,例如:

faceAction == 32(张嘴动作)

pitch

CGFloat

俯仰角

代码示例

        UIImage * image = [self getImageFromCameraVideo:sampleBuffer];
        IDRSFaceDetectParam *dete = [[IDRSFaceDetectParam alloc]init];
        dete.dataType = IDRSFaceDetectInputTypeImage;//使用图片检测
        dete.image = image;
        dete.inputAngle = 0;
        dete.outputAngle = 90;
        dete.supportFaceLiveness = true;
        dete.supportFaceRecognition = true;
    [self.idrs faceTrackFromVideo:detectParam faceDetectionCallback:^(NSError *error, NSArray<FaceDetectionOutput*> *faces) {
        if (faces.count > 0) {
            //检测到人脸
        }
    }];

用视频引擎中人脸追踪

- (void)faceTrackFromVideo:(nonnull IDRSFaceDetectParam *)faceDetectParam
        faceDetectionCallback:(void (^)(NSError *error, NSArray<FaceDetectionOutput*> *faces))faceDetectionCallbackBlock;

请求参数

参数

类型

说明

是否必须

dataType

IDRSFaceDetectInputType

详见代码中的枚举

inputAngle

float

检测角度,默认为 0

outputAngle

float

结果输出角度,默认为 0

output_flip_axis

float

镜像方式,默认为 0

buffer

CVPixelBufferRef

视频流信息

format

int

视频格式,默认为 0

image

UIImage

图片信息

data

char*

Data 数据信息

width

float

Data 宽度

height

float

Data 高度

supportFaceLiveness

bool

是否返回活体信息

supportFaceRecognition

bool

是否返回人脸特征值

faceNetType

int

检测实例选择

返回参数

NSArray<FaceDetectionOutput *>

属性

类型

说明

rect

CGRect

面部表情区域

faceId

NSInteger

每个检测到的人脸具有唯一的 faceID

keyPoints

CGPoint

人脸 106 关键点的数组

score

CGFloat

人脸置信度

attributes

NSDictionary

人脸属性

feature

NSArray<NSNumber*>

人脸特征值

livenessType

int

活体结果

livenessScore

float

活体结果置信度

label

NSString

此处可能是人脸名称或检测结果

faceAction

int

人脸动作,例如:

faceAction == 32(张嘴动作)

pitch

CGFloat

俯仰角

代码示例

    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        IDRSFaceDetectParam *detectParam = [[IDRSFaceDetectParam alloc]init];
    detectParam.dataType = IDRSFaceDetectInputTypePixelBuffer;
    detectParam.buffer = pixelBuffer;
    detectParam.inputAngle = inAngle;
    detectParam.outputAngle = outAngle;
    detectParam.supportFaceLiveness = YES;
    detectParam.supportFaceRecognition = true;
        [self.idrs faceTrackFromVideo:detectParam faceDetectionCallback:^(NSError *error, NSArray<FaceDetectionOutput *> *faces) {
        if (faces.count > 0) {
            //检测到人脸
        }
    }];

使用视频引擎中 RTC_远端窗口——人脸追踪

- (NSArray<FaceDetectionOutput *> *)detectFace:(nonnull IDRSFaceDetectParam *)faceDetectParam;

请求参数

参数

类型

说明

是否必须

dataType

IDRSFaceDetectInputType

详见代码中的枚举

inputAngle

float

检测角度,默认为 0

outputAngle

float

结果输出角度,默认为 0

output_flip_axis

float

镜像方式,默认为 0

buffer

CVPixelBufferRef

视频流信息

format

int

视频格式,默认为 0

image

UIImage

图片信息

data

char*

Data 数据信息

width

float

Data 宽度

height

float

Data 高度

supportFaceLiveness

bool

是否返回活体信息

supportFaceRecognition

bool

是否返回人脸特征值

faceNetType

int

检测实例选择

返回参数

NSArray<FaceDetectionOutput *>

属性

类型

说明

rect

CGRect

面部表情区域

faceId

NSInteger

每个检测到的人脸有唯一的 faceID

keyPoints

CGPoint

人脸 106 关键点的数组

score

CGFloat

人脸置信度

attributes

NSDictionary

人脸属性

feature

NSArray<NSNumber*>

人脸特征值

livenessType

int

活体结果

livenessScore

float

活体结果置信度

label

NSString

人脸名称或检测结果

faceAction

int

人脸动作,例如:

faceAction == 32(张嘴动作)

pitch

CGFloat

俯仰角

代码示例

//用data检测
uint8_t *data = [IDRSUtils convert420PixelBufferToRawData:newBuffer];
float width = CVPixelBufferGetWidth(newBuffer);
float height = CVPixelBufferGetHeight(newBuffer);
IDRSFaceDetectParam *detectParam = [[IDRSFaceDetectParam alloc]init];
detectParam.dataType = IDRSFaceDetectInputTypeChar;
detectParam.data = data;
detectParam.width = width;
detectParam.height = height;
detectParam.format = 0;
detectParam.inputAngle = 0;
detectParam.outputAngle = 0;
detectParam.faceNetType = 1;
detectParam.supportFaceRecognition = true;
detectParam.supportFaceLiveness = true;   
[self.idrs faceTrackFromRemoteVideo:detectParam faceDetectionCallback:^(NSError *error, NSArray<FaceDetectionOutput *> *faces) {
    if (faces.count > 0) {
        //检测到人脸
    }
}];
free(data);

设置手势检测参数

-(void)setHandDetectConfig:(nonnull IDRSHandDetectionConfig *)handDetectConfig;

请求参数

参数

类型

说明

是否必须

isFaceDetect

Boolean

是否开启动作主体识别

imgSize

NSInteger

手部检测输入的图像大小

classifyThreshold

float

手势识别阈值

phoneActionIOU

float

手持手机 IOU 阈值

phoneActionTime

float

手持手机时间阈值

phoneActionSign

float

手持手机签字阈值

phoneActionScroll

float

手持手机翻页阈值

interlacingBody

float

隔帧检测-火柴人的坐标

返回值

代码示例

IDRSHandDetectionConfig *handDetectConfig = [[IDRSHandDetectionConfig alloc] init];
handDetectConfig.imgSize = 480;
handDetectConfig.isFaceDetect = true;
handDetectConfig.classifyThreshold = 0.5;
handDetectConfig.phoneActionIOU = 0.0;
handDetectConfig.phoneActionTime = 0.0;
handDetectConfig.phoneActionSign = 0.03;//签字阈值,越小识别的越快(误差越大)
handDetectConfig.phoneActionScroll = 0.10;
handDetectConfig.interlacingBody = 5;
[self.idrs setHandDetectConfig:handDetectConfig];

检测动态手势

- (NSArray<HandDetectionOutput *> *)detectHandGesture:(nonnull IDRSHandDetectParam *)handParam;

请求参数

参数

类型

说明

是否必须

dataType

IDRSHandInputType

详见代码中的枚举

buffer

CVImageBufferRef

视频流数据

outAngle

float

结果输出角度,默认为 0

返回值

NSArray<HandDetectionOutput *>

属性

类型

说明

rect

CGRect

手区域

face_rect

CGRect

主体人脸区域

body_key_points

CGPoint

手属于的人体关键点

body_key_points_score

CGFloat

手属于的人体关键点的置信度

left_or_right

int

左手还是右手

handId

int

每个检测到的手拥有唯一的 handID

phone_touched

Boolean

是否手持手机

phone_touched_score

CGFloat

手持手机置信度

hand_phone_action

int

动态手势结果

hand_action_type

int

动态手势还是静态手势

pitchhand_static_action

int

静态手势结果

hand_static_action_score

float

静态手势分数

代码示例

IDRSHandDetectParam *handParam = [[IDRSHandDetectParam alloc]init];
handParam.dataType = IDRSHandInputTypeRGBA;
handParam.buffer = newBuffer;
handParam.outAngle = 0;
NSArray<HandDetectionOutput *> *handResults = [self.idrs detectHandGesture:handParam];
if(handResults.count > 0) {
    // 判断签字
    if (handResults[0].phone_touched_score>0) {
        //手写框
        dispatch_async(dispatch_get_main_queue(), ^{
            weakSelf.drawView.handDetectView.detectResult = handResults;
            if(handResults[0].hand_phone_action == 1 || handResults[0].hand_phone_action == 2) {
                self.resultLabel.text = @"签字成功";
                [self didsendMessage:@"签字成功" isOn:true type:0];
            }
       });
    }
}    

检测静态手势

- (NSArray<HandDetectionOutput *> *)detectHandStaticGesture:(nonnull IDRSHandDetectParam *)handParam;

请求参数

参数

类型

类型

是否必须

dataType

IDRSHandInputType

详见代码中的枚举

buffer

CVImageBufferRef

视频流数据

outAngle

float

结果输出角度,默认为 0

返回值

NSArray<HandDetectionOutput *>

属性

类型

说明

rect

CGRect

手区域

face_rect

CGRect

主体人脸区域

body_key_points

CGPoint

手属于的人体关键点

body_key_points_score

CGFloat

手属于的人体关键点的置信度

left_or_right

int

左手还是右手

handId

int

每个检测到的手拥有唯一的handID

phone_touched

Boolean

是否手持手机

phone_touched_score

CGFloat

手持手机置信度

hand_phone_action

int

动态手势结果

hand_action_type

int

动态手势还是静态手势

pitchhand_static_action

int

静态手势结果

hand_static_action_score

float

静态手势分数

代码示例

IDRSHandDetectParam *handParam = [[IDRSHandDetectParam alloc]init];
handParam.dataType = IDRSHandInputTypeRGBA;
handParam.buffer = newBuffer;
handParam.outAngle = 0;
NSArray<HandDetectionOutput *> *handResults = [self.idrs detectHandStaticGesture:handParam];
dispatch_async(dispatch_get_main_queue(), ^{
    if (handResults.count > 0) {
        weakSelf.drawView.handDetectView.detectResult = handResults;
        HandDetectionOutput *handResult = handResults[0];
        if (handResult.hand_action_type == 0 && handResult.hand_static_action > 0) {
            NSString *result = [self handStaticActionTypeToText:handResult.hand_static_action];
            self.resultLabel.text = result;
            [self didsendMessage:result isOn:true type:0];
        }
    }
});

签名类型检测

-(NSArray <IDRSSignConfidenceCheck *>*)checkSignClassifyWithCameraBuffer:(CVPixelBufferRef)cameraFrame AndROI:(NSArray<NSNumber*>*)roikey;

请求参数

参数

类型

说明

是否必须

cameraFrame

CVPixelBufferRef

相机流

roikey

NSArray<NSNumber*>

ROI 数组

返回值

NSArray <IDRSSignConfidenceCheck *>

属性

类型

说明

label

NSString

即签名类型,包括 hand、print 和 other

confidence

float

hand、print 和 other 对应的分数

说明

签名检测结果取分数最高的类型。

代码示例

CVPixelBufferRef newBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) ;
NSArray<NSNumber*> *kXMediaOptionsROIKey = @[@(0.2),@(0.2),@(0.6),@(0.6)];
NSArray<IDRSSignConfidenceCheck *>*sings = [self.idrs checkSignClassifyWithCameraBuffer:newBuffer AndROI:kXMediaOptionsROIKey];
dispatch_async(dispatch_get_main_queue(), ^{
    NSString*string = @"";
    float max = 0.0;
    for (IDRSSignConfidenceCheck* Confidence in sings) {
        if (Confidence.confidence > max) {
            string = Confidence.label;
            max = Confidence.confidence;
        }
    }
    if ([string isEqual:@"hand"] && max > 0.95) {
        self.resultLabel.text = [NSString stringWithFormat:@"手写体"];
        [self didsendMessage:@"检测到手写体" isOn:true type:0];
    }
 });

签名类型检测

-(NSArray <IDRSSignConfidenceCheck *>*)checkSignClassifyWithImage:(UIImage*)image AndROI:(NSArray<NSNumber*>*)roikey;

请求参数

参数

类型

说明

是否必须

image

UIIImage

图片

roikey

NSArray<NSNumber*>

ROI 数组

返回值

NSArray <IDRSSignConfidenceCheck *>

属性

类型

说明

label

NSString

即签名类型,包括 hand、print 和 other

confidence

float

hand、print 和 other 对应的分数

说明

签名检测结果取分数最高的类型。

代码示例

CVPixelBufferRef newBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) ;
UIImage * image = [self.idrs getImageFromRPVideo:newBuffer];
NSArray<NSNumber*> *kXMediaOptionsROIKey = @[@(0.2),@(0.2),@(0.6),@(0.6)];
NSArray<IDRSSignConfidenceCheck *>*sings = [self.idrs checkSignClassifyWithImage:image AndROI:kXMediaOptionsROIKey];
dispatch_async(dispatch_get_main_queue(), ^{
    NSString*string = @"";
    float max = 0.0;
    for (IDRSSignConfidenceCheck* Confidence in sings) {
        if (Confidence.confidence > max) {
            string = Confidence.label;
            max = Confidence.confidence;
        }
    }
    if ([string isEqual:@"hand"] && max > 0.95) {
        self.resultLabel.text = [NSString stringWithFormat:@"手写体"];
        [self didsendMessage:@"检测到手写体" isOn:true type:0];
    }
 });

检测身份证

- (IDCardDetectionOutput *)detectIDCard:(nonnull IDRSIDCardDetectParam *)idCardParam
                                 roiKey:(nonnull NSArray<NSNumber*>*)roiKey
                                 rotate:(NSNumber*)rotate
                          isFrontCamera:(BOOL)frontCamera
                    isDetectFrontIDCard:(BOOL)frontIDCard;

请求参数

参数

类型

说明

是否必须

dataType

IDRSIDCardInputType

输入数据类型

buffer

CVPixelBufferRef

视频 PixelBufferRef

image

UIImage

图片数据

baseBuffer

char*

视频 RGB 数据,需同时提供 baseBuffer、uvBuffer、width、height​

uvBuffer

char*

width

float

height

float

roiKey

NSArray<NSNumber*>

ROI 数组

rotate

NSNumber

检测角度

frontCamera

BOOL

是否为前置摄像头

frontIDCard

BOOL

是否检测身份证带人面

返回值

IDCardDetectionOutput

属性

类型

说明

name

NSString

姓名

sex

NSString

性别

nationality

NSString

民族

birth

NSString

出生

address

NSString

住址

num

NSString

身份证号

issue

NSString

签发机关

startDate

NSString

有效期开始时间

endDate

NSString

有效期结束时间

代码示例

BOOL isForont = weakSelf.isOCR_Front? true:false;
// 2. ocr身份证。
IDRSIDCardDetectParam *idCardParam = [[IDRSIDCardDetectParam alloc]init];
idCardParam.dataType = IDRSIDCardInputTypePixelBuffer;
idCardParam.buffer = newBuffer;
NSArray<NSNumber*> *kXMediaOptionsROIKey = @[@(0.2),@(0.2),@(0.6),@(0.6)];
IDCardDetectionOutput *ocrResult = [_idrs detectIDCard:idCardParam roiKey:kXMediaOptionsROIKey rotate:@(0) isFrontCamera:NO isDetectFrontIDCard:isForont];
if (ocrResult!=nil) {
    NSString *result = @"";
    if (ocrResult.num.length > 0) {
        result = ocrResult.num;//身份人像面信息
    }else if (ocrResult.startDate.length > 0){
        result = ocrResult.startDate;身份证国徽面信息
    }
    // 采集到了身份证信息
    dispatch_async(dispatch_get_main_queue(), ^{
        // 显示身份证信息
        self.resultLabel.text = result;
        [self didsendMessage:result isOn:true type:0];
    });
}

开启激活词检测

- (void)startDialog;

请求参数

返回值

代码示例

[self.idrs startDialog];

结束激活词检测

- (void)stopDialog;

请求参数

返回值

代码示例

[self.idrs stopDialog];

激活词外部输入数据

- (void)feedAudioFrame:(NSData*)voiceFrame;

请求参数

参数

类型

说明

是否必须

voiceFrame

NSData

必须是 PCM、单声道、16k 采样率的音频数据

返回值

代码示例

 //传给nuiSDK----需要16000数据
[self.idrs feedAudioFrame:srcData];

开始 TTS 合成

- (void)startTTSWithText:(NSString *)text;

请求参数

参数

类型

说明

是否必须

text

NSString

需要合成语音的文本

返回值

代码示例

[self.idrs startTTSWithText:@"我是测试文本"];

结束 TTS 合成

- (void)stopTTS;

请求参数

返回值

代码示例

[self.idrs stopTTS];

暂停当前播放

- (void)pauseTTS;

请求参数

返回值

代码示例

[self.idrs pauseTTS];

恢复当前播放

- (void)resumeTTS;

请求参数

返回值

代码示例

[self.idrs resumeTTS];

TTS 参数设置

- (void)setTTSParam:(NSString *)param
        value:(NSString *)value;

请求参数

参数

类型

说明

是否必须

param

NSString

参数包括:

  • font_name

  • speed_level

  • volume

  • pitch_level

value

NSString

参数值示例如下:

  • xiaoyun/xiaogang

  • (0,2]

  • [0,2]

  • [-500,500]

返回值

代码示例

[self.idrs setTTSParam:@"extend_font_name" value:@"xiaoyun"];//设置播报人
[self.idrs setTTSParam:@"speed_level" value:@"1"];//设置播报速度

获取 TTS 参数

-(NSString *)getTTSParam:(NSString *)param;

请求参数

参数

类型

说明

是否必须

param

NSString

参数包括:

  • font_name

  • speed_level

  • volume

  • pitch_level

返回值

类型

说明

NSString

对应 key 的 value 值

代码示例

NSString * speed = [self.idrs getTTSParam:@"speed_level"];//当前播放速度