ios - 有没有办法只在 VisionLabelDetector 中获得最高置信度结果?
问题描述
为了存档这个,我考虑只取 1 个结果,这是最重要的结果,所以我检查了文档,VisionCloudDetectorOptions有这个变量maxResults
,所以如果我将它设置为 1,我的目标就完成了,但这仅适用于基于云的图像标签。所以我检查了在本地运行的VisionLabelDetectorOptions并且没有选项。以及从这里打印出来的结果
return "Label: \(String(describing: feature.label)), " +
"Confidence: \(feature.confidence), " +
"EntityID: \(String(describing: feature.entityID)), " +
"Frame: \(feature.frame)"
}.joined(separator: "\n")
会变成这个
Label: Food, Confidence: 0.795696, EntityID: /m/02wbm, Frame: (0.0, 0.0, 0.0, 0.0)
Label: Fruit, Confidence: 0.71232, EntityID: /m/02xwb, Frame: (0.0, 0.0, 0.0, 0.0)
Label: Vegetable, Confidence: 0.595484, EntityID: /m/0f4s2w, Frame: (0.0, 0.0, 0.0, 0.0)
Label: Plant, Confidence: 0.536178, EntityID: /m/05s2s, Frame: (0.0, 0.0, 0.0, 0.0)
这些是我从Firebase/quickstart-ios从第 645 行开始运行的示例代码。
我的第二个解决方案是在用于返回第一个结果topResult
的 CoreML 中执行类似操作。VNClassificationObservation
像这样的东西
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first else {
fatalError("Unexpected result")
}
但我还没有想出如何像那样复制。
那么,有没有办法只取最高的Confidence
标签呢?在这种情况下是Food
标签。
解决方案
假设labels
数组包含由 返回的所有 VisionLabel 对象VisionLabelDetector.detect(in:completion:)
,通常数组中的所有标签都已经根据它们confidence
的从高到低排序,因此您可以简单地使用 获取最高confidence
标签labels.first
。
如果您想更加安全并自己选择最高置信度标签,您可以执行以下操作:
let topLabel = labels.max(by: { (a, b) -> Bool in
return a.confidence < b.confidence
})
推荐阅读
- python - 如何创建与多个字典或数组上出现的内容匹配的新字典项?(Python)
- css - ReactJS 中的可移动分屏
- javascript - 在 macOS Mission Control 上隐藏电子窗口
- android-studio - 如何在android中创建不对称的循环列表视图
- python - 在 PyGame 中的网格上渲染颜色时出现索引错误
- c# - 无法在我的 MonoGame 中加载“加电”,编译没有错误
- android - Sceneform 无法加载 gltf (java.util.concurrent.CompletionException: java.util.concurrent.CompletionException: java.io.FileNotFoundException)
- flutter - 在 Flutters 列表视图构建器中切换单个项目的活动
- elasticsearch - 在术语查询中包含多个变量并向它们添加权重以定义输出
- webpack - 如何将 NextJS 项目捆绑到一个文件中