Caffe,如何从预训练网络进行预测
Caffe, how to predict from a pretrained net
我正在使用此代码加载我的网络:
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))
我对三行有疑问
1- mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)
什么意思?我应该使用这个平均值还是另一个?如果是,我在哪里可以获得自定义平均值?我正在使用自定义数据集。
2- channel_swap=(2,1,0)
channel_swap是什么意思?再说一次,我应该使用这个值还是自定义值?
最后一个
3- raw_scale=255
什么是raw_scale?我应该使用什么值?
我正在使用 Cohn Kanade 数据集。所有图像均为 64x64 且为灰度。
channel_swap
是将 RGB
反转为 BGR
,如果你使用参考图像网络模型,这显然是必要的,根据 [1] 中的评论。在您的情况下,图像是灰度的,因此您可能没有三个通道。您可能需要将其设置为 (0, 0, 0),但即使那样也可能无济于事(我不确定 channel_swap
的确切实现)。如果这没有帮助,最简单的解决方案可能是通过将每个像素分成三个值相等的值 (RGB) 来预处理您的数据。之后你可能会完全放弃 channel_swap
,因为你的通道具有相同的值,并且交换它们是无操作的。
均值是将从您的输入数据中减去的值以使其居中。 (请记住,神经网络需要数据具有零均值,而输入图像通常具有正均值,因此需要减法)。您减去的均值应该与用于训练的均值相同,因此使用与模型关联的文件中的均值是正确的。但是,我不确定您是否应该对其调用 .mean(1)
- 您是否从某个示例中得到了该行?如果是,那么这很可能是正确的做法。
raw_scale
是输入数据的比例。该模型期望像素被归一化,因此如果您的输入数据的值介于 0 和 255 之间,则 raw_scale
设置为 255 是正确的。如果您的数据的值介于 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
我同意@Ishamael 对 channel_swap 和意思的评论。我只是想进一步说明 raw_scale。假设图像加载 caffe.io.load_image
,值始终在 0 到 1 [1] 的范围内。请注意:
While Python represents images in [0, 1], certain Caffe models
CaffeNet and AlexNet represent images in [0, 255] so the raw_scale
these models must be 255.
而且我认为在馈送到网络数据层之前检查输入图像值以选择合适的 raw_scale。
是明智的
谢谢。
[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L224
我正在使用此代码加载我的网络:
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))
我对三行有疑问
1- mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)
什么意思?我应该使用这个平均值还是另一个?如果是,我在哪里可以获得自定义平均值?我正在使用自定义数据集。
2- channel_swap=(2,1,0)
channel_swap是什么意思?再说一次,我应该使用这个值还是自定义值?
最后一个
3- raw_scale=255
什么是raw_scale?我应该使用什么值?
我正在使用 Cohn Kanade 数据集。所有图像均为 64x64 且为灰度。
channel_swap
是将 RGB
反转为 BGR
,如果你使用参考图像网络模型,这显然是必要的,根据 [1] 中的评论。在您的情况下,图像是灰度的,因此您可能没有三个通道。您可能需要将其设置为 (0, 0, 0),但即使那样也可能无济于事(我不确定 channel_swap
的确切实现)。如果这没有帮助,最简单的解决方案可能是通过将每个像素分成三个值相等的值 (RGB) 来预处理您的数据。之后你可能会完全放弃 channel_swap
,因为你的通道具有相同的值,并且交换它们是无操作的。
均值是将从您的输入数据中减去的值以使其居中。 (请记住,神经网络需要数据具有零均值,而输入图像通常具有正均值,因此需要减法)。您减去的均值应该与用于训练的均值相同,因此使用与模型关联的文件中的均值是正确的。但是,我不确定您是否应该对其调用 .mean(1)
- 您是否从某个示例中得到了该行?如果是,那么这很可能是正确的做法。
raw_scale
是输入数据的比例。该模型期望像素被归一化,因此如果您的输入数据的值介于 0 和 255 之间,则 raw_scale
设置为 255 是正确的。如果您的数据的值介于 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
我同意@Ishamael 对 channel_swap 和意思的评论。我只是想进一步说明 raw_scale。假设图像加载 caffe.io.load_image
,值始终在 0 到 1 [1] 的范围内。请注意:
While Python represents images in [0, 1], certain Caffe models CaffeNet and AlexNet represent images in [0, 255] so the raw_scale these models must be 255.
而且我认为在馈送到网络数据层之前检查输入图像值以选择合适的 raw_scale。
是明智的谢谢。
[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L224