coreMl-机器学习,iOS11的主要新特性之一
苹果WWDC 2017年度开发者大会结束一段时间,苹果发布了很多硬家伙的同时也有不少软东西,今天我们重点来略查看下coreML,这个机器学习的领域,苹果来分梨了。
coreML是什么
苹果的说法:A trained model is the result of applying a machine learning algorithm to a set of training data. The model makes predictions based on new input data. For example, a model that's been trained on a region's historical house prices may be able to predict a house's price when given the number of bedrooms and bathrooms.
Core ML is the foundation for domain-specific frameworks and functionality. Core ML supports Vision for image analysis, Foundation for natural language processing (for example, the
NSLinguisticTagger
class), and GameplayKit for evaluating learned decision trees. Core ML itself builds on top of low-level primitives like Accelerate and BNNS, as well as Metal Performance Shaders.
也就是说,coreML可以集成很多机器学习的训练模型到你的app进行一系列模型反射输出,它不仅支持层数超过30层的深度学习之外,还支持决策树的融合,SVM(支持向量机),线性模型。由于其底层建立在Metal 和Accelerate等技术上,所以可以最大限度的发挥 CPU 和 GPU 的优势,我们可以直接在苹果机器(iOS11以上)运行和使用模型,盗苹果图:
coreML构成
再来张图看看ML构成:
Vision:这部分是关于图像分析和图像识别的。其中包括人脸追踪,人脸识别,航标(landmarks),文本识别,区域识别,二维码识别,物体追踪,图像识别等。
natural language processing:这部分是自然语言处理的API,包括语言识别,分词,词性还原,词性判定,实体辨识。
GamePlayKit:这部分的话,应该是制作游戏时候,提供一些随机数生成,寻找路径(pathfinding),代理等操作,类人工智能的库。
它的底层由 Accelerate and BNNS((Basic neural network subroutines)) 和 Metal Performance Shaders(卷积神经网络(CNN)使用先前获得的训练数据实现和运行深入学习。CNN是一种机器学习技术,它尝试将视觉皮层建模为卷积,整流,合并和归一化步骤的序列。),框架集成了神经网络,并且内核优化了图形计算和大规模计算,让App充分使用GPU
学习模型,我看来就是通过大量数据->规则算法->封装成模型->负反馈优化算法模型
coreML模型
看看苹果提供了什么接地气让我们对接使用模型的办法和资源
上图是苹果支持的对应的模型及三方转换,可以对号入座,除此之外,我们也可以通过开放的转换工具对三方训练模型进行转换为coreML即可,同时也有开放一些开源的模型供开发者下载使用(主要支持Keras, Caffe, scikit-learn, libsvm, and XGBoost.),接下来,我们来使用开源模型试试看。
实操
开源的模型大小从25M到550M的不等,我选了个中等的,100多M的Resnet50,主要是图像识别
下载加入到工程,点击可以看到模型的基本信息,主要有三个部分
基本描述,生成的资源类,以及输入参数,输出参数(使用前详细看看),生成的类也主要包括三个部分,输入模型,输出模型,以及输入参数的基本转换方法(嗯,看上去基本够用了)
直接上代码先:
//vision基本处理
Resnet50 *resnetModel = [[Resnet50 alloc] init];
VNCoreMLModel *vnCoreModel = [VNCoreMLModel modelForMLModel:resnetModel.model error:nil];
__weak typeof(ViewController) *weakSelf = self;
VNCoreMLRequest *vnCoreMlRequest = [[VNCoreMLRequest alloc] initWithModel:vnCoreModel completionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
for(VNClassificationObservation *classification in request.results){
NSLog(@"是什么来的====%@ 识别率=====%@", classification.identifier,@( classification.confidence));
}
[weakSelf arraySortDescL:request.results];
}];
VNImageRequestHandler *vnImageRequestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:nil];
NSError *error = nil;
[vnImageRequestHandler performRequests:@[vnCoreMlRequest] error:&error];
if (error) {
NSLog(@"error ========= %@",error.localizedDescription);
}
//模型提供
CGSize size = CGSizeMake(224, 224);
UIImage *needImage = [self changeImage:image size:size];
CVPixelBufferRef imageRef = [self pixelBufferFromCGImage:needImage.CGImage];
Resnet50 *resnet50Model2 = [[Resnet50 alloc] init];
NSError *error2 = nil;
Resnet50Output *output = [resnet50Model2 predictionFromImage:imageRef
error:&error];
if (error2 == nil) {
NSLog(@"是什么来的====%@ 附加信息=====%@", output.classLabel,output.classLabelProbs);
} else {
NSLog(@"Error=======%@", error2.localizedDescription);
}
两种方式都可以对输入参数进行模型输出,一个是vision基本处理,图像类的可以通过vision处理,处理图像的模型选择你想要的就行,多个结果输出,一个是模型提供的方法,单个结果输出。其中第一种使用到了vision这个图像识别分析的库,主要用到了VNCoreMLModel,VNCoreMLRequest, VNImageRequestHandler,输出的结果为VNClassificationObservation类的集合数组,这是模型分析处理的预测结果,匹配率不一致,择优, vision更多使用请看herehere:
最后来看看效果如何:
二哈镇楼
最后说一句,xcode9模拟器多了真机外框,贼好看...