您的位置:首页 > 编程语言 > Python开发

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

2016-10-16 22:13 633 查看
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接口调用实例:

[python] view
plain copy

 





# 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()  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: