一、官方Demo下載地址
二、簡介
該例子功能是:使用Vision框架對圖片進(jìn)行預(yù)處理,并使用Core ML 模型對圖片進(jìn)行分類。
三、概述
使用Core ML框架,你可以使用經(jīng)過訓(xùn)練的機器學(xué)習(xí)模型對輸入的數(shù)據(jù)進(jìn)行分類。Vision框架和Core ML合作,把分類模型應(yīng)用于圖片,并對這些圖片進(jìn)行預(yù)處理,使機器學(xué)習(xí)任務(wù)更簡單、更可靠。
這個示例應(yīng)用程序使用開源的MobileNet模型(幾種可用分類模型
之一),用1000個分類類別來識別一個圖像,如下面截圖所示:

四、示例app簡介
想要查看示例app的實際運行情況,請構(gòu)建并運行這個項目,然后使用app中工具欄中的按鈕來拍攝或者從相冊中選取一個圖片。然后示例應(yīng)用使用Vision將Core ML模型作用于所選取的圖像,并將結(jié)果顯示在分類標(biāo)簽上并且顯示每個分類標(biāo)簽前有其置信級別的數(shù)字。它按照分類模型分配給每個分類的置信度,顯示置信度靠前的兩個分類。
五、結(jié)合Core ML Model 建立Vision
Core ML 自動生成一個Swift類,提供方便訪問您的ML模型的方法;在這個示例中,Core ML根據(jù)MobileNet模型自動生成了MobileNet類。用這個模型創(chuàng)建一個Vision request,請創(chuàng)建該類的一個實例,并用它的model屬性來創(chuàng)建和一個VNCoreMLRequest對象。使用請求對象的完成處理程序指定一個執(zhí)行請求后從模型接收結(jié)果的方法。
let model = try VNCoreMLModel(for: MobileNet().model)
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
return request
ML模型是以固定寬高比來處理圖像,但是輸入的圖像可能是任意寬高比,所以Vision必須對圖像進(jìn)行縮放或者裁剪來進(jìn)行適配。為了獲得最佳效果,設(shè)置request的imageCropAndScaleOption屬性來匹配模型所訓(xùn)練的圖像布局。對于可用分類模型,除非有其他說明,否則VNImageCropAndScaleOption.centerCrop選項是合適的。
六、運行Vision Request
使用要處理的圖像創(chuàng)建VNImageRequestHandler對象,并把requests作為參數(shù)傳給這個對象的perform(_:)方法。這個方法同步運行,使用后臺隊列,這樣當(dāng)你執(zhí)行請求的時候不會阻塞主隊列。
DispatchQueue.global(qos: .userInitiated).async {
let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
do {
try handler.perform([self.classificationRequest])
} catch {
/*
This handler catches general image processing errors. The `classificationRequest`'s
completion handler `processClassifications(_:error:)` catches errors specific
to processing that request.
*/
print("Failed to perform classification.\n\(error.localizedDescription)")
}
}
大部分圖像都針對已經(jīng)正確定位顯示的圖像進(jìn)行訓(xùn)練的。要確保正確處理輸入的具有任意方向的圖片,請將圖像的方向傳遞給圖像請求的處理程序。(這個示例app將CGImagePropertyOrientation類型作為初始值設(shè)定項添加到初始化器init(_:),用于從UIImage.Orientation的方向值進(jìn)行轉(zhuǎn)換。
七、處理圖像分類結(jié)果
Vision 請求的完成處理程序會指示請求是成功還是錯誤。如果成功,它的results屬性包含VNClassificationObservation對象,該對象描述ML模型識別出的可能分類。
func processClassifications(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
guard let results = request.results else {
self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
return
}
// The `results` will always be `VNClassificationObservation`s, as specified by the Core ML model in this project.
let classifications = results as! [VNClassificationObservation]