CoreML 是 Apple 今年 WWDC 新推出面向開發者的機器學習框架。
Apple 對于 Core ML 的介紹:
CoreML 讓你將很多機器學習模型集成到你的app中。除了支持層數超過30層的深度學習之外,還支持決策樹的融合,SVM(支持向量機),線性模型。由于其底層建立在Metal 和Accelerate等技術上,所以可以最大限度的發揮 CPU 和 GPU 的優勢。你可以在移動設備上運行機器學習模型,數據可以不離開設備直接被分析。
Core ML 讓所有的機器學習計算都在iOS設備本地進行,這一點依舊體現出蘋果對用戶隱私很看重.用蘋果的一張圖來看看 CoreML 的底層框架
- 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 Model 分成三部分,第一部分算是基本的描述,第二部分 ModelClass 是對應 Model 生成的 Source 點擊 Resnet50 末尾的小箭頭進入Resnet50.h 文件 可以看到對應 Model的類和方法如圖:
一共生成了三個類分別是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地址:git@github.com:spykerking/TestCoreML.git