我尝试从小做起,并用2个项目训练了我的模型。它可以很好地识别这两个项目,但是当我向其显示除它所知道的2个项目之外的其他项目时,它总是告诉我这始终是同一项目。例如,我有一个苹果和香蕉。如果我给它看苹果,它可以正确地给我苹果,如果我给它显示香蕉,它可以正确地返回香蕉。但是,如果我给它看狗,它就告诉我这是一个苹果。如果我给它看直升机,它告诉我这是一个苹果。我什至尝试了一个if语句,说如果它不是苹果或香蕉,则只是返回无法识别它,但这永远不会发生,因为除了香蕉以外,其他所有东西始终都是苹果?!
编辑 我的问题被否决了,也许是因为误解。我不是在问为什么我只训练一个苹果和香蕉时为什么它不能识别狗,我是在问为什么当我给它看狗时它不能告诉我该图像无法识别,而不是告诉我这是一个苹果。显然,如果我只训练了2个项目,那么它只会识别2个项目。
这是返回分类的代码
func processClassifications(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
guard let results = request.results else {
self.classificationLabel.text = "Unable to classify image"
return
}
let classifications = results as! [VNClassificationObservation]
if classifications.isEmpty {
self.classificationLabel.text = "Nothing recognized"
} else {
//Display top classifications ranked by confidence in the UI
let topClassifications = classifications.prefix(1)
let descriptions = topClassifications.map { classification in
return String(format: " (%.2f) %@", classification.confidence, classification.identifier)
}
self.classificationLabel.text = descriptions.joined(separator: "\n")
}
}
}
答案 0 :(得分:2)
如果您仅对模型进行了2个项目的训练(在您的情况下为Apple和Banana),那么您就不能指望机器学习模型可以识别这2个项目以外的东西。 您编写的代码总是返回最有把握的项目。
无论如何,如果您有更多物品,则可以执行以下操作:如果没有物品与测试图像的匹配度至少达到x%,请执行此操作
guard let topResult = classifications.first else { return }
if topResult.confidence > 0.75 {
print(topResult.identifier)
} else {
print("Match is less than 75%")
}
答案 1 :(得分:0)
在作为分类器的模型中,您总是获得与类一样多的VNClassificationObservation
对象。不多不少。只有在运行模型时遇到问题,该数组才为空。