小编曾经多次提到过人脸检测和人脸是被技术,那么这些算法在第三方美颜sdk中有用吗?答案是肯定的,不止有用,而且还非常重要。我们可以将人脸识别算法分为基础层算法与应用层算法,开头提到的人脸检测,实际上是人脸识别的基础层算法。
基础层算法,相当于人脸的预处理。一张人脸,首先要经过人脸检测、特征关键点处理,质量模型过滤之后,才能到应用层算法做处理,并应用到实际场景中。基础层算法的优劣,很大程度上会影响最终改的人脸识别准确率和效果。
我们先来了解一下基础算法:
一、人脸检测
1、定义
将一张照片或一段视频中的人脸检测出来,并输入人脸矩阵坐标。
2、作用
用于截取人脸,用于后续的人脸比对、人脸搜索等算法。
3、原理
二分类模型,通过深度学习训练样本识别是否是人脸。
二、特征关键点
1、定义
检测到人脸后,将人脸的特征点标记出来,每个特征点都有属性,能表示是脸部位置。
2、作用
人脸摆正对齐:实际场景中,抓取的人脸一般不是正方向的,需要摆正后再进行人脸比对、搜索等;人脸处理:美颜sdk应用中的贴纸等人脸特效,需要检测到人脸特征关键点后,再对关键部位进行针对性处理。
3、原理
将人脸照片的关键点都坐上标记,通过深度学习、分类模型,让算法能检测到特征点并识别特征点的属性。
三、代码分析
//
// GPUImageMovieComposition.m
// Givit
//
// Created by Sean Meiners on 2013/01/25.
//
//
#import “GPUImageMovieComposition.h”
#import “GPUImageMovieWriter.h”
@implementation GPUImageMovieComposition
@synthesize compositon = _compositon;
@synthesize videoComposition = _videoComposition;
@synthesize audioMix = _audioMix;
-
(id)initWithComposition:(AVComposition*)compositon
andVideoComposition:(AVVideoComposition*)videoComposition
andAudioMix:(AVAudioMix*)audioMix {
if (!(self = [super init]))
{
return nil;
}[self yuvConversionSetup];
self.compositon = compositon;
self.videoComposition = videoComposition;
self.audioMix = audioMix;return self;
} -
(AVAssetReader*)createAssetReader
{
//NSLog(@“creating reader from composition: %@, video: %@, audio: %@ with duration: %@”, _compositon, _videoComposition, _audioMix, CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, _compositon.duration)));NSError *error = nil;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.compositon error:&error];NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)};
AVAssetReaderVideoCompositionOutput readerVideoOutput = [AVAssetReaderVideoCompositionOutput assetReaderVideoCompositionOutputWithVideoTracks:[_compositon tracksWithMediaType:AVMediaTypeVideo]
videoSettings:outputSettings];
#if ! TARGET_IPHONE_SIMULATOR
if( [_videoComposition isKindOfClass:[AVMutableVideoComposition class]] )
[(AVMutableVideoComposition)_videoComposition setRenderScale:1.0];
#endif
readerVideoOutput.videoComposition = self.videoComposition;
readerVideoOutput.alwaysCopiesSampleData = NO;
[assetReader addOutput:readerVideoOutput];NSArray *audioTracks = [_compositon tracksWithMediaType:AVMediaTypeAudio];
BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) );
AVAssetReaderAudioMixOutput *readerAudioOutput = nil;if (shouldRecordAudioTrack)
{
[self.audioEncodingTarget setShouldInvalidateAudioSampleWhenDone:YES];readerAudioOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:nil]; readerAudioOutput.audioMix = self.audioMix; readerAudioOutput.alwaysCopiesSampleData = NO; [assetReader addOutput:readerAudioOutput];
}
return assetReader;
}
@end