一.基本材料:
ubuntu14.04;caffe环境;我的训练好的model:cifar_quick_iter_5000.caffemodel.h5;一张猫的图片cat.jpg。
二.文件配置:
需要文件清单:1.你的model --我的是cifar10的model : cifar_quick_iter_5000.caffemodel.h5 路径:~/data/cifar10/
2.待测试图片 --cat.jpg 路径:~/examples/images/
3.你的网络 *_deploy.prototxt
--注意不是用来训练和测试的那个文件(区别见http://blog.youkuaiyun.com/sunshine_in_moon/article/details/49472901)
3.均值文件 --examples/cifar10/里面只有 mean.binaryproto这个二进制的,需要转换为npy文件!
4.均值文件binaryproto转换为npy的代码(python实现)
5.进行分类的classify.py文件 --这个文件在caffe/python/下,但是不好用会报错,因此换了个my_classify.py。
三.开始分类:
1.把二进制均值文件mean.binaryproto转换成mean.npy:建立一个switch.py如下:
import sys,os
caffe_root ='/home/wangbo/caffe/' #开头三行是因为import caffe会报错
sys.path.insert(0,caffe_root + 'python')
import caffe
os.chdir(caffe_root)
import numpy as np
print "Usage: python convert_protomean.py proto.mean out.npy"
blob = caffe.proto.caffe_pb2.BlobProto()
BINARY_PROTO_FILE_NAME ='mean.binaryproto'
#二进制均值文件名称不必写地址你可以把它放到caffe根目录下
BINARY_PROTO_FILE_PATH = os.path.join(os.getcwd(),BINARY_PROTO_FILE_NAME)
NPY_FILE_NAME ='mean.npy'#转换后npy名称
NPY_FILE_PATH = os.path.join(os.getcwd(),NPY_FILE_NAME)
data = open( BINARY_PROTO_FILE_PATH, 'rb' ).read()
blob.ParseFromString(data)
arr = np.array( caffe.io.blobproto_to_array(blob) )
out = arr[0]
np.save( NPY_FILE_PATH , out )
运行,注意注释部分,这样会在caffe根目录产生mean.npy文件。
2.在~/caffe/python/文件夹下建立,一个myclassify.py,用来分类单张图片,代码如下:
import numpy as np
#下面三行依然是为了不让import caffe报错,没有则忽略。
import sys,os
caffe_root ='/home/wangbo/caffe/'
sys.path.insert(0,caffe_root + 'python')
import caffe
os.chdir(caffe_root)
net_file = caffe_root +'examples/cifar10/cifar10_quick.prototxt'#这个是*_deploy.prototxt文件
caffe_model = caffe_root + 'data/cifar10/cifar10_quick_iter_5000.caffemodel.h5'#我的model
mean_file = caffe_root + 'examples/cifar10/mean.npy'#我们刚刚得到的均值文件,我把它放在examples
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))
im=caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')#待测图片
net.blobs['data'].data[...] = transformer.preprocess('data',im)
out = net.forward()
#这个是类别的txt文件,自己制作的数据集和model的话这个也得自己制作,我采用的是cifar10里面现存的。
imagenet_labels_filename = caffe_root + 'data/cifar10/batches.meta.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]]
拷贝的话注意文件路径,你都改成自己的就好。
3.我们打开终端,我们需要在python文件夹下运行my_classify.py,如果在caffe根目录,可以输入:
cd python
sudo python my_classify.py ./examples/images/cat,jpg #注意更改你的带测图片位置。
四.输出效果:
很正确啦,我这系统什么工具都没有,就不截图了。。。。。。。。不过没有输出概率,想要看每个类别概率的童鞋可自行查找代码。