专栏首页IT派讲解 Vision 图像识别框架 API详解

讲解 Vision 图像识别框架 API详解

本篇文章主要简单介绍下其中的 Vision API 的使用(Vision更强大的地方是可以结合Core ML模型实现更强大的功能,本篇文章就不详细展开了)

Vison 与 Core ML 的关系

Vision 是 Apple 在 WWDC 2017 推出的图像识别框架。

Core ML 是 Apple 在 WWDC 2017 推出的机器学习框架。

Core ML

根据这张图就可以看出,Core ML的作用就是将一个Core ML模型,转换成我们的App工程可以直接使用的对象,就是可以看做是一个模型的转换器。

Vision在这里的角色,就是相当于一个用于识别Core ML模型的一个角色.

Vision

根据官方文档看,Vision 本身就有Face Detection and Recognition(人脸检测识别)、Machine Learning Image Analysis(机器学习图片分析)、Barcode Detection(条形码检测)、Text Detection(文本检测)。。。。。等等这些功能。

所以可以这样理解:

Vision库里本身就已经自带了很多训练好的Core ML模型,这些模型是针对上面提到的人脸识别、条形码检测等等功能,如果你要实现的功能刚好是Vision库本身就能实现的,那么你直接使用Vision库自带的一些类和方法就行,但是如果想要更强大的功能,那么还是需要结合其它Core ML模型。

Vision 与 Core ML 总结

Core ML可以看做一个模型的转换器,可以将一个 ML Model 格式的模型文件自动生成一些类和方法,可以直接使用这些类去做分析,让我们更简单的在app中使用训练好的模型。

Vision本身就是能对图片做分析,他自带了针对很多检测的功能,相当于内置了一些Model,另外Vision也能使用一个你设置好的其它的Core ML Model来对图进行分析。

Vision就是建立在Core ML层之上的,使用Vision其实还是用到了Core ML,只是没有显式地直接写Core ML的代码而已。

Vison 的应用场景

图像配准

矩形检测

二维码/条形码检测

目标跟踪:脸部,矩形和通用模板

文字检测:监测文字外框,和文字识别

人脸检测:支持检测笑脸、侧脸、局部遮挡脸部、戴眼镜和帽子等场景,可以标记出人脸的矩形区域

人脸特征点:可以标记出人脸和眼睛、眉毛、鼻子、嘴、牙齿的轮廓,以及人脸的中轴线

Vison 的设计理念

苹果最擅长的,把复杂的事情简单化,Vision的设计理念也正是如此。

对于使用者我们抽象的来说,我们只需要:提出问题-->经过机器-->得到结果。

开发者不需要是计算机视觉专家,开发者只需要得到结果即可,一切复杂的事情交给Vision。

Vison 的性能对比

Vision 与 iOS 上其他几种带人脸检测功能框架的对比:

根据官方提供的资料可以看出来,Vision 和 Core Image、AV Capture 在精确度,耗时,耗电量来看基本都是Best、Fast、Good。

Vision 支持的图片类型

Vision 支持多种图片类型,如:

  • CIImage
  • NSURL
  • NSData
  • CGImageRef
  • CVPixelBufferRef
  • Vison 的使用 与结构图

Vision使用中的角色有:

Request,RequestHandler,results和results中的Observation数组。

结果图

Request类型:

有很多种,比如图中列出的 人脸识别、特征识别、文本识别、二维码识别等。

结果图

使用概述:

我们在使用过程中是给各种功能的 Request 提供给一个 RequestHandler,Handler 持有需要识别的图片信息,并将处理结果分发给每个 Request 的 completion Block 中。可以从 results 属性中得到 Observation 数组。

observations数组中的内容根据不同的request请求返回了不同的observation,如:VNFaceObservation、VNTextObservation、VNBarcodeObservation、VNHorizonObservation,不同的Observation都继承于VNDetectedObjectObservation,而VNDetectedObjectObservation则是继承于VNObservation。每种Observation有boundingBox,landmarks等属性,存储的是识别后物体的坐标,点位等,我们拿到坐标后,就可以进行一些UI绘制。

具体人脸识别使用示例:

1,创建处理图片处理对应的RequestHandler对象。

// 转换CIImage CIImage *convertImage = [[CIImage alloc]initWithImage:image]; // 创建处理requestHandler VNImageRequestHandler *detectRequestHandler = [[VNImageRequestHandler alloc]initWithCIImage:convertImage options:@{}];

2, 创建回调Handler。(用于识别成功后进行回调执行的一个Block)

// 设置回调 CompletionHandler completionHandler = ^(VNRequest *request, NSError * _Nullable error) { NSArray *observations = request.results; };

3, 创建对应的识别 Request 请求,指定 Complete Handler

VNImageBasedRequest *detectRequest = [[VNDetectFaceRectanglesRequest alloc]initWithCompletionHandler: completionHandler];

4,发送识别请求,并在回调中处理回调接受的数据

[detectRequestHandler performRequests:@[detectRequest] error:nil];

代码整合:

总的来说一共经过这几步之后基本的人脸识别就实现了。

// 转换CIImage CIImage *convertImage = [[CIImage alloc]initWithImage:image]; // 创建处理requestHandler VNImageRequestHandler *detectRequestHandler = [[VNImageRequestHandler alloc]initWithCIImage:convertImage options:@{}]; // 设置回调 CompletionHandler completionHandler = ^(VNRequest *request, NSError * _Nullable error) { NSArray *observations = request.results; [self handleImageWithType:type image:image observations:observations complete:complete]; }; // 创建BaseRequest VNImageBasedRequest *detectRequest = [[VNDetectFaceRectanglesRequest alloc]initWithCompletionHandler:completionHandler]; // 发送识别请求 [detectRequestHandler performRequests:@[detectRequest] error:nil];

