CoreML输入验证失败(图片无效):已试多种方法仍未解决,求方案
那个[MC] System group container...的日志是系统级的无关输出,不用在意它,咱们重点解决"Failure verifying inputs. Image is not valid"这个核心问题,你可以试试下面这些排查和解决方法:
先明确模型的输入硬要求
用Core ML Tools在Python里打印模型的详细输入规范,执行这段代码:import coremltools model = coremltools.models.MLModel("你的模型文件名.mlmodel") coremltools.utils.print_spec(model)重点关注输入图像的
height、width、colorSpace(比如是RGB还是灰度)、是否支持alpha通道。确保iOS里传入的图像完全匹配这些参数——比如模型要求RGB无alpha,就别传带透明通道的PNG图。对齐训练与推理的图像预处理逻辑
回忆下用Turi Create训练时的图像处理步骤:有没有指定image_size?有没有做像素值归一化(比如把0-255的像素值缩到0-1区间)?
在iOS里加载图片后,必须做完全一致的预处理。比如训练时用了:data = image_analysis.load_images("训练集路径", image_size=(100, 100))那iOS里不仅要把图片缩到100×100,还要确保像素值范围和训练时一致——Turi Create默认会把像素值缩到0-1,所以iOS里要把UIImage的像素值从0-255转换成0-1的浮点数再输入模型。
检查CVPixelBuffer的转换是否精准
Core ML的图像输入通常要求CVPixelBuffer格式,很多错误都出在UIImage转CVPixelBuffer的过程中。要确保:- 转换后的buffer尺寸严格等于模型输入的尺寸(比如100×100,不能差哪怕1像素)
- 像素格式匹配模型要求(比如模型需要
kCVPixelFormatType_32BGRA,就别用其他格式) - 如果模型不支持alpha通道,要先去掉图片的透明层,转成纯RGB格式
在Python里先验证模型本身的可用性
把训练用的图片拿到Python里输入模型,看能不能正常输出结果:import coremltools from PIL import Image model = coremltools.models.MLModel("你的模型文件名.mlmodel") img = Image.open("训练用的图片路径").resize((100, 100)) result = model.predict({"image": img}) print(result)如果这里都报错,说明模型导出有问题,重新用Turi Create导出一次,导出时确认
image_input_names参数拼写正确,没有遗漏。修正图片的EXIF方向问题
iOS拍摄的图片常带有EXIF方向标记,导致图片的实际像素尺寸和显示方向不一致——比如你以为是100×100的竖图,实际像素可能是100×100但方向是旋转90度,Core ML会判定尺寸不匹配。可以给UIImage加一个修正方向的扩展:extension UIImage { func fixOrientation() -> UIImage { guard let cgImage = cgImage else { return self } if imageOrientation == .up { return self } let transform = transformForOrientation() let context = CGContext(data: nil, width: size.width, height: size.height, bitsPerComponent: cgImage.bitsPerComponent, bytesPerRow: 0, space: cgImage.colorSpace!, bitmapInfo: cgImage.bitmapInfo.rawValue) context?.concatenate(transform) guard let transformedCGImage = context?.makeImage() else { return self } return UIImage(cgImage: transformedCGImage) } private func transformForOrientation() -> CGAffineTransform { var transform = CGAffineTransform.identity switch imageOrientation { case .down, .downMirrored: transform = transform.translatedBy(x: size.width, y: size.height) transform = transform.rotated(by: .pi) case .left, .leftMirrored: transform = transform.translatedBy(x: size.width, y: 0) transform = transform.rotated(by: .pi/2) case .right, .rightMirrored: transform = transform.translatedBy(x: 0, y: size.height) transform = transform.rotated(by: -.pi/2) case .up, .upMirrored: break @unknown default: break } switch imageOrientation { case .upMirrored, .downMirrored: transform = transform.translatedBy(x: size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) case .leftMirrored, .rightMirrored: transform = transform.translatedBy(x: size.height, y: 0) transform = transform.scaledBy(x: -1, y: 1) case .up, .down, .left, .right: break @unknown default: break } return transform } }加载图片后先调用
fixOrientation(),再调整尺寸和格式。
内容的提问来源于stack exchange,提问作者J A S K I E R

