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

来源:互联网 发布:图书馆数据录入员考试 编辑:程序博客网 时间:2024/05/07 05:01

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
 在CODE上查看代码片派生到我的代码片
  1. # coding=utf-8  
  2. import os  
  3. import numpy as np  
  4. from matplotlib import pyplot as plt  
  5. import cv2  
  6. import shutil  
  7. import time  
  8.   
  9. #因为RGB和BGR需要调换一下才能显示  
  10. def showimage(im):  
  11.     if im.ndim == 3:  
  12.         im = im[:, :, ::-1]  
  13.     plt.set_cmap('jet')  
  14.     plt.imshow(im)  
  15.     plt.show()  
  16.   
  17. #特征可视化显示,padval用于调整亮度  
  18. def vis_square(data, padsize=1, padval=0):  
  19.     data -= data.min()  
  20.     data /= data.max()  
  21.   
  22.     #因为我们要把某一层的特征图都显示到一个figure上,因此需要计算每个图片占用figure多少比例,以及绘制的位置  
  23.     n = int(np.ceil(np.sqrt(data.shape[0])))  
  24.     padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((00),) * (data.ndim - 3)  
  25.     data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))  
  26.   
  27.     # tile the filters into an image  
  28.     data = data.reshape((n, n) + data.shape[1:]).transpose((0213) + tuple(range(4, data.ndim + 1)))  
  29.     data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])  
  30.   
  31.     showimage(data)  
  32.   
  33.   
  34. #设置caffe源码所在的路径  
  35. caffe_root = '../../../caffe/'  
  36. import sys  
  37. sys.path.insert(0, caffe_root + 'python')  
  38. import caffe  
  39.   
  40.   
  41.   
  42.   
  43. #加载均值文件  
  44. mean_filename='./imagenet_mean.binaryproto'  
  45. proto_data = open(mean_filename, "rb").read()  
  46. a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)  
  47. mean  = caffe.io.blobproto_to_array(a)[0]  
  48.   
  49. #创建网络,并加载已经训练好的模型文件  
  50. gender_net_pretrained='./caffenet_train_iter_1500.caffemodel'  
  51. gender_net_model_file='./deploy_gender.prototxt'  
  52. gender_net = caffe.Classifier(gender_net_model_file, gender_net_pretrained,mean=mean,  
  53.                        channel_swap=(2,1,0),#RGB通道与BGR  
  54.                        raw_scale=255,#把图片归一化到0~1之间  
  55.                        image_dims=(256256))#设置输入图片的大小  
  56.   
  57.   
  58. #预测分类及其可特征视化  
  59. gender_list=['Male','Female']  
  60. input_image = caffe.io.load_image('1.jpg')#读取图片  
  61.   
  62. prediction_gender=gender_net.predict([input_image])#预测图片性别  
  63. #打印我们训练每一层的参数形状  
  64. print 'params:'  
  65. for k, v in gender_net.params.items():  
  66.     print 'weight:'  
  67.     print (k, v[0].data.shape)#在每一层的参数blob中,caffe用vector存储了两个blob变量,用v[0]表示weight  
  68.     print 'b:'  
  69.     print (k, v[1].data.shape)#用v[1]表示偏置参数  
  70. #conv1滤波器可视化  
  71. filters = gender_net.params['conv1'][0].data  
  72. vis_square(filters.transpose(0231))  
  73. #conv2滤波器可视化  
  74. '''''filters = gender_net.params['conv2'][0].data 
  75. vis_square(filters[:48].reshape(48**2, 5, 5))'''  
  76. #特征图  
  77. print 'feature maps:'  
  78. for k, v in gender_net.blobs.items():  
  79.     print (k, v.data.shape);  
  80.     feat = gender_net.blobs[k].data[0,0:4]#显示名字为k的网络层,第一张图片所生成的4张feature maps  
  81.     vis_square(feat, padval=1)  
  82.   
  83.   
  84.   
  85.   
  86.   
  87. #显示原图片,以及分类预测结果  
  88. str_gender=gender_list[prediction_gender[0].argmax()]  
  89. print str_gender  
  90.   
  91. plt.imshow(input_image)  
  92. plt.title(str_gender)  
  93. plt.show()  

**********************作者:hjimce   时间:2015.10.11   地址:http://blog.csdn.net/hjimce   原创文章,版权所有,转载请保留本行信息********************

0 0
原创粉丝点击