如何 运行 TFlite 对象检测 Swift 中的单个图像?

How to run TFlite Object Detection with a single image in Swift?

我从 here 获得了 iOS 的 tensorflow 示例应用程序。我的模型在实时检测中与这个 tf 的应用程序配合得很好,但我想用单个图像来完成。据我所知,运行 模型的主要部分是:

self.result = self.modelDataHandler?.runModel(onFrame: buffer)

这个 buffer 变量是一个 CVPixelBuffer,我可以像 tf 的应用程序一样使用 CMSampleBufferGetImageBuffer() 从视频帧中获取它。但是我的应用没有使用框架,所以我没有这个选项。

我拍摄的照片是一个 UIImage,我试图将它转换为 CVPixelBuffer 以便与上面的代码一起使用:

let ciImage: CIImage = CIImage(cgImage: (self.image?.cgImage)!)
let buffer: CVPixelBuffer = self.getBuffer(from: ciImage)!

getBuffer()是:

func getBuffer(from image: CIImage) -> CVPixelBuffer? {
    let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary

    var pixelBuffer : CVPixelBuffer?

    let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(image.extent.width), Int(image.extent.height), kCVPixelFormatType_32BGRA, attrs, &pixelBuffer)

    guard (status == kCVReturnSuccess) else {
        print("Error converting ciImage to CVPixelBuffer")
        return nil
    }

    return pixelBuffer
}

然后 运行 它与:

self.result = self.modelDataHandler?.runModel(onFrame: buffer)
let inferences: [Inference] = self.result!.inferences
let time: Double = self.result!.inferenceTime

因此,我的 time 约为 50 或 60 毫秒,但 inferences 为空。我不知道我从 UIImage 到 CVPixelBuffer 的转换是否正确,或者我是否忘记了另一个错误或过程。

如果您有任何问题,请问我,任何帮助都会很棒!谢谢。

我发现了我的问题,我从 UIImage 到 CVPixelBuffer 的转换是错误的,不需要 CIImage。从 this question 我得到了执行此转换的正确代码。