这里只是对caffe已有的配置文件和模型进行调用,我们用它来写之前一个对小猫咪类别的一个分类,也就是测试的程序。
直接看代码和注释把~
//import需要的模块,设置好路径和绘图参数
import numpy as np //加载python调用需要的块
import sys,os
import cv2 //加载opencv,显示用的
caffe_root='/home/jiaxuan2/caffe-master/' //caffe路径
//下面这三句话也是必须的,把python路径改到指定的地方
sys.path.insert(0,caffe_root+'python')
import caffe
os.chdir(caffe_root)
//两个必须的文件,deploy文件和model,以及数据均值文件的路径,本文需要用到
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'
//设置Caffe为测试阶段,载入网络并配置输入预处理。
net=caffe.Net(net_file,caffe_model,caffe.TEST)
//定义网络模型,参数1 网络结构,参数2 model权值, 参数3 测试阶段transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})
//对数据预处理过程,data是input blob
transformer.set_transpose('data',(2,0,1))
//原来读入的数据形式是H*W*K(0,1,2),但我们需要的是K*H*W(2,0,1)
transformer.set_mean('data',np.load(mean_file).mean(1).mean(1))
//计算均值,读数据均值文件
transformer.set_raw_scale('data',225)
//把0-1的数值转化为0-255
transformer.set_channel_swap('data',(2,1,0))
//关于读入的颜色通道,在caffe中读入是BGR(0,1,2),所以要将RGB转化为BGR(2,1,0)
img=caffe.io.load_image(caffe_root+'examples/images/cat.jpg')
//读我们需要分类的照片,那只小猫咪,下面几步是为了显示图片,caffe读完做了归一化,所以数值为0-1,要把它换位0-255
img=img[...,::-1]//将列表img倒序处理,如果img=[1,2,3],则img[::-1]=[3,2,1]。前两个冒号表示处理整个列表。
im=img*255
cv2.imwrite("./out1.jpg",im)//用poencv存放图片,前面是存放路径,后面是图片
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')//加载label的txt,是为了后面的显示用到的
top_k=net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
//前6个可能概率最大的,flatten,是python里面展平的意思
//argsort是从低到高排序,-1到-6表示反过来的1-5个的意思。[-1:-6:-1],最后一个-1表示倒序处理的意思,第一个参数表示起始点包括起始点,第二个参数表示结束点但不包括结束点。最后一个参数如果为负的话,需要保证第一个参数大于第二个参数,表示依次递减逆序,否则会输出空列表。最后一个参数为正同理。
for i in np.arange(top_k.size):
print top_k[i],labels[top_k[i]]//打印结果
结果是
5个排序,以及下面储存的图片