转载

使用CoreML图片识别

CoreML 是 Apple 今年 WWDC 新推出面向开发者的机器学习框架。

使用CoreML图片识别

图1

Apple 对于 Core ML 的介绍

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

Core ML 让所有的机器学习计算都在iOS设备本地进行,这一点依旧体现出苹果对用户隐私很看重.用苹果的一张图来看看 CoreML 的底层框架

使用CoreML图片识别

图2

  • vision:高性能的图像分析和图像识别。这部分应用于人脸追踪,人脸识别,文本识别,区域识别,二维码识别,物体追踪,图像识别等。

  • Nattural Language processing:自然语言处理。用于语言识别,分词,词性还原,词性判定等。

  • GamePlayKit:游戏制作,构建游戏。用于常见的游戏行为如随机数生成、人工智能、寻路、和代理行为。

Core ML 的底层是 Accelerate and BNNS 和 Metal Performance Shaders,框架集成了神经网络,并且内核优化了图形计算和大规模计算,让App充分使用GPU组件。

接下来我们来体验一下 CoreML,Apple 提供了一些常见的开源模型供大家使用,而且这些模型已经使用了 Core ML 模型格式。您可以自行下载这些模型,然后就可以开始在应用中使用它们了。你也可以使用其他第三方机器学习工具来创建和训练模型,将你自己创建的模型使用Core ML Tools 转换成 Core ML 就可以了。

这里下载 Apple 提供的 ResNet50 Model,将下载好的 Model 加入到项目工程中,点击可以看到

使用CoreML图片识别

图3.png

从上图可以看到 CoreML Model 分成三部分,第一部分算是基本的描述,第二部分 ModelClass 是对应 Model 生成的 Source 点击 Resnet50 末尾的小箭头进入Resnet50.h 文件 可以看到对应 Model的类和方法如图:

使用CoreML图片识别

图4.png

一共生成了三个类分别是Resnet50,Resnet50Input,Resnet50Output

Resnet50Input:用于你需要识别的参数,对应图3 第三部分的inputs  Resnet50Output: 用于输出鉴定结果,对应图3 第三部分的参数outputs  Resnet50Input需要传入的参数是CVPixelBufferRef,这里直接使用Vision将图片转换成可支持的数据类型。

具体核心识别代码:

Resnet50 *resnetModel = [[Resnet50 alloc] init];  UIImage *image = self.selectedImageView.image;  VNCoreMLModel *vnCoreModel = [VNCoreMLModel modelForMLModel:resnetModel.model error:nil];  VNCoreMLRequest *vnCoreMlRequest = [[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;         }     }      self.recognitionResultLabel.text = [NSString stringWithFormat:@"识别结果:%@",tempClassification.identifier];     self.confidenceResult.text = [NSString stringWithFormat:@"匹配率:%@",@(tempClassification.confidence)]; }];  VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:nil];  NSError *error = nil; [vnImageRequestHandler performRequests:@[vnCoreMlRequest] error:&error];  if (error) {     NSLog(@"%@",error.localizedDescription); }

这里使用Vision库中VNCoreMLModel , VNCoreMLRequest , VNImageRequestHandler

关键开始识别方法

[vnImageRequestHandler performRequests:@[vnCoreMlRequest] error:&error];

识别完成会回调vnCoreMlRequest 的completionHandler,其返回的结果是一个VNClassificationObservation数组,每一个VNClassificationObservation都是一个识别的结果,我们要从里面选出匹配率最高的一个结果出来。具体的Vision库使用可以看看官方文档:https://developer.apple.com/documentation/vision

VNClassificationObservation对象有两个参数

  • 1.confidence 识别率,值越高应该是越接近的

  • 2.identifier 识别结果

最后来看看CoreML的识别如何:

附上Demo地址:https://github.com/spykerking/TestCoreML

使用CoreML图片识别

图5

使用CoreML图片识别

图6

使用CoreML图片识别

图7

使用CoreML图片识别

图8

正文到此结束
Loading...