caffe入门----pycaffe图片分类

Blob

Blob是caffe用于存储和交换数据的基本单元。Blob在内存中,为[num_,channels_,height_,width_],可以想成视频流,width_和height_是图像的宽和高,channels_表示颜色通道RGB,num_表示第几帧。

Blob对象四个方法: data_(), diff_(), count_(),Update()
分别为获取数据,梯度,计算size,跟新(data=data-diff)。

propotxt

定义网络结构,训练或者测试的时候,先加载propotxt进行网络的构建。可以随机化初始参数,也可以用已经训练好的网络模型进行初始化(caffemodel)。要求用的caffemodel的网络layer命名和当前的propotxt一样,不一样的不会被按模型初始化。即初始化是“按名索参”

import numpy as np
import sys,os

caffe_root = '/home/yui/code/caffe/'
sys.path.insert(0,caffe_root+'python')
#目录转到python才能import caffe
import caffe

os.chdir(caffe_root)
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' 
net = caffe.Net(net_file,caffe_model,caffe.TEST)  

# 得到data的形状,这里的图片是默认matplotlib底层加载的  
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})  
# matplotlib加载的image是像素[0-1],图片的数据格式[weight,high,channels],RGB  
# caffe加载的图片需要的是[0-255]像素,数据格式[channels,weight,high],BGR,那么就需要转换  

# channel 放到前面  
transformer.set_transpose('data', (2,0,1))  
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))  
# 图片像素放大到[0-255]  
transformer.set_raw_scale('data', 255)   
# RGB-->BGR 转换  
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)  
#正向传播
output = net.forward()  
#获取输出信息
output_prob = output['prob'][0]  
print 'predicted class is:', output_prob.argmax()  

# 也可以找出前五名的概率  
top_inds = output_prob.argsort()[::-1][:5]    
print 'probabilities and labels:'  
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'  
labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')  
zip(output_prob[top_inds], labels[top_inds])  


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

解读

net = caffe.Net(net_file,caffe_model,caffe.TEST) 

这里是初始化网络,指定图纸(propotxt),训练好的模型,初始化方法(test)。这里指定test是因为有的网络训练的时候和test的时候是不一样的网络结构。

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})  

这里调用了caffe.io.Tansformer类,参数为网络‘data’的形状。我们看propotxt里有:

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}

运行之后:

(Pdb) p transformer.inputs
{'data': (10, 3, 227, 227)}

把channel放到前面:

transformer.set_transpose('data', (2,0,1))  

运行之后:

(Pdb) p transformer.transpose
{'data': (2, 0, 1)}

获取正向传播的softmax分类信息:

output_prob = output['prob'][0] 

在propotxt里,prob为:(Pdb) n
predicted class is: 281

layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc8"
  top: "prob"
}

prob为1000维的数组,我们看最大的是那个分类:

predicted class is: 281

参考:
http://blog.csdn.net/liyaohhh/article/details/50932430

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值