coreML,vision浅析,官方demo分析

镇楼图



官方说明:

CoreML让你将很多机器学习模型集成到你的app中。除了支持层数超过30层的深度学习之外,还支持决策树的融合,SVM(支持向量机),线性模型。由于其底层建立在Metal 和Accelerate等技术上,所以可以最大限度的发挥CPU和GPU的优势。你可以在移动设备上运行机器学习模型,数据可以不离开设备直接被分析。

Vision:这部分是关于图像分析和图像识别的。其中包括人脸追踪,人脸识别,航标(landmarks),文本识别,区域识别,二维码识别,物体追踪,图像识别等。

其中使用的模型包括:Places205-GoogLeNet,ResNet50,Inception v3,VGG16。

这些模型最小的25M,对于app还是可以接受的,最大的有550M,不知道如何集成到app中。

NLPAPI:这部分是自然语言处理的API,包括语言识别,分词,词性还原,词性判定,实体辨识。

咱们先从比较简单的vision框架开始说起

一个大概的流程就是 :

第一步:先创建一个 识别请求(VNRequest的子类,具体要实现什么功能,就选择那个子类,比如区域识别就使用VNDetectRectanglesRequest,人脸识别就使用VNDetectFaceRectanglesRequest),

使用的构造器就是VNRequest类的构造器

public init(completionHandler: Vision.VNRequestCompletionHandler? = nil)

第二步:搞定构造方法中的这个参数completionHandler, completionHandler是在图片分析处理完成以后进行的回调的,也就是说咱们希望获得的数据就由他来提供,Vision.VNRequestCompletionHandler 的定义如下:

public typealias VNRequestCompletionHandler = (VNRequest, Error?) -> Swift.Void

第三步:创建一个执行一个加载目标图片并执行“识别请求(VNRequest)”的handler,创建这个handler需要使用的类是:VNImageRequestHandler,brief:Performs requests on a single image.

构造方法蛮多的,就不一一解释了,最主要的是把要处理的图片扔给它就OK了,

第四步:前面的工作做完就可以开始执行了

open func perform(_ requests: [VNRequest]) throws

他的参数就是咱们第一步创建的识别请求

下面来一段最简单的代码试一下

let faceDetectRequest =  VNDetectFaceRectanglesRequest { (request, error) in

//创建人脸识别请求

//VNDetectFaceRectanglesRequest这个类继承自VNImageBasedRequest,而VNImageBasedRequest继承自VNRequest

//关于VNRequest的几个属性呢都比较简单,一看即懂。比较重要的呢就是results这个集合,这个集合中装的就是vision框架后者model处理后的结果数据,具体使用后面再说

guard let detectFacerequest = request as? VNDetectFaceRectanglesRequest else

{

//获得被执行的识别请求,装的就是vision框架后者model处理后的结果数据

return

}

guard let results = detectFacerequest.results else { return}

//获取数据

for result in results{

guard let faceObservation = result as? VNFaceObservation else{return}

//results中元素一般情况下是VNObservation的子类对象,VNObservation中最重要的属性就是confidence,代表了识别结果的可能性,results数组中数据的顺序也是按照confidence进行排列的。VNFaceObservation继承自VNDetectedObjectObservation,VNDetectedObjectObservationopen中比较重要的属性是 var boundingBox: CGRect { get },boundingBox就是图片中人脸的位置,只不过要注意的就boundingBox是一个相对值,大于0小于1,实际使用需要进行转换,并且origin是从左下角开始的

let imageWidth = CGFloat(375.0)

let imageHeight = CGFloat(375.0 * (self.imageView.image?.size.height)! / (self.imageView.image?.size.width)!)

print("x:",(1.0-faceObservation.boundingBox.origin.x) * imageWidth,"y:",(1.0-faceObservation.boundingBox.origin.y)*imageHeight,"width:",faceObservation.boundingBox.size.width * imageWidth,"height:",faceObservation.boundingBox.height * imageHeight)

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

//这些代码就是对boundingBox进行转换的

let boundingView = UIView(frame: boundingFrame);

boundingView.backgroundColor = .clear;

boundingView.layer.borderColor = UIColor.red.cgColor;

boundingView.layer.borderWidth = 2.5

self.imageView.addSubview(boundingView)

}

}

let handle = VNImageRequestHandler(cgImage: imageData!)

//创建一个执行一个加载目标图片并执行“识别请求(VNRequest)”的handler

try! handle.perform([faceDetectRequest])

//执行识别请求

                                                                      来一张效果图


 9.12更新

人脸特征识别

先来张效果图

再来一张


不得不说,奥观海同志的脸识别度还是蛮高的,,,

人脸特征识别需要使用的类:VNDetectFaceLandmarksRequest VNFaceObservation VNFaceLandmarks2D VNFaceLandmarkRegion2D

还是按照原先的套路,咱们踏着小碎步一步一步来。。。

Step1:创建识别请求,这次要用的识别请求是:VNDetectFaceLandmarksRequest

let faceLandmarksRequest = VNDetectFaceLandmarksRequest(completionHandler: faceLandmarkdsBundler);



Step2:顺手创建一个回调handler

let faceLandmarkdsBundler : (VNRequest,Error?) -> Void = { (request, error) in

guard let landmarksRequest = request as? VNDetectFaceLandmarksRequest else {print("analysis error");return}

guard let results = landmarksRequest.results else {print("data error");return}

for obj  in results

{

guard let faceObservation = obj as? VNFaceObservation else {continue}

//前面这半段图样图森破,就不说了

loadFaceFeatures(feature: faceObservation.landmarks!.allPoints!)

}

}

详细说一下landmarks

这个属性是VNFaceLandmarks2D类型的,声明为:

open var landmarks: VNFaceLandmarks2D? { get }

landmarks在它所在的VNDetectFaceLandmarksRequest对象perform前为nil,perform以后,也就是说在回调的request中lanmarks才会有数据,具体数据就是人脸所有特征的点相对于图片的坐标。

VNFaceLandmarks2D 部分数据

allPoints : 所有特征点

faceContour:轮廓

leftEye:左眼

。。。

所有的特征都是VNFaceLandmarkRegion2D 类型的,在VNFaceLandmarkRegion2D
中,一个比较重要的属性和一个方法:

open var __normalizedPoints: UnsafePointer{ get }        

  open func __pointsInImage(imageSize: CGSize) -> UnsafePointer

这两个都是指针类型,指向的是一个装着特征点坐标的数组,第一个是相对于图片坐标系并且以1.0为图片尺寸的数组,第二个,是根据图片实际尺寸计算相对于图片坐标系并且单位为像素的数组。

Final Step:创建VNImageRequestHandler,然后perform 特征识别的request就ok了!

导入训练好的model,一个简单的人脸识别









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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • ML是什么? 。。。别想歪。。。你好污。。。 ML是Machine Learning的缩写,也就是‘机器学习’,这...
    FKSky阅读 15,011评论 8 31
  • 注意:更新iOS 9.3, and Swift 2.2- 2016年4月2日 原文https://www.rayw...
    Tippi阅读 4,300评论 0 2
  • 轻描淡写我变成了美人 笔尖轻触我就多了一只眼睛 鼠标舞动我瞬间风华绝代 你倾城一笑我的世界刹那间绚烂多彩
    邓晓骏阅读 215评论 0 1
  • 最近又开始有点闲鱼了,不知道干嘛。不知道为什么总是感觉人十分的累,没有力气,一点也不想动。有点困但是又睡不着,借了...
    yxw0729阅读 279评论 0 0