环境
模型:训练出的caffemodel模型
标签:synset_word.txt
mean:train_mean.npy
使用
上一篇我们训练出了caffemodel模型,来给c++程序调用。本篇表述使用该模型,python语言。
Caffe均值文件mean.binaryproto转mean.npy
分享代码如下:https://blog.csdn.net/hyman_yx/article/details/51732656
import caffe
import numpy as np
MEAN_PROTO_PATH = 'mean.binaryproto' # 待转换的pb格式图像均值文件路径
MEAN_NPY_PATH = '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)
synset_words.txt
这是类别的标签文件,根据例子更改如下:
0 blue
1 red
2 orange
....
分类
在程序中读取模型文件处理测试图片,代码如下:https://blog.csdn.net/baterforyou/article/details/71430284
# -*- coding: UTF-8 -*-
import os
import caffe
import numpy as np
root='/home/zf/caffe/'#指定根目录
deploy=root+'models/bvlc_reference_caffenet/deploy.prototxt'#结构文件
caffe_model=root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'
#已经训练好的model
dir =root+'examples/images/'#保存测试图片的集合
filelist=[]
filenames=os.listdir(dir)
for fn in filenames:
fullfilename = os.path.join(dir,fn)
filelist.append(fullfilename)
#filelist.append(fn)
def Test(img):
#加载模型
net = caffe.Net(deploy,caffe_model,caffe.TEST)
# 加载输入和配置预处理
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_mean('data', np.load('/home/zf/caffe/python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1))
transformer.set_transpose('data', (2,0,1))
transformer.set_channel_swap('data', (2,1,0))
transformer.set_raw_scale('data', 255.0)
#注意可以调节预处理批次的大小
#由于是处理一张图片,所以把原来的10张的批次改为1
net.blobs['data'].reshape(1,3,227,227)
#加载图片到数据层
im = caffe.io.load_image(img)
net.blobs['data'].data[...] = transformer.preprocess('data', im)
#前向计算
out = net.forward()
# 其他可能的形式 : out = net.forward_all(data=np.asarray([transformer.preprocess('data', im)]))
#预测分类
print out['prob'].argmax()
#打印预测标签
labels = np.loadtxt("/home/zf/caffe/data/ilsvrc12/synset_words.txt", str, delimiter='\t')
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1]
print 'the class is:',labels[top_k]
f=file("/home/zhengfeng/caffe/examples/zf/label.txt","a")
f.writelines(img+' '+labels[top_k]+'\n')
labels_filename=root +'data/ilsvrc12/synset_words.txt'
#循环遍历文件夹root+'examples/images/'下的所有图片
for i in range(0,len(filelist)):
img=filelist[i]
Test(img)
其他
error: * Error parsing text-format caffe.NetParameter: 7:15: Message type “caffe.LayerParameter” has no field named “input_param”
在faster-rcnn体系中使用标准caffe训练出的模型,其deploy.txt文件格式已经发生了稍微改变,改动如下:
# caffe deploy.txt
name:"GoogleNet"
layer{
name:"data"
type:"Input"
top:"data"
input_param{shape:{dim:1 dim:3 dim:224 dim:224}}
}
# py-faster-rcnn caffe 没有deploy.txt,这里使用原模型的deploy.txt(进行如下更改)
input:"data"
input_shape{
dim:1
dim:3
dim:224
dim:224
}
input:"im_info"
input_shape{
dim:1
dim:3
}