使用iOS 11 mlmodel进行图像分类-使用coremltools和trained.caffemodel转换问题

使用iOS 11 mlmodel进行图像分类-使用coremltools和trained.caffemodel转换问题,ios,machine-learning,caffe,coreml,coremltools,Ios,Machine Learning,Caffe,Coreml,Coremltools,似乎我在使用coremltool和经过训练的.caffemodel时遇到了一些转换问题。我能够训练和测试caffe狗模型(120个类别,20k图像),它通过了我的直接caffe分类测试。不幸的是,在转换到mlmodel后,它不能对相同的输入提供有效的预测 培训模式 该模型已使用Caffe、GoogleNet、一组20k图像进行训练,这些图像超过120个类别,打包到lmdb中,约500k次迭代。我已经准备好了图像数据库和所有其他的 使用caffe进行分类 这是由caffe提供的。当我试图对经过培训

似乎我在使用
coremltool
和经过训练的.caffemodel时遇到了一些转换问题。我能够训练和测试
caffe
狗模型(120个类别,20k图像),它通过了我的直接
caffe
分类测试。不幸的是,在转换到
mlmodel
后,它不能对相同的输入提供有效的预测

培训模式

该模型已使用Caffe、GoogleNet、一组20k图像进行训练,这些图像超过120个类别,打包到lmdb中,约500k次迭代。我已经准备好了图像数据库和所有其他的

使用
caffe进行分类

这是由caffe提供的。当我试图对经过培训的
caffemodel
运行分类请求时,它非常有效,概率很高(80-99%),结果正确:

使用苹果
进行分类
iOS 11
CoreML

不幸的是,当我试图将这个
DTDogs.caffemodel
deploy.txt
打包到苹果iOS 11
CoreML
可消费的.mlmodel时,我得到了不同的预测结果。实际上,加载和使用模型时没有错误,但我无法得到有效的分类,所有的预测都是0-15%的置信度,并且有错误的标签。为了正确地测试它,我使用了与使用
caffe
进行直接分类时使用的完全相同的图像:

我也在这里尝试过我的iOS应用程序——它们工作得很好,所以这似乎是打包过程中的问题

我错过了什么?


下面是使用
caffe
进行分类的示例:没有问题,答案正确(
python
):


下面是一个在应用程序中使用
DTDogs.mlmodel
的示例。我正在使用一个常规的图像选择器来选择我在
.caffe
分类测试中使用的相同图像(
swift
):


通常,在这些情况下,传递到模型中的图像核心ML的格式不正确

对于Caffe模型,在调用
Caffe.convert()
时,通常需要设置
is_bgr=True
,并且通常需要传入将从输入图像中减去的RGB平均值,以及可能的缩放值

换句话说,CoreML需要做与Python脚本中的
转换器
相同的事情

大概是这样的:

coreml_model = coremltools.converters.caffe.convert(
    caffe_model, class_labels = labels, image_input_names= "data",
    is_bgr=True, image_scale=255.)

我不确定是否需要
图像\u scale=255。
但值得一试。:-)

如果可能和合适的话,我会吻你。@MatthijsHollemans
is_bgr=True
是我所需要的,它基本上就是这个转换器动作:
transformer.set_channel_swap('data',(2,1,0))
(#将通道从RGB交换到bgr)。比例255不起作用,但保留默认值也可以。我已经测试了各种各样的例子,效果非常好!你救了我:)谢谢。
import coremltools;
caffe_model = ('DTDogs.caffemodel', 'deploy.prototxt')
labels = 'labels.txt'
coreml_model = coremltools.converters.caffe.convert(caffe_model, class_labels = labels, image_input_names= "data")
coreml_model.short_description = "Dogs Model v1.14"
coreml_model.save('DTDogs.mlmodel')
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.dismiss(animated: true)
    print("Analyzing Image…")

    guard let uiImage = info[UIImagePickerControllerOriginalImage] as? UIImage
        else { print("no image from image picker"); return }
    guard let ciImage = CIImage(image: uiImage)
        else { print("can't create CIImage from UIImage"); return }

    imageView.image = uiImage

    do {
        let model = try VNCoreMLModel(for: DTDogs().model)
        let classificationRequest = VNCoreMLRequest(model: model, completionHandler: self.handleClassification)
        let orientation = CGImagePropertyOrientation(uiImage.imageOrientation)
        let handler = VNImageRequestHandler(ciImage: ciImage, orientation: Int32(orientation.rawValue))
        try handler.perform([classificationRequest])
    } catch {
        print(error)
    }
}
coreml_model = coremltools.converters.caffe.convert(
    caffe_model, class_labels = labels, image_input_names= "data",
    is_bgr=True, image_scale=255.)