VNFaceObservation 介绍:

VNFaceObservation里面,我们能拿到的有用信息就是boundingBox。

/// 处理人脸识别回调+ (void)faceRectangles:(NSArray *)observations image:(UIImage *_Nullable)image complete:(detectImageHandler _Nullable )complete{ NSMutableArray *tempArray = @[].mutableCopy; for (VNFaceObservation *observation in observations) { CGRect faceRect = [self convertRect:observation.boundingBox imageSize:image.size]; }

boundingBox直接是CGRect类型,但是boundingBox返回的是x,y,w,h的比例,需要进行转换。

/// 转换Rect+ (CGRect)convertRect:(CGRect)oldRect imageSize:(CGSize)imageSize{ CGFloat w = oldRect.size.width * imageSize.width; CGFloat h = oldRect.size.height * imageSize.height; CGFloat x = oldRect.origin.x * imageSize.width; CGFloat y = imageSize.height - (oldRect.origin.y * imageSize.height) - h; return CGRectMake(x, y, w, h); }

关于Y值为何不是直接oldRect.origin.y * imageSize.height出来,是因为这个时候直接算出来的脸部是MAX Y值而不是min Y值,所以需要进行转换一下。

特征识别介绍:

VNDetectFaceLandmarksRequest 特征识别请求返回的也是VNFaceObservation,但是这个时候VNFaceObservation 对象的 landmarks 属性就会有值,这个属性里面存储了人物面部特征的点。

如:

// 脸部轮廊@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nonnull faceContour;// 左眼,右眼@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable leftEye;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable rightEye;// 鼻子,鼻嵴@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable nose;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable noseCrest;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable medianLine;// 外唇,内唇@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable outerLips;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable innerLips;// 左眉毛,右眉毛@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable leftEyebrow;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable rightEyebrow;// 左瞳,右瞳@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable leftPupil;@property (nonatomic, strong) VNFaceLandmarkRegion2D * _Nullable rightPupil;

每个特征对象里面都有一个pointCount属性,通过特征对象的pointAtIndex方法,可以取出来特征里面的每一个点,我们拿到点进行转换后,相应的UI绘制或其他操作。

例如:

UIImage *sourceImage = image; // 遍历所有特征 for (VNFaceLandmarkRegion2D *landmarks2D in pointArray) { CGPoint points[landmarks2D.pointCount]; // 转换特征的所有点 for (int i=0; i

Vision Demo演示:

图像识别:

以上是简单列举了一些代码,具体更详细的可参考官方文档或Demo代码(后面有Demo 下载链接)

下面GIF演示一下Vision Demo ,此Demo比较简单,演示了基本的一些Vision的使用

图像识别:

人脸识别、特征识别、文字识别

http://cc.cocimg.com/api/uploads/20170801/1501556701427095.gif

动态识别:

动态监测人脸,动态进行添加

http://cc.cocimg.com/api/uploads/20170801/1501556710223864.gif

Demo下载地址

https://github.com/DaSens/Vision_Demo

https://github.com/DaSens/Vision_Track.git

本文分享自微信公众号 - IT派(it_pai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 入门 | 了解神经网络,你需要知道的名词都在这里

    近日,Mate Labs 联合创始人兼 CTO 在 Medium 上撰文《Everything you need to know about Neural Ne...

    IT派
  • 一个Python自动提取内容摘要的实践

    利用计算机将大量的文本进行处理,产生简洁、精炼内容的过程就是文本摘要,人们可通过阅读摘要来把握文本主要内容,这不仅大大节省时间,更提高阅读效率。但人工摘要耗时又...

    IT派
  • 常见面试之机器学习算法思想简单梳理

    导语:今天小编从别的地方推送一篇更广泛的文章供你们学习参考,总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想,希望对大家找机器学习岗位时有点帮助...

    IT派
  • 关于网络出现所谓“安恒公司泄露内部及客户资料漏洞”事情的公告

      8月20日,在国内漏洞平台wooyun网上,有昵称为“淡漠天空”的ID,向网站提交漏洞标题为“杭州安恒信息技术有限公司可泄露内部及客户资料”的漏洞条目。由此...

    安恒信息
  • Java单体应用 - Markdown - 01.简介

    原文地址:http://www.work100.net/training/monolithic-markdown.html

    光束云
  • 什么是Photon?

    Photon就是以前SmartMesh生态的SmartRaiden,Photon network是Spectrum的链下扩展解决方案,能够实现即时、低费用和可扩...

    rectinajh
  • OLEDB 枚举数据源

    在之前的程序中,可以看到有这样一个功能,弹出一个对话框让用户选择需要连接的数据源,并输入用户名和密码,最后连接;而且在一些数据库管理软件中也提供这种功能——能够...

    Masimaro
  • MVC Scaffolding SmartCode-Engine 更新

    通过扩展visual studio.net scaffolding组件,添加了一套功能完善的代码模板,包括Controller,Model,View,Busin...

    阿新
  • OpenAI号召开发人工智能警察

    据《连线》杂志2016年8月报道,受埃隆·马斯克(Elon Musk)支持的OpenAI研究所(开放人工智能研究所)计划公开其人工智能研究成果,...

    人工智能快报
  • 转帖--Windows Phone 7开发环境搭建

    下文转自WPmind:Windows Phone 7开发环境搭建     在6月22日我们WPMind组织的Windows Phone 7开发技术线上活动结束后...

    ShiJiong

扫码关注云+社区

领取腾讯云代金券