Core ML - 圖像分類Model

一、官方Demo下載地址

Download

二、簡介

該例子功能是:使用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個分類類別來識別一個圖像,如下面截圖所示:

image.png

四、示例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]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容