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



我从这里获得了适用于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。从这个问题中,我得到了正确的代码来进行此转换。

最新更新