![](/img/trans.png)
[英]Convert trained Keras image classification model to coreml and integrate in iOS11
[英].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.