我正在尝试使用Apple website上给定的 inceptionV3 模型将CoreML和ARKit合并到我的项目中。
我从ARKit(Xcode 9 beta 3)的标准模板开始
我重复使用ARSCNView启动的会话,而不是使用新的摄像机会话。
在我的viewDelegate结束时,我写道:
sceneView.session.delegate = self
然后扩展我的viewController以符合ARSessionDelegate协议(可选协议)
// MARK: ARSessionDelegate
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didUpdate frame: ARFrame) {
do {
let prediction = try self.model.prediction(image: frame.capturedImage)
DispatchQueue.main.async {
if let prob = prediction.classLabelProbs[prediction.classLabel] {
self.textLabel.text = "\(prediction.classLabel) \(String(describing: prob))"
}
}
}
catch let error as NSError {
print("Unexpected error ocurred: \(error.localizedDescription).")
}
}
}
起初我尝试了这段代码,但后来注意到初始版需要像Image类型的像素缓冲区。 < RGB,< 299299取代。
虽然没有重新开始,但我想我只会调整框架的大小,然后尝试从中获取预测。我正在使用此功能调整大小(从https://github.com/yulingtianxia/Core-ML-Sample获取
)func resize(pixelBuffer: CVPixelBuffer) -> CVPixelBuffer? {
let imageSide = 299
var ciImage = CIImage(cvPixelBuffer: pixelBuffer, options: nil)
let transform = CGAffineTransform(scaleX: CGFloat(imageSide) / CGFloat(CVPixelBufferGetWidth(pixelBuffer)), y: CGFloat(imageSide) / CGFloat(CVPixelBufferGetHeight(pixelBuffer)))
ciImage = ciImage.transformed(by: transform).cropped(to: CGRect(x: 0, y: 0, width: imageSide, height: imageSide))
let ciContext = CIContext()
var resizeBuffer: CVPixelBuffer?
CVPixelBufferCreate(kCFAllocatorDefault, imageSide, imageSide, CVPixelBufferGetPixelFormatType(pixelBuffer), nil, &resizeBuffer)
ciContext.render(ciImage, to: resizeBuffer!)
return resizeBuffer
}
不幸的是,这还不足以让它发挥作用。这是捕获的错误:
Unexpected error ocurred: Input image feature image does not match model description.
2017-07-20 AR+MLPhotoDuplicatePrediction[928:298214] [core]
Error Domain=com.apple.CoreML Code=1
"Input image feature image does not match model description"
UserInfo={NSLocalizedDescription=Input image feature image does not match model description,
NSUnderlyingError=0x1c4a49fc0 {Error Domain=com.apple.CoreML Code=1
"Image is not expected type 32-BGRA or 32-ARGB, instead is Unsupported (875704422)"
UserInfo={NSLocalizedDescription=Image is not expected type 32-BGRA or 32-ARGB, instead is Unsupported (875704422)}}}
不确定我能从这里做些什么。
如果有更好的建议将两者结合起来,我全都听见了。
编辑:我还尝试了@dfd建议的YOLO-CoreML-MPSNNGraph中的resizePixelBuffer方法,错误完全相同。
Edit2 :所以我将像素格式更改为kCVPixelFormatType_32BGRA(格式与resizePixelBuffer中传递的pixelBuffer格式不同)。
let pixelFormat = kCVPixelFormatType_32BGRA // line 48
我没有错误了。但是一旦我尝试做出预测,AVCaptureSession就会停止。似乎我遇到了同样的问题Enric_SA正在apple developers forum上运行。
Edit3 :所以我尝试实施rickster解决方案。适用于inceptionV3。我想尝试一个特征观察(VNClassificationObservation)。目前,它无法使用TinyYolo。边界是错误的。试图搞清楚。
答案 0 :(得分:5)
不要自己处理图像以将其提供给Core ML。使用Vision。 (不,不是那一个。This one。)视觉需要几个图像类型的一个ML模型和任何(including CVPixelBuffer
)和自动获得图像以正确的大小和纵横比与像素格式为模型评估,然后给你模型的结果。
这是您需要的代码的粗略骨架:
app.data
有关更多指示,请参阅this answer另一个问题。