【发布时间】:2020-11-06 11:55:32
【问题描述】:
我使用 RGB 图像作为输入训练了一个 CNN 分类模型,它产生了 1x7 输出和类标签概率(7 个不同的类)。我已将模型从 keras .h5 转换为 coreML。我见过不同的应用程序,并在定义和不定义类标签的情况下尝试了它们。他们在转换时没有引起任何问题。然而,它们都不能在 IOS 中工作。当我调用以下行时,两个模型都崩溃了:
guard let result = predictionRequest.results as? [VNCoreMLFeatureValueObservation] else {
fatalError("model failed to process image")
}
我的两个模型的输出定义如下。您能否建议模型输出有什么问题。我是否必须添加类标签?我很困惑如何调用最高可能值。我也添加了整个分类代码。请看下文。由于我是IOS的初学者,非常感谢您的帮助。真的非常感谢。
IOS中的模型输出定义与类标签转换:
/// 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
}()
没有类标签转换的IOS中模型输出定义:
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
}
}
【问题讨论】:
-
崩溃的错误信息是什么?
-
嗨 Matthijs,它说“线程 1:致命错误:模型无法处理图像”
-
这是您自己来自
fatalError的错误消息。我的意思是 Core ML 给出的错误信息。问题是您没有返回VNCoreMLFeatureValueObservation对象。这并不奇怪,因为您实际上从未执行过预测请求。
标签: ios keras classification coreml coremltools