【问题标题】:Buffer point issue and main thread is blocked using CoreML缓冲点问题和使用 CoreML 阻塞的主线程
【发布时间】:2021-07-18 17:20:25
【问题描述】:

我正在使用 CoreML 去除给定图像中的背景,但我遇到了 2 个主要问题。

我在 Xcode 中嵌入的模型是 DeepLabV3.mlmodel。这是返回最终图像的整个类:RemoveBackgroundCoreML_Final.swift,我刚刚将其导入到我的源代码中。它在完成工作方面运作良好。但是,我在第 107 行的这个 swift 类中有一个警告:

let data = Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))

“UnsafeMutableBufferPointer”的初始化导致缓冲区指针悬空

更糟糕的情况是,根据我在 App Store 中针对某些设备的崩溃日志,这行代码会导致生产应用程序崩溃,即使我自己在开发环境中没有遇到任何崩溃。

这就是我如何从我的代码中调用上述 Swift 类中的 removeBackground 方法:

let finalImage = image.removeBackground(returnResult: .finalImage)

另一个问题是,上面的行返回finalImage,但它也阻塞了应用程序中的主线程,该线程之前刚刚开始运行一些 UI 动画以显示一些进程(我怀疑这可能与缓冲区指针有关)。

我希望任何有 CoreML 或线程经验的人都可以帮助我,我非常感激。如果需要进一步澄清,请询问。提前谢谢你。

【问题讨论】:

    标签: swift multithreading pointers buffer coreml


    【解决方案1】:

    由于您在创建指向它的指针后没有使用cubeRGB,因此 Swift 优化器将在之后立即释放它。由于这是一个优化器的事情,你不会在调试模式下得到这个错误,只有在发布模式下。

    Data(buffer:...) 将复制数组,这很好。您只需要使数组保持活动状态,直到完成复制。这可以通过withExtendedLifetime 来完成,例如:

    let data = withExtendedLifetime(cubeRGB) {
        return Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))
    }
    

    我可能有语法错误,但类似。

    【讨论】:

    • 语法正确!但是,它保持“悬空缓冲区指针”警告。但是,我认为如果扩展内存分配,它不会再使应用程序崩溃。但是有没有办法在调试模式下测试呢?我的意思是没有在店内发布应用程序并观察崩溃日志?
    • 也许使用let data = cubeRGB.withUnsafeBufferPointer { ptr in Data(buffer: ptr.baseAddress!, ...)会更好。
    • 根据编译器没有这样的语法,所以按照建议,我修改为let data = cubeRGB.withUnsafeBufferPointer { ptr in Data(bytes: ptr.baseAddress!, count: cubeRGB.count) } 它不会删除背景,只返回原始图像。
    • 哦,应该是Data(buffer: ptr)
    • 谢谢。 let data = cubeRGB.withUnsafeBufferPointer { ptr in Data(buffer: ptr) } 工作。我会在实时应用程序中观察它一段时间。我希望它不再崩溃。顺便说一句,对于线程问题,我只为 CoreML 使用了后台线程,并在返回图像后同步到主线程,
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多