我尝试了最近在iOS中引入的Core ML来识别和分类图像。问题是,它没有为发送的图像提供正确的结果。
如果我发送地球图像(地球仪),它给我的类是气泡。下面是我使用的代码,
let model = Resnet50()
let pixelBuffer: CVPixelBuffer = (modelImg.pixelBuffer())!
if let prediction = try? model.prediction(image: pixelBuffer) {
print( "Found it!! It is a/an (prediction.classLabel)")
}
是否可以在现有 Core ML 模型之上使用自定义用例训练模型?(例如 Resnet50)
为了扩展Matusalem的答案,当使用图像分类网络时,你只能在它被训练的类之一中得到结果。在这种情况下,您似乎正在使用Apple可供下载的预训练ResNet50 Core ML模型。
该图像分类网络,就像您会发现的许多其他网络一样,已经在 ImageNet 大规模视觉识别挑战赛 2012 数据集(通常称为 ImageNet 或 ILSVRC2012)上进行了训练。该数据集在 2012 年竞赛后成为卷积神经网络设计的基准,因此您会发现许多预训练网络使用它。它有 1000 个类别,可以在图像中识别,此处列出了完整的标签列表。您会注意到"globe"不在其中,因此网络将提供它所训练的最接近的匹配类别。
如果您以前从未见过地球仪,甚至接触过"地球仪"这个词,您是否能够识别出一个?这些网络可以以令人惊讶的方式进行泛化,但如果它们甚至没有您想要分类的类别,它们将无法提供您想要的结果。
ImageNet 数据集是一个有趣的起点,但可能不是最适合实际使用的数据集。它的类别分布很奇怪,大约有200种狗,但没有人类。它可以是预训练网络,然后使用迁移学习将该网络细化为特定数据集的绝佳起点,但您很可能希望训练自己的特定于应用程序的网络。这是另一个话题。
Core ML 只能用于对已经训练好的模型进行推理。您必须使用其他一些工具来预先训练您的模型,然后使用核心 ML 工具将其转换为 Core ML。您可以在文档中找到受支持的第三方机器学习工具和格式:
https://developer.apple.com/documentation/coreml/converting_trained_models_to_core_ml