我正在嘗試在2017年WWDC上演示的蘋果示例Core ML模型正常運行。我正在使用GoogLeNet嘗試對圖像進行分類(請參閱Apple Machine Learning Page)。該模型將CVPixelBuffer作爲輸入。我有一個名爲imageSample.jpg的圖片,我正在使用這個演示。我的代碼如下:將圖像轉換爲用於機器學習的CVPixelBuffer Swift
var sample = UIImage(named: "imageSample")?.cgImage
let bufferThree = getCVPixelBuffer(sample!)
let model = GoogLeNetPlaces()
guard let output = try? model.prediction(input: GoogLeNetPlacesInput.init(sceneImage: bufferThree!)) else {
fatalError("Unexpected runtime error.")
}
print(output.sceneLabel)
我總是在輸出而不是圖像分類中得到意想不到的運行時錯誤。我的代碼,將圖像轉換爲如下:
func getCVPixelBuffer(_ image: CGImage) -> CVPixelBuffer? {
let imageWidth = Int(image.width)
let imageHeight = Int(image.height)
let attributes : [NSObject:AnyObject] = [
kCVPixelBufferCGImageCompatibilityKey : true as AnyObject,
kCVPixelBufferCGBitmapContextCompatibilityKey : true as AnyObject
]
var pxbuffer: CVPixelBuffer? = nil
CVPixelBufferCreate(kCFAllocatorDefault,
imageWidth,
imageHeight,
kCVPixelFormatType_32ARGB,
attributes as CFDictionary?,
&pxbuffer)
if let _pxbuffer = pxbuffer {
let flags = CVPixelBufferLockFlags(rawValue: 0)
CVPixelBufferLockBaseAddress(_pxbuffer, flags)
let pxdata = CVPixelBufferGetBaseAddress(_pxbuffer)
let rgbColorSpace = CGColorSpaceCreateDeviceRGB();
let context = CGContext(data: pxdata,
width: imageWidth,
height: imageHeight,
bitsPerComponent: 8,
bytesPerRow: CVPixelBufferGetBytesPerRow(_pxbuffer),
space: rgbColorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)
if let _context = context {
_context.draw(image, in: CGRect.init(x: 0, y: 0, width: imageWidth, height: imageHeight))
}
else {
CVPixelBufferUnlockBaseAddress(_pxbuffer, flags);
return nil
}
CVPixelBufferUnlockBaseAddress(_pxbuffer, flags);
return _pxbuffer;
}
return nil
}
我從以前的StackOverflow後(最後答案here)得到這個代碼。我意識到代碼可能不正確,但我不知道如何自己做這個。我相信這是包含錯誤的部分。該模型需要以下輸入類型:Image<RGB,224,224>
我創建了一個帶有完整代碼的示例項目,可在此處找到:https://hackernoon.com/swift-tutorial-native-mach ine-learning-and-machine-vision-in-ios-11-11e1e88aa397 –