Core ML框架研究与应用

Core ML允许你把多种机器学习模型集成到你的应用程序中。除了支持30层以上的广泛深入学习,它还支持标准模型,如树集成、支持向量机(SVMs)和广义线性模型。因为它是建立在低层次的技术,如金属和加速,Core ML无缝地利用CPUGPU提供最大的性能和效率的优势。您可以在设备上运行机器学习模型,数据不需要离开设备就可以进行分析。

利用Core ML我们可以学习多种机器学习模型并能更快的集成到开发程序中。其中包括SiriCameraQuickType等。Core ML框架的应用层包括VisionNatural Language ProcessingGamePlayKit。底层支持包括AccelerateBNNSMetal Performance Shaders

Core ML框架

Vision

Machine Learning Image Analysis - 机器学习之图片分析

- (void)machineLearningImageAnalysis{
    
    Resnet50 *resnetModel = [[Resnet50 alloc] init];
    
    UIImage *image = self.showimage.image;
    
    VNCoreMLModel *vnCoreModel = [VNCoreMLModel modelForMLModel:resnetModel.model error:nil];
    
    // Machine Learning Image Analysis
    VNCoreMLRequest *vnCoreRequest = [[VNCoreMLRequest alloc] initWithModel:vnCoreModel completionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
        
        CGFloat confidence = 0.0f;
        VNClassificationObservation *tempClassification = nil;
        for (VNClassificationObservation *classification in request.results) {
            if (classification.confidence > confidence) {
                confidence = classification.confidence;
                tempClassification = classification;
            }
        }
        
        NSLog(@"识别结果:%@",tempClassification.identifier);
        
        NSLog(@"匹配率:%f",tempClassification.confidence);
           
    } ];
    
    VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];
    
    NSError *error = nil;
    [vnImageRequestHandler performRequests:@[vnCoreRequest] error:&error];
    
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }
}

识别结果

CoreMLDemo[1467:915475] 识别结果:Granny Smith
CoreMLDemo[1467:915475] 匹配率:0.982098
图片识别.png

Face Detection 人脸检测

- (void)faceDetection{
    
    UIImage *image = self.showimage.image;
    
    // 区域识别就使用VNDetectRectanglesRequest,人脸识别就使用VNDetectFaceRectanglesRequest,
    VNDetectFaceRectanglesRequest *faceRectang = [[VNDetectFaceRectanglesRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
  
        // results这个集合,这个集合中装的就是vision框架后者model处理后的结果数据
        for (VNFaceObservation *faceObservation in request.results) {

            CGFloat imageWidth = self.showimage.frame.size.width;
            CGFloat imageHeight = self.showimage.frame.size.height;

            CGRect frame = CGRectMake(faceObservation.boundingBox.origin.x*imageWidth, ( 1.0-faceObservation.boundingBox.origin.y)*imageHeight-faceObservation.boundingBox.size.height * imageHeight, faceObservation.boundingBox.size.width*imageWidth,faceObservation.boundingBox.size.height*imageHeight);

            NSLog(@"faceObservation.boundingBox = %@",NSStringFromCGRect(faceObservation.boundingBox));

            UIView *faceView = [[UIView alloc] initWithFrame:frame];
            faceView.layer.borderWidth = 2.0;
            faceView.layer.borderColor = [UIColor redColor].CGColor;
            [self.showimage addSubview:faceView];

        }
        
    }];
    

    VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];
    
    NSError *error = nil;
    [vnImageRequestHandler performRequests:@[faceRectang] error:&error];
    
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }
    
}

检测结果

人脸检测

Face Recognition人脸识别

