2月13日更新:
在使用python脚本之前,首先需要在根目录make pycaffe,同时确保环境变量PYTHONPATH是指向当前caffe/python这一子目录下的,如果指向其他版本caffe的python目录,可能导致程序无法运行
==========================================================
当已有caffemodel之后,整个学习过程并没有结束,还有最后一个步骤——预测。这个也就是常见的deploy.txt这个文件的用处,打开文件可以看到,没有data_layer,只有一个inputdim,这是因为,这个文件不能单独运行,必须配合python或者c++的脚本来预处理数据,把数据变成第一个conv层能接受的形式,再输入到网络中。
下面就是一个简单的python预测脚本。根据TSP网络,一次输入三张图片,
分别用transformer转变后,统一赋给blob里面的'data'数组,就能作为网络的输入。需要注意的是,原TSP网络的dim四1、3、224、224,第一维是1,也就是只能输入一张图片,要输入3张的话,需要手动把第一个dim改成3。
import caffe
caffe_root='/home/hadoop/whx/tsncaffe/'
data_root='/home/hadoop/whx/dataset/ucf101/ucf_videoframedata_jpeg/'
model_root='/home/hadoop/whx/exp-result/'
import numpy as np
import scipy
import sys
import os
def rgb_predict()
net = caffe.Net(caffe_root + 'mywork/ucf101/tsn_bn_inception_rgb_deploy.prototxt',model_root +'2017-1-7/ucf_rgb_bn_inception_iter_80000.caffemodel',caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})#设置transformer
transformer.set_transpose('data', (2,0,1))#本来是224*224*3,改成3*224*224
transformer.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1))#读取均值文件
transformer.set_raw_scale('data', 255) #本来的像素值是0-1,扩展为0-255
transformer.set_channel_swap('data', (2,1,0)) #caffe接收的图片彩色通道应该是BGR这样排列,而原图是RGB格式
image1=caffe.io.load_image(data_root + 'PlayingViolin/v_PlayingViolin_g01_c01/frame000001.jpg')
image2=caffe.io.load_image(data_root + 'PlayingViolin/v_PlayingViolin_g01_c01/frame000010.jpg')
image3=caffe.io.load_image(data_root + 'PlayingViolin/v_PlayingViolin_g01_c01/frame000020.jpg')
net.blobs['data'].reshape(3,3,224,224)
net.blobs['data'].data[...] = [transformer.preprocess('data', image1),transformer.preprocess('data', image2),transformer.preprocess('data', image3)] #transformer设置的是3维(即针对单个图片)而不是4维,因此需要先transformer,再把转换后的3张图拼接在一起。
net.forward()
out = net.blobs['pool_fc'].data[...]
out = out[0][0][0]#得到的data[...]是一个(1,1,1,101)的四维数组,因此取最后一维即可
print out.argmax()+1