ios 如何在Swift中使用单幅图像运行TFlite对象检测?

vngu2lb8  于 2023-03-05  发布在  iOS
关注(0)|答案(1)|浏览(158)

我从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 ms,但inferences为空。我不知道从UIImage到CVPixelBuffer的转换是否正确,或者是否有其他错误或程序我忘记了。
如果你有什么问题,请问我,任何帮助都是很好的!谢谢。

k10s72fa

k10s72fa1#

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

相关问题