找回密码
 注nanjixiong2017册

QQ登录

只需一步,快速开始

发表帖子

caffe学习笔记2:使用pycaffe提取CNN特征

[复制链接]
本文记录如何基于pycaffe提取pretrained model某一层的特征。
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import scipy.io

  4. # 设置plt画图显示结果
  5. # 图片尺寸
  6. plt.rcParams['figure.figsize'] = (12,12)     
  7. plt.rcParams['figure.dpi'] = 150   
  8. # 不插值
  9. plt.rcParams['image.interpolation'] = 'nearest'  
  10. # 热图
  11. plt.rcParams['image.cmap'] = 'jet'

  12. # 添加工具包的python路径
  13. import sys
  14. import os
  15. tool_root = '/mnt/SSAP/Util/'  
  16. tool_pakg = ['caffe', 'libsvm', 'liblinear']

  17. for item in tool_pakg:
  18.     sys.path.append(tool_root + item + '/python')

  19. # pycaffe模块
  20. import caffe

  21. caffe_root = '/mnt/SSAP/Util/caffe/' # caffe根目录
  22. model_root = './models/'
  23. opt = {
  24.     "debug": False,
  25.     "caffeMode": "gpu",
  26.     "batchSize": 1,
  27.     "inputSize":  227,
  28.     "net": "alexNetPlaces",
  29.     "layer": "single", # multi, single
  30.     "dataset": "MITIndoor67"
  31.     }
  32. if opt["caffeMode"] == "cpu":
  33.     caffe.set_mode_cpu()
  34. else:
  35.     caffe.set_device(0)  
  36.     caffe.set_mode_gpu()

  37. if opt["net"] == "googleNet":
  38.     model_def = model_root + 'deploy_googlenet.prototxt'
  39.     model_weights = model_root + 'imagenet_googlelet_train_iter_120000.caffemodel'
  40. elif opt["net"] == "alexNetPlaces":
  41.     model_def = model_root + 'alexnet_places/places205CNN_deploy_upgraded.prototxt'
  42.     model_weights = model_root + 'alexnet_places/places205CNN_iter_300000_upgraded.caffemodel'
  43.     layer_names = ["fc7"]
  44. else:
  45.     print "[Error]no model exist."
  46.     exit()
  47. net = caffe.Net(model_def,      # 定义模型结构
  48.                 model_weights,  # 预训练的网络
  49.                 caffe.TEST)     #  测试模式

  50. net.blobs['data'].reshape( opt["batchSize"], # batch size
  51.                           3,                 # BGR
  52.                           opt["inputSize"], opt["inputSize"] ) # image size

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

  54. transformer.set_transpose('data', (2,0,1))  # 变换image矩阵,把channel放到最后一维
  55. transformer.set_raw_scale('data', 255)      # 从[0,1]rescale到[0,255]
  56. transformer.set_channel_swap('data', (2,1,0))  # 调整 channels from RGB to BGR
复制代码
下面是对一幅图提取CNN特征
  1. featAll = [] # 每一行存一幅图的CNN特征
  2. image = caffe.io.load_image('test.jpg') # 读入图片
  3. transformed_image = transformer.preprocess('data', image)
  4. net.blobs['data'].data[...] = transformed_image
  5. output = net.forward() # 这里output是CNN最后一层的输出向量
  6. feature = net.blobs['fc7'].data[0] # 读取fc7层的特征
  7. # 打印feature维度看看,这里是blob
  8. if opt["debug"]:
  9.     print feature.shape
  10. feature_standarlized = (feature - min(feature)) / (max(feature) - min(feature)) # 归一化
  11. # 把ndarray转为list
  12. tmpf = feature_standarlized.reshape(1,feature_standarlized.size)
  13. s = tmpf.tolist()
  14. fe = reduce(lambda x,y: x+y,s)
  15. # 验证list维度
  16. if opt["debug"]:
  17.     print len(fe)

  18. featAll.append(fe)     
复制代码
循环执行上述代码,可对整个数据集提取fc7层的CNN特征到featAll中。
出自:https://blog.csdn.net/happyer88/article/details/51723625


使用道具 举报 回复
您需要登录后才可以回帖 登录 | 注nanjixiong2017册

本版积分规则