簡體   English   中英

.h5 keras model 到 coreml 的分類轉換在 IOS 中不起作用

[英].h5 keras model to coreml conversion for classification does not work in IOS

我使用 RGB 圖像作為輸入訓練了一個 CNN 分類 model,它產生 1x7 output,概率為 class 標簽(7 個不同的類別)。 我已將 model 從 keras.h5 轉換為 coreML。 我見過不同的應用程序,並在定義和不定義 class 標簽的情況下嘗試了它們。 他們在轉換時沒有引起任何問題。 但是它們都不能在 IOS 中工作。 當我調用以下行時,兩種模型都會崩潰:

 guard let result = predictionRequest.results as? [VNCoreMLFeatureValueObservation] else {
        fatalError("model failed to process image")
    }

我的兩種型號的 Output 定義如下。 您能否告知 model output 有什么問題。 我是否必須添加 class 標簽? 我很困惑如何調用最高可能值。 我也添加了整個分類代碼。 請看下文。 由於我是 IOS 的初學者,非常感謝您的幫助。 確實非常感謝。

Model output 定義在 IOS 與 class 標簽轉換:

/// Identity as dictionary of strings to doubles
lazy var Identity: [String : Double] = {
    [unowned self] in return self.provider.featureValue(for: "Identity")!.dictionaryValue as! [String : Double]
}()


/// classLabel as string value
lazy var classLabel: String = {
    [unowned self] in return self.provider.featureValue(for: "classLabel")!.stringValue
}()

Model output 定義在 IOS 沒有 class 標簽轉換:

init(Identity: MLMultiArray) {
    self.provider = try! MLDictionaryFeatureProvider(dictionary: ["Identity" : MLFeatureValue(multiArray: Identity)])
}

分類代碼:

class ColorStyleVisionManager: NSObject {
static let shared = ColorStyleVisionManager()
static let MODEL = hair_color_class_labels().model
var colorStyle = String()
var hairColorFlag: Int = 0
private lazy var predictionRequest: VNCoreMLRequest = {
    do{
        let model = try VNCoreMLModel(for: ColorStyleVisionManager.MODEL)
       
        let request = VNCoreMLRequest(model: model)
        request.imageCropAndScaleOption = VNImageCropAndScaleOption.centerCrop
        return request
    } catch {
        fatalError("can't load Vision ML Model")
    }
}()


func predict(image:CIImage) -> String {
    

    guard let result = predictionRequest.results as? [VNCoreMLFeatureValueObservation] else {
        fatalError("model failed to process image")
    }
    
    let firstResult = result.first


    if firstResult?.featureName == "0" {
            colorStyle = "Plain Coloring"
            hairColorFlag = 1
        }
        else if firstResult?.featureName == "1" {
            colorStyle = "Ombre"
            hairColorFlag = 2
        }
        else if firstResult?.featureName == "2" {
            colorStyle = "Sombre"
            hairColorFlag = 2
        }
        else if firstResult?.featureName == "3" {
            colorStyle = "HighLight"
            hairColorFlag = 3
        }
        else if firstResult?.featureName == "4" {
            colorStyle = "LowLight"
            hairColorFlag = 3
        }
        else if firstResult?.featureName == "5" {
            colorStyle = "Color Melt"
            hairColorFlag = 5
        }
        else if firstResult?.featureName == "6" {
            colorStyle = "Dip Dye"
            hairColorFlag = 4
        }

    else {}

    let handler = VNImageRequestHandler(ciImage: image)


    do {
            try handler.perform([predictionRequest])
        } catch {
            print("error handler")
        }

    
    return colorStyle
}

}

我在我的代碼中發現了兩個不同的問題。 為了確保我的 model 正確轉換為 mlmodel,我使用 Apple 的 CreateML 工具創建了一個新的分類 mlmodel。 順便說一句,即使准確度似乎低於我原來的 model,它也很棒。 我比較了 output 和 model 的輸入類型,似乎我的 mlmodel 也是正確的。 然后我使用了這個 model 並再次嘗試。 它又崩潰了。 我不太確定我必須期待“VNClassificationObservation”還是“VNCoreMLFeatureValueObservation”的預測結果。 我改為分類觀察。 它又崩潰了。 然后我意識到我的處理程序定義在崩潰線下方,我將它移到了上部。 然后是羊毛。 有效。 我通過更改 FeatureValueObservation 進行了仔細檢查,它再次崩潰了。 這樣兩個問題就解決了。 請參閱下面的正確代碼。

我強烈建議使用 CreateML 工具來確認您的 model 轉換工作正常以用於調試目的。 這只是幾分鍾的工作。

class ColorStyleVisionManager: NSObject {
static let shared = ColorStyleVisionManager()
static let MODEL = hair_color_class_labels().model
var colorStyle = String()
var hairColorFlag: Int = 0
private lazy var predictionRequest: VNCoreMLRequest = {
    do{
        let model = try VNCoreMLModel(for: ColorStyleVisionManager.MODEL)
       
        let request = VNCoreMLRequest(model: model)
        request.imageCropAndScaleOption = VNImageCropAndScaleOption.centerCrop
        return request
    } catch {
        fatalError("can't load Vision ML Model")
    }
}()


func predict(image:CIImage) -> String {
    
    let handler = VNImageRequestHandler(ciImage: image)


    do {
            try handler.perform([predictionRequest])
        } catch {
            print("error handler")
        }

    guard let result = predictionRequest.results as? [VNClassificationObservation] else {
        fatalError("error to process request")
    }
    
    let firstResult = result.first
    print(firstResult!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM