有没有什么方法可以方便地使用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帖子。