天天看点

深度学习(九)caffe预测、特征可视化python接口调用

caffe预测、特征可视化python接口调用

原文地址:http://blog.csdn.net/hjimce/article/details/48972877

作者:hjimce

网上有很多caffe训练好的模型,有的时候我们仅仅想要方便的调用已经训练好的模型,利用python进行预测分类测试,查看可视化结果,这个时候,我们可以使用caffe为我们写好的python接口文件,我们在安装caffe的时候,有一步:make  pycaffe。这个便是安装caffe的python 结果函数,把自己用的代码记录一下,以便日后直接复制粘贴使用。感觉使用python就是轻松,如果用caffe的c++接口,挺麻烦的。

下面的使用例子是自己搞利用CNN进行性别预测的python接口调用实例:

# coding=utf-8
import os
import numpy as np
from matplotlib import pyplot as plt
import cv2
import shutil
import time

#因为RGB和BGR需要调换一下才能显示
def showimage(im):
	if im.ndim == 3:
		im = im[:, :, ::-1]
	plt.set_cmap('jet')
	plt.imshow(im)
	plt.show()

#特征可视化显示,padval用于调整亮度
def vis_square(data, padsize=1, padval=0):
	data -= data.min()
	data /= data.max()

	#因为我们要把某一层的特征图都显示到一个figure上,因此需要计算每个图片占用figure多少比例,以及绘制的位置
	n = int(np.ceil(np.sqrt(data.shape[0])))
	padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
	data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))

	# tile the filters into an image
	data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
	data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])

	showimage(data)


#设置caffe源码所在的路径
caffe_root = '../../../caffe/'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe




#加载均值文件
mean_filename='./imagenet_mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean  = caffe.io.blobproto_to_array(a)[0]

#创建网络,并加载已经训练好的模型文件
gender_net_pretrained='./caffenet_train_iter_1500.caffemodel'
gender_net_model_file='./deploy_gender.prototxt'
gender_net = caffe.Classifier(gender_net_model_file, gender_net_pretrained,mean=mean,
					   channel_swap=(2,1,0),#RGB通道与BGR
					   raw_scale=255,#把图片归一化到0~1之间
					   image_dims=(256, 256))#设置输入图片的大小


#预测分类及其可特征视化
gender_list=['Male','Female']
input_image = caffe.io.load_image('1.jpg')#读取图片

prediction_gender=gender_net.predict([input_image])#预测图片性别
#打印我们训练每一层的参数形状
print 'params:'
for k, v in gender_net.params.items():
	print 'weight:'
	print (k, v[0].data.shape)#在每一层的参数blob中,caffe用vector存储了两个blob变量,用v[0]表示weight
	print 'b:'
	print (k, v[1].data.shape)#用v[1]表示偏置参数
#conv1滤波器可视化
filters = gender_net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
#conv2滤波器可视化
'''filters = gender_net.params['conv2'][0].data
vis_square(filters[:48].reshape(48**2, 5, 5))'''
#特征图
print 'feature maps:'
for k, v in gender_net.blobs.items():
	print (k, v.data.shape);
	feat = gender_net.blobs[k].data[0,0:4]#显示名字为k的网络层,第一张图片所生成的4张feature maps
	vis_square(feat, padval=1)





#显示原图片,以及分类预测结果
str_gender=gender_list[prediction_gender[0].argmax()]
print str_gender

plt.imshow(input_image)
plt.title(str_gender)
plt.show()
           

继续阅读