有没有什么方法可以方便地使用Caffe快照来预测新图像?
我说的“容易”是指:
不需要手动将train.prototxt更改为deploy.prototxt,请仔细考虑。
不需要将文件转换成LMDB(或其他类似的格式),只需要使用简单的图像文件(没有任何文件名列表或其他内容)
仅使用python代码(不使用CLI)
我已经训练了一个基于Caffe MNIST示例的二进制分类网络。我把MNIST改为用于分类2个类,它训练得非常好。但现在我已经完成了网络培训和快照生成(包含“Snapshot.caffemodel”和“solver.caffemodel”)的工作,我一直在研究如何使用此快照来预测一个图像,而不需要太多麻烦。。。
我现在的代码是(我真的更喜欢这样简单的预测):

#I'M NOT SURE IF I SHOULD USE 'caffe.Net(...)' OR 'caffe.Classifier(...)'
net = caffe.Classifier('Data/train.prototxt',
                       'Data/Snapshot_iter_1000.caffemodel',
                       mean=convertBinaryProtoToNPY('Data/mean_image.binaryproto'),
                       image_dims=(100, 100),
                       raw_scale=255)

score = net.predict([caffe.io.load_image('/Data/Images/1.jpg')])
print score

我得到这个错误:
File "C:\Anaconda2\lib\site-packages\caffe\classifier.py", line 29, in __init__ in_ = self.inputs[0]
IndexError: list index out of range

在搜索之后,我发现我不应该使用“train.prototxt”,而应该使用“deploy.prototxt”。
当前Caffe处理事情的方式有时看起来太复杂了,特别是对于一些琐碎的任务,比如使用快照预测图像。。。
也许我做错了。。。

最佳答案

您确实需要手动将train_val.prototxt更改为deploy.protoxt
然而,这种改变比你想象的要容易。
按照以下步骤将train_val.prototxt复制到新的deploy.prototxt并编辑deploy.prototxt
第一个变化:输入。
与使用培训/验证数据集(通常表示为"Data"/"HDF5Data"/"Imagedata"层)不同,您需要告诉caffe将内存分配给稍后将手动提供的映像。
要做到这一点,需要删除现有输入层(对于火车和测试阶段),并将它们替换为:

layer {
  name: "input"
  type: "Input"
  top: "data"  # or whatever was the name of the "top" of the training input. no need for "label" top - you do not have ground truth labels in test.
  input_param { shape: { dim: 1 dim: 3 dim: 100 dim: 100 } } # give caffe the expected dimensions of your input for memory allocation
}

第二个变化:净产出。
在训练中,你的净输出是损失,而不是预测。
因此,首先移除所有的损耗层(特别是任何希望得到"label"作为“底部”的层)。这包括"SoftmaxWithLoss"/"Accuracy"/"SigmoidCrossEntropyLoss"等。
您需要用适当的预测层替换损失层。例如,"SoftmaxWithLoss"层应该替换为简单的"Softmax"层,"SigmoidCrossEntropy"层应该替换为"Sigmoid"层等等。
因此,如果你有
layer {
  type: "SoftmaxWithLoss"
  name: "loss"
  bottom: "fc8"  # we need this name !
  bottom: "label"
  ...
}

替换为:
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc8" # the SAME as the train loss layer!
  top: "prob"
}

保存更改,现在您就有了一个正确的deploy.prototxt
有关更多信息,请参见this帖子。

07-24 09:53