Xcode13报错:CVPixelBuffer无法转换为CoreML模型prediction期望参数类型
报错原因
这个报错是因为CoreML模型的prediction方法不直接接收CVPixelBuffer类型的参数,Xcode会为每个导入的.mlmodel文件自动生成专属的输入结构体,命名规则为*模型名+Input*,你需要先把像素缓冲区封装到对应结构体中再传入。
解决方法
按照下面的步骤修改代码即可:
- 确认你的模型对应的输入结构体名,你的模型实例名为
classifier,对应的输入结构体默认是classifierInput - 确认模型的图像输入特征名,一般默认叫
image,如果你的模型有自定义命名可以在.mlmodel文件的「Inputs」栏查看 - 用像素缓冲区初始化输入结构体,再传入
prediction方法
修改后的完整代码如下:
let model = classifier() private func performImageClassification(){ let currentImage = uploadedImage // 已上传的原始图像 // 注意:此处缩放尺寸需要和你模型要求的输入尺寸完全一致,多数图像分类模型要求为224*224,可在.mlmodel文件中核对 let resizedImage = currentImage.resizeTo(size: CGSize(width: 255, height:255)) guard let pixelBuffer = resizedImage?.toBuffer() else { return } // 封装为模型要求的输入结构体 let modelInput = classifierInput(image: pixelBuffer) guard let output = try? model.prediction(input: modelInput) else { return } self.classificationLabel = output.classLabel }
额外注意事项
- 如果初始化输入结构体时提示参数名不对,直接打开项目里的.mlmodel文件,在「Predictions」选项卡的「Inputs」列表里就能看到正确的参数名
- 除了尺寸外,还要保证你生成的
CVPixelBuffer的像素格式和模型要求的一致,常用的图像分类模型一般要求是32位RGBA格式,如果后续出现运行时报错可以优先核对这个参数
内容的提问来源于stack exchange,提问作者444mariecodes
相关产品推荐
相关产品推荐