#pragma mark - 人脸识别
- (void)faceRecognition{
    
    
    UIImage *image = self.showimage.image;
    
    VNDetectFaceLandmarksRequest *faceRectang = [[VNDetectFaceLandmarksRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
        
        // 创建特征存储对象
        MLDetectModel *detectData = [[MLDetectModel alloc]init];
        
        NSLog(@"%lu",request.results.count);
        // 遍历出每个人的所有特征
        for (VNFaceObservation *faceObservation in request.results) {

            // 创建脸部模型,里面储存着脸部所有特征属性信息
            MLFaceModel *faceModel = [[MLFaceModel alloc] init];

            // 获取细节特征
            VNFaceLandmarks2D *landmarks = faceObservation.landmarks;
            
            [self getAllkeyWithClass:[VNFaceLandmarks2D class] isProperty:YES block:^(NSString *key) {
                // 过滤属性
                if ([key isEqualToString:@"allPoints"]) {
                    return;
                }
                
                // 获得对应细节具体特征,如,眉毛、鼻子、眼睛嘴巴等
                VNFaceLandmarkRegion2D *region2D = [landmarks valueForKey:key];
                
                // 特征存储对象进行存储
                [faceModel setValue:region2D forKey:key];
                [faceModel.allPoints addObject:region2D];
            }];
            
            faceModel.observation = faceObservation;
            
            [detectData.facePoints addObject:faceModel];
        }
        
        // 绘制脸部特征
        for (MLFaceModel *faceModel in detectData.facePoints) {

           self.showimage.image =  [self drawImage:self.showimage.image faceObservation:faceModel.observation detectArray:faceModel.allPoints];
        }
       
    }];
    
    VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];
    
    NSError *error = nil;
    [vnImageRequestHandler performRequests:@[faceRectang] error:&error];
    
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }
}
- (UIImage *)drawImage:(UIImage *)image faceObservation:(VNFaceObservation *)faceObservation detectArray:(NSArray *)detectArray{
    
    UIImage *sourceImage = image;
    
    // 遍历所有特征
    for (VNFaceLandmarkRegion2D *landmarks2D in detectArray) {
        
        CGPoint points[landmarks2D.pointCount];
        // 转换特征的所有点
        for (int i=0; i<landmarks2D.pointCount; i++) {

            CGPoint point = landmarks2D.normalizedPoints[I];
            CGFloat rectWidth = sourceImage.size.width * faceObservation.boundingBox.size.width;
            CGFloat rectHeight = sourceImage.size.height * faceObservation.boundingBox.size.height;
            CGPoint p = CGPointMake(point.x * rectWidth + faceObservation.boundingBox.origin.x * sourceImage.size.width, faceObservation.boundingBox.origin.y * sourceImage.size.height + point.y * rectHeight);
            points[i]  = p;
            
            [self.pointArray addObject:[NSValue valueWithCGPoint:p]];

        }
        
        UIGraphicsBeginImageContextWithOptions(sourceImage.size, false, 1);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [[UIColor redColor] set];
        CGContextSetLineWidth(context, 1.5);
        
        // 设置翻转
        CGContextTranslateCTM(context, 0, sourceImage.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        
        // 设置线类型
        CGContextSetLineJoin(context, kCGLineJoinRound);
        CGContextSetLineCap(context, kCGLineCapRound);
        
        // 设置抗锯齿
        CGContextSetShouldAntialias(context, true);
        CGContextSetAllowsAntialiasing(context, true);
        
        // 绘制
        CGRect rect = CGRectMake(0, 0, sourceImage.size.width, sourceImage.size.height);
        CGContextDrawImage(context, rect, sourceImage.CGImage);
        CGContextAddLines(context, points, landmarks2D.pointCount);
        
        CGContextDrawPath(context, kCGPathStroke);
        
        // 结束绘制
        sourceImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    
    return sourceImage;
}

Face Recognition人脸识别

Text Detection 文字识别

#pragma mark - 文字识别
- (void)textDetection{
    
    UIImage *image = self.showimage.image;
    
    VNDetectTextRectanglesRequest *textRectangRequset = [[VNDetectTextRectanglesRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
        
        NSLog(@"%lu",request.results.count);

        for (VNTextObservation *observation  in request.results) {
            for (VNRectangleObservation *rectangleObservation in observation.characterBoxes) {
                
                CGFloat imageWidth = self.showimage.frame.size.width;
                CGFloat imageHeight = self.showimage.frame.size.height;
                
                CGRect frame = CGRectMake(rectangleObservation.boundingBox.origin.x*imageWidth, ( 1.0-rectangleObservation.boundingBox.origin.y)*imageHeight-rectangleObservation.boundingBox.size.height * imageHeight, rectangleObservation.boundingBox.size.width*imageWidth,rectangleObservation.boundingBox.size.height*imageHeight);
                
                NSLog(@"faceObservation.boundingBox = %@",NSStringFromCGRect(rectangleObservation.boundingBox));
                
                UIView *faceView = [[UIView alloc] initWithFrame:frame];
                faceView.layer.borderWidth = 2.0;
                faceView.layer.borderColor = [UIColor redColor].CGColor;
                [self.showimage addSubview:faceView];

            }
        }

    }];
    
    [textRectangRequset setValue:@(YES) forKey:@"reportCharacterBoxes"]; // 设置识别具体文字
    
    VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];
    
    NSError *error = nil;
    [vnImageRequestHandler performRequests:@[textRectangRequset] error:&error];
    
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }
    
}

Text Detection 文字识别

研究未完待续,敬请期待······

参考链接:

machine learning
Core ML
Vision

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351