caffe中使用python进行图像预测

在刚接触caffe时,我们一般使用.bat 或者.sh命令来查看训练好的模型或者预测新的图片,很多时候会显得不方便,之前我们配置了MATLAB和python接口,因此,可以使用python来进行相关操作。

在py中,使用的是mean.npy,而在caffe中我们使用的是mean.binaryproto,首先需要将binaryproto转换成.npy,参考http://blog.csdn.net/hyman_yx/article/details/51732656,

#coding=utf-8
import caffe
import numpy as np

caffe_root='D:/caffe/caffe-windows' #根目录
MEAN_PROTO_PATH = caffe_root+'/data/work/imagenet_mean.binaryproto'               # 待转换的pb格式图像均值文件路径
MEAN_NPY_PATH = caffe_root+'/data/work/mean.npy'                         # 转换后的numpy格式图像均值文件路径

blob = caffe.proto.caffe_pb2.BlobProto()           # 创建protobuf blob
data = open(MEAN_PROTO_PATH, 'rb' ).read()         # 读入mean.binaryproto文件内容
blob.ParseFromString(data)                         # 解析文件内容到blob

array = np.array(caffe.io.blobproto_to_array(blob))# 将blob中的均值转换成numpy格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0]                                # 一个array中可以有多组均值存在,故需要通过下标选择其中一组均值
np.save(MEAN_NPY_PATH ,mean_npy)

然后写预测图片的py文件,

#coding=utf-8

#作用:可以用来批处理图片进行分类
import os
import caffe
import numpy as np

caffe_root='D:/caffe/caffe-windows' #根目录
deploy=caffe_root+'/data/work/lenet.prototxt' #deploy文件的路径
caffe_model=caffe_root+'/data/work/lenettt_iter_5000.caffemodel'  #caffe_model的路径
mean_file=caffe_root+'/data/work/mean.npy' #mean_file的路径
labels_filename=caffe_root+'/data/work/test.txt'  #name.txt的路径

#预读待分类的图片
# dir=caffe_root+'/data/work/test/99.bmp'
dir='D:/caffe/caffe-windows/data/work/test/'
filelist=[]
filenames=os.listdir(dir)  #返回指定目录下的所有文件和目录名
for fn in filenames:
    fullfilename=os.path.join(dir,fn) #os.path.join--拼接路径
    filelist.append(fullfilename) #filelist里存储每个图片的路径

net=caffe.Net(deploy,caffe_model,caffe.TEST)  #加载model和network

#图片预处理设置
transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})  #设定图片的格式(1,3,28,28) lenet5模型
transformer.set_transpose('data',(2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
transformer.set_mean('data',np.load(mean_file).mean(1).mean(1)) #减去均值
transformer.set_raw_scale('data',255)  #缩放到[0,255]之间
transformer.set_channel_swap('data',(2,1,0))  #交换通道,将图片由RGB变成BGR

labels=np.loadtxt(labels_filename,str,delimiter='/t') #读取类别名称文件

#加载图片
for i in range(0,len(filelist)):
    img=filelist[i]   #获取当前图片的路径
    #print filenames[i]    #打印当前图片的名称

    im=caffe.io.load_image(img) #加载图片
    net.blobs['data'].data[...]=transformer.preprocess('data',im) #执行上面的预处理操作,并将图片载入到blob中

    #执行测试
    out=net.forward()
    prob=net.blobs['prob'].data[0].flatten()   #取出最后一层(prob)属于某个类标的概率值,'prob'为最后一层的名称

    #print prob
    index1=prob.argsort()[-1]  #获取最大概率值对应的index
    # index2=prob.argsort()[-2]  #获取第二大概率值对应的index
    # index3=prob.argsort()[-3]  #获取第三大概率值对应的index
    # index4=prob.argsort()[-4]  #获取第四大概率值对应的index
    # index5=prob.argsort()[-5]  #获取第5大概率值对应的index

    print filenames[i],' is ', labels[index1],'   ',prob[index1]   #输出label--prob
    # print labels[index2],'--',prob[index2]
    # print labels[index3],'--',prob[index3]
    # print labels[index4],'--',prob[index4]
    # print labels[index5],'--',prob[index5]

你可能感兴趣的:(caffe之旅)