caffe在Ubuntu下如何用已训练出来的模型测试一张图片?
问题描述如下:
我已经在Caffe上训练好了一个模型,想拿这个模型来做图片分类。我起码的需求是:给一张图片,在这个模型上跑了一遍后,告诉我预测是哪属于哪一类?!
PS:感觉网上有很多人都问这个问题,有的用c++,有的用Python,有的说Matlab,答案各种各样,却没有一个是完整的;有的干脆直接给个链接就完了。。。。
这问题困扰我好久了,急!如有哪位对Caffe有了解的大神,望助我一把!
参考答案如下:
以下例子都是python写的。
这个代码是用python代码调用训练好的CAFFE_ROOT/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel,其中一些文件路径需要修改一下:
http://www.cc.gatech.edu/~zk15/deep_learning/classify_test.py
训练ImageNet模型并在python中使用已经训练好的模型,与上面的代码稍有不同
【Caffe】训练ImageNet模型
以上两个例子都是使用
net = imagenet.ImageNetClassifier(MODEL_FILE, PRETRAINED)
prediction = net.predict(IMAGE_FILE)
实现的,caffe.Classifier是已经写好的类,适用于图像分类的imagenet的例子(例子详细描述参见CAFFE_ROOT/examples/cpp_classification)。
一般性的使用方法,可以参考以下链接中提到的方法:
caffe/00-classification.ipynb at master BVLC/caffe GitHub
你可以查看一下它的代码中使用“net.forward()”前是怎样修改输入的。
参考答案如下:
最近工作在用这个,顺手答一发 :D
推荐使用Python,需要在正常编译完caffe后加一句 make pycaffe,然后把${CAFFE_ROOT}/python路径加到PYTHONPATH中就可以import caffe了。当然也可以在程序中使用os和sys模块添加路径。
Talk is cheap, this is the code:
import numpy as npimport sys,oscaffe_root = '/path/to/caffe/'sys.path.insert(0, caffe_root + 'python')import caffeos.chdir(caffe_root)net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt'caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'net = caffe.Net(net_file,caffe_model,caffe.TEST)transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})transformer.set_transpose('data', (2,0,1))transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))transformer.set_raw_scale('data', 255)transformer.set_channel_swap('data', (2,1,0)) # if using RGB instead if BGR#im=caffe.io.load_image(caffe_root+'examples/images/cat.jpg')#im=caffe.io.load_image(caffe_root+'examples/images/cross-eyed-cat.jpg')img=caffe.io.load_image(caffe_root+'examples/images/dog.jpg')net.blobs['data'].data[...] = transformer.preprocess('data',img)out = net.forward()imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'labels = np.loadtxt(imagenet_labels_filename, str, delimiter='t')top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]for i in np.arange(top_k.size): print top_k[i], labels[top_k[i]]
查看评论 回复