iOS Vision API 重采样导致结果冲突,?

Posted

技术标签:

【中文标题】iOS Vision API 重采样导致结果冲突,?【英文标题】:iOS Vision API resampling causing conflicting results,? 【发布时间】:2018-11-09 17:34:23 【问题描述】:

我有一个在 640x480 彩色图像上训练的对象检测模型。当我们对从原始验证集以原始分辨率格式获取的图像进行测试时,该模型被转移到 CoreML+Swift 并运行良好。

在用手机上更高分辨率的相机获取的一组新图像/自拍进行测试时,结果非常奇怪。检测到的边界框更多,奇怪的区域被检测为感兴趣的对象。

我的理解告诉我,视觉 api 中的图像重采样引入了一些可能检测到感兴趣对象的伪影。

问题

    ios 中的视觉 API 如何执行图像重采样?

    在深度学习方面:重采样图像与原始分辨率图像是否应该在模型输出中给出不同的结果?

【问题讨论】:

【参考方案1】:

您的问题几乎没有提供任何细节,但这是我的所有想法。

在“深度学习”方面,改变图像尺寸当然会影响模型性能。但是,您描述的图像大小可能足以完成您的任务。为 iOS 前置摄像头以“本机”分辨率训练模型是个坏主意。训练没有更好的结果需要更长的时间(除非你上采样,否则你也很难获得训练数据)。此外,不同的 iOS 设备具有不同的前置分辨率。总而言之,您的“重采样”很好 - 这是一个转换问题。

iOS 有多种重新采样和缩放图像的方法。 如何设置缩放比例?您是否将imageCropAndScaleOption 应用于实例化请求?

let request = VNCoreMLRequest(model: model, completionHandler:  [weak self] request, error in
    self?.processClassifications(for: request, error: error)
)
request.imageCropAndScaleOption = .centerCrop
return request

如何将模型转换为 coreML?类似的东西......

model = coremltools.converters.keras.convert(
        './models/best.h5', 
        input_names=['image'],
        output_names=['output'],
        image_input_names='image',
        image_scale=1/255.0
)

执行此操作时,请确保正确表示(用于输入的)图像表示。您可以在转换后通过打印模型轻松验证。

按照这些思路,训练模型 (RGB) 中的通道是否与您评估的所有图像相同,或者可能是在反向通道 (BGR) 中训练的模型和来自 @987654326 的输入数据@在RGB中?

如果您提供有关您的模型、它的作用、如何将其转换为 CoreML 以及如何评估它的更具体的详细信息,我可以更新我的答案。但请先解决上述问题。

【讨论】:

感谢您的详细回复。你错过了一个小细节。我们已经对其进行了 640x480 分辨率的训练。在推理时,我们看到了问题。其次,关于转换,我使用图像作为输入并在 xcode 端进行检查。我在运行图像请求处理程序之前使用 centerCrop。为了解释更多,当我们使用 640x480 分辨率的图像(该 res 处的实例化相机实例)作为模型的输入时,它可以正常工作。如果获取分辨率更高的图像并将其输入 VNimagerequesthandler,则输出会非常不同。我们怀疑它的重采样差异。想法?

以上是关于iOS Vision API 重采样导致结果冲突,?的主要内容,如果未能解决你的问题,请参考以下文章

图像重采样(CPU和GPU)

在相机源 + Vision API iOS11 上跟踪面部对象

特征检测期间 iOS Vision API“computeBlinkFunction”中的错误和冻结

使用适用于 iOS 的 Google Vision API 添加 2D 或 3D 人脸过滤器,例如 MSQRD/SnapChat

vision-client 不支持 api-key

在 Visual Studio 2015 中重命名时导致“无法解决的冲突”的原因是啥?