![](/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.