Caffe中使用预测好的bvlc_reference_caffenet.caffemodel模型进行分类

在Caffe中,我们训练好了模型之后(或者下载了别人训练好的网络模型之后),开始用,caffemodel进行训练,下面是使用python代码进行分类的代码:

# coding=utf-8
# 加载必要的库
import numpy as np
import sys
import os

# 设置当前目录
caffe_root = '/home/pcb/caffe/'
sys.path.insert(0, caffe_root + 'python')
import caffe

#使用cpu进行预测
caffe.set_mode_cpu()
#os.chdir(caffe_root)

#加载deploy文件
model_def = '/home/pcb/caffe/models/bvlc_reference_caffenet/deploy.prototxt'
#加载训练好的模型
caffe_weights ='/home/pcb/caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'

#model_def定义了网络的结构,caffe_weights是训练的参数
net = caffe.Net(model_def, caffe_weights, caffe.TEST)

#加载模型的均值文件
mu=np.load(caffe_root+"python/caffe/imagenet/ilsvrc_2012_mean.npy")
#得到RGB的均值
mu=mu.mean(1).mean(1)
print("mean-subtracted value:",zip('BGR',mu))

#为数据层创建一个transformer变量
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
#变成BGR
transformer.set_transpose('data', (2, 0, 1))
#对输入图像求均值
transformer.set_mean('data', mu)
#把【0,255】变成【0,1】
transformer.set_raw_scale('data', 255)
#变成c*w*h
transformer.set_channel_swap('data', (2, 1, 0))

#对数据层输入为1*3*227*227的数据
net.blobs["data"].reshape(1,3,227,227)
#加载需要分类的图像
image = caffe.io.load_image("/home/pcb/caffe/examples/images/cat.jpg")
#对输入的数据进行transformer变量的操作
net.blobs['data'].data[...] = transformer.preprocess('data', image)

#进行一次前向传播,output存放各层前向传播的结果
output=net.forward()
output_prob=output["prob"][0]

print "preidicted class is:",output_prob.argmax()

#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]]

代码中分别加载了deploy.prototxt文件、bvlc_reference_caffenet.caffemodel模型、ilsvrc_2012_mean.npy均值文件、还有需要预测的图片cat.jpg,最终得到了分类的编号,如下图所示:
这里写图片描述
这样就成功得到了分类的结果了!

猜你喜欢

转载自blog.csdn.net/pcb931126/article/details/81411820