CoreML 是 Apple 今年 WWDC 新推出面向開發(fā)者的機器學習框架弓千。
Apple 對于 Core ML 的介紹:
CoreML 讓你將很多機器學習模型集成到你的app中洋访。除了支持層數(shù)超過30層的深度學習之外姻政,還支持決策樹的融合,SVM(支持向量機)鹊碍,線性模型妹萨。由于其底層建立在Metal 和Accelerate等技術上炫欺,所以可以最大限度的發(fā)揮 CPU 和 GPU 的優(yōu)勢品洛。你可以在移動設備上運行機器學習模型,數(shù)據(jù)可以不離開設備直接被分析帽揪。
Core ML 讓所有的機器學習計算都在iOS設備本地進行,這一點依舊體現(xiàn)出蘋果對用戶隱私很看重.用蘋果的一張圖來看看 CoreML 的底層框架
- vision:高性能的圖像分析和圖像識別转晰。這部分應用于人臉追蹤,人臉識別,文本識別,區(qū)域識別,二維碼識別,物體追蹤,圖像識別等查邢。
- Nattural Language processing:自然語言處理扰藕。用于語言識別,分詞未桥,詞性還原冬耿,詞性判定等淆党。
- GamePlayKit:游戲制作,構建游戲讶凉。用于常見的游戲行為如隨機數(shù)生成懂讯、人工智能台颠、尋路、和代理行為串前。
Core ML 的底層是 Accelerate and BNNS 和 Metal Performance Shaders,框架集成了神經(jīng)網(wǎng)絡,并且內核優(yōu)化了圖形計算和大規(guī)模計算,讓App充分使用GPU組件荡碾。
接下來我們來體驗一下 CoreML,Apple 提供了一些常見的開源模型供大家使用坛吁,而且這些模型已經(jīng)使用了 Core ML 模型格式拨脉。您可以自行下載這些模型,然后就可以開始在應用中使用它們了矛缨。你也可以使用其他第三方機器學習工具來創(chuàng)建和訓練模型,將你自己創(chuàng)建的模型使用Core ML Tools 轉換成 Core ML 就可以了箕昭。
這里下載 Apple 提供的 ResNet50 Model,將下載好的 Model 加入到項目工程中,點擊可以看到
從上圖可以看到 CoreML Model 分成三部分,第一部分算是基本的描述,第二部分 ModelClass 是對應 Model 生成的 Source 點擊 Resnet50 末尾的小箭頭進入Resnet50.h 文件 可以看到對應 Model的類和方法如圖:
一共生成了三個類分別是Resnet50闷串,Resnet50Input烹吵,Resnet50Output
Resnet50Input:用于你需要識別的參數(shù),對應圖3 第三部分的inputs
Resnet50Output: 用于輸出鑒定結果,對應圖3 第三部分的參數(shù)outputs
Resnet50Input需要傳入的參數(shù)是CVPixelBufferRef,這里直接使用Vision將圖片轉換成可支持的數(shù)據(jù)類型桨武。
具體核心識別代碼:
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
數(shù)組,每一個VNClassificationObservation
都是一個識別的結果,我們要從里面選出匹配率最高的一個結果出來呀酸。具體的Vision庫使用可以看看官方文檔https://developer.apple.com/documentation/vision
VNClassificationObservation對象有兩個參數(shù)
1.confidence 識別率,值越高應該是越接近的
2.identifier 識別結果
最后來看看CoreML的識別如何:
附上Demo地址:git@github.com:spykerking/TestCoreML.git