Caffe,如何从预训练网中预测

时间:2015-11-17 19:05:35

标签: python deep-learning caffe conv-neural-network pycaffe

我使用此代码加载我的网:

@IBAction func slow(sender: UIButton) {
    if let filePath = NSBundle.mainBundle().URLForResource("io", withExtension: "mp3") {

    let _a = try! AVAudioPlayer(contentsOfURL: filePath)
            // Play

          _a.play()

      }else
    {

        print("error")
    }  
}

我怀疑有三条线。

1- net = caffe.Classifier(MODEL_FILE, PRETRAINED, mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1), channel_swap=(2,1,0), raw_scale=255, image_dims=(256, 256))

什么意思?我应该使用这个平均值还是其他?如果是的话,我在哪里可以获得自定义平均值?我使用的是自定义数据集。

2- mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)

channel_swap是什么意思?同样,我应该使用此值还是自定义值?

最后一次

3- channel_swap=(2,1,0)

什么是raw_scale?我应该使用什么价值?

我正在使用Cohn Kanade数据集。所有图像均为64x64且为灰度。

2 个答案:

答案 0 :(得分:4)

channel_swap是将RGB反转为BGR,如果您使用参考图像网络模型,这显然是必要的,基于[1]中的注释。在您的情况下,图像是灰度的,因此您可能没有三个通道。您可能需要将其设置为(0,0,0),但即使这样也可能没有帮助(我不确定channel_swap的确切实现)。如果这没有帮助,最简单的解决方案可能是通过将每个像素分成具有相等值的三个值(RGB)来预处理数据。之后,您可以完全删除channel_swap,因为您的频道具有相同的值,并且交换它们是无操作。

平均值是从输入数据中减去的中心值。 (请记住,神经网络需要数据为零均值,而输入图像通常具有正均值,因此需要减法)。您减去的平均值应该与用于训练的平均值相同,因此使用与模型关联的文件中的平均值是正确的。但是,我不确定你是否应该致电.mean(1) - 你是否从某个例子中得到了这一点?如果是,那么很可能是正确的事情。

raw_scale是输入数据的比例。模型需要对像素进行标准化,因此如果输入数据的值介于0到255之间,则设置为255的raw_scale是正确的。如果您的数据的值介于0和1之间,则raw_scale应设置为1。

最后,根据我对[2]中评论的理解,您不需要提供image_dims

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L204

[2] https://github.com/BVLC/caffe/blob/master/python/caffe/classifier.py#L18

答案 1 :(得分:2)

我同意@Ishamael对channel_swap和意思的评论。我只是想进一步澄清raw_scale。假设图像加载caffe.io.load_image,则值始终在0到1 [1]的范围内。请注意:

  

虽然Python代表[0,1]中的图像,但某些Caffe模型   CaffeNet和AlexNet代表[0,255]中的图像,因此raw_scale   这些模型必须是255。

我认为在馈送到网络数据层之前检查输入图像值是明智的,以便选择合适的raw_scale。

谢谢。

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L224