Image Classification and Filter Visualization

这是caffe文档中Notebook Examples的第一篇,链接地址http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb

这个例子利用CaffeNet模型对caffe文件夹下的那张小猫的图像进行分类,逐层可视化图像特征,CaffeNet基于ImageNet。同时比较了CPU和GPU操作。


1. 准备模型,引入必要的模块:

由于这里是用CaffeNet的测试阶段因此,需要下载参数文件,在caffe的根目录下运行:

  1. ./scripts/download_model_binary.py  
或者直接在 http://dl.caffe.berkeleyvision.org/上下载 bvlc_reference_caffenet.caffemodel文件,下载完成后放到

$CAFFE-ROOT/models/bvlc_reference_caffenet文件夹下, $CAFFE-ROOT为caffe根目录

在ipython下运行

  1. import numpy as np           #调用numpy模块,调用名称为np  
  2. import matplotlib.pyplot as plt               #调用matplotlib.pyplot模块,调用名称为plt  
  3. import sys  
  4.   
  5. caffe_root = '/home/username/caffe-master'   #caffe根目录  
  6. sys.path.append('/usr/lib/python2.7/dist-packages')      
  7. model_file = caffe_root + '/models/bvlc_reference_caffenet/deploy.prototxt'  #CaffeNet网络结构  
  8. pretrained = caffe_root + '/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'    #参数文件  
  9.   
  10. image_file = caffe_root+'/examples/images/cat.jpg'    #测试数据  
  11.   
  12. npload = caffe_root + '/python/caffe/imagenet/ilsvrc_2012_mean.npy'    #计算平均值  
  13.   
  14. import caffe  
  15.   
  16. plt.rcParams['figure.figsize'] = (1010)       # 显示图标大小为10  
  17. plt.rcParams['image.interpolation'] = 'nearest'     # 图形差值以最近为原则  
  18. plt.rcParams['image.cmap'] = 'gray'        #背景颜色为灰色  


2. 设置CPU摸式运行,加载模型和参数文件,配置输入预处理


  1. caffe.set_mode_cpu()  
  2. net = caffe.Net(model_file, pretrained, caffe.TEST)    #构建网络  
  3. transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape })  
  4. transformer.set_transpose('data',(2,0,1))  
  5. transformer.set_mean('data',np.load(npload).mean(1).mean(1))    #计算像素平均值  
  6. transformer.set_raw_scale('data',255#将图像转到灰白空间  
  7. transformer.set_channel_swap('data',(2,1,0)) # 参考模型通道为BGR,需转换成RGB,括号中的数字表示排列顺序  

4测试数据

  1. net.blobs['data'].reshape(503227227)  
  2. net.blobs['data'].data[...] = transformer.preprocess('data',caffe.io.load_image(image_file))  #读取文件   
  3. out = net.forward()  
  4. print("Predicted class is #{}.".format(out['prob'][0].argmax()))  

5. 显示图片:
plt.imshow(transformer.deprocess('data', net.blobs['data'].data[0]))


6. 获取标签

命令行caffe-根目录输入语句

  1. ./data/ilsvrc12/get_ilsvrc_aux.sh  

之后代码输入:

  1. imagenet_labels_filename = caffe_root + '/data/ilsvrc12/synset_words.txt'  
  2. labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')  
  3. top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]  
  4. print labels[top_k]  


可以看到如下结果
  1. ['n02123045 tabby, tabby cat' 'n02123159 tiger cat'  
  2.  'n02124075 Egyptian cat' 'n02119022 red fox, Vulpes vulpes'  
  3.  'n02127052 lynx, catamount']  

7.CPU下获取一次运行事件
  1. net.forward()  # call once for allocation  
  2. %timeit net.forward()  
输出:1 loops, best of 3: 4.53 s per loop

8.在GPU下运行
  1. caffe.set_device(0)  
  2. caffe.set_mode_gpu()  
  3. net.forward()  # call once for allocation  
  4. %timeit net.forward()  
输出:1 loops, best of 3: 397 ms per loop

9. 网络各层特征和结构
  1. [(k, v.data.shape) for k, v in net.blobs.items()]  

输出:参数中第一个为网络名,后面四个数分别为批处理大小,滤波器个数,每个神经元中图像大小

  1. [('data', (503227227)),  
  2.  ('conv1', (50965555)),  
  3.  ('pool1', (50962727)),  
  4.  ('norm1', (50962727)),  
  5.  ('conv2', (502562727)),  
  6.  ('pool2', (502561313)),  
  7.  ('norm2', (502561313)),  
  8.  ('conv3', (503841313)),  
  9.  ('conv4', (503841313)),  
  10.  ('conv5', (502561313)),  
  11.  ('pool5', (5025666)),  
  12.  ('fc6', (504096)),  
  13.  ('fc7', (504096)),  
  14.  ('fc8', (501000)),  
  15.  ('prob', (501000))]  

10. 参数的形状,
  1. [(k, v[0].data.shape) for k, v in net.params.items()]  
输出网络参数:
  1. [('conv1', (9631111)),  
  2.  ('conv2', (2564855)),  
  3.  ('conv3', (38425633)),  
  4.  ('conv4', (38419233)),  
  5.  ('conv5', (25619233)),  
  6.  ('fc6', (40969216)),  
  7.  ('fc7', (40964096)),  
  8.  ('fc8', (10004096))]  

11. 用于可视化的函数

  1. # take an array of shape (n, height, width) or (n, height, width, channels)  
  2. # and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)  
  3. def vis_square(data, padsize=1, padval=0):  
  4.     data -= data.min()  
  5.     data /= data.max()  
  6.       
  7.     # force the number of filters to be square  
  8.     n = int(np.ceil(np.sqrt(data.shape[0])))  
  9.     padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((00),) * (data.ndim - 3)  
  10.     data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))  
  11.       
  12.     # tile the filters into an image  
  13.     data = data.reshape((n, n) + data.shape[1:]).transpose((0213) + tuple(range(4, data.ndim + 1)))  
  14.     data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])  
  15.       
  16.     plt.imshow(data)  


12. 显示conv1的滤波器:共96个
  1. # the parameters are a list of [weights, biases]  
  2. filters = net.params['conv1'][0].data  
  3. vis_square(filters.transpose(0231))  




13. 第一层的输出:前36个

  1. feat = net.blobs['conv1'].data[0, :36]  
  2. vis_square(feat, padval=1)  



14. 第二层的滤波器,conv2

这一层有256个滤波器,每一个由5x5x48维, 这里只展示前48个滤波器。每个通道分开显示,因此每个滤波器是一行

  1. filters = net.params['conv2'][0].data  
  2. vis_square(filters[:48].reshape(48**255))  


15. 第二层前36个输出(第二个卷积层输出,已修正的,共有256个通道,这里显示前36个)

  1. feat = net.blobs['conv2'].data[0, :36]  
  2. vis_square(feat, padval=1)  



16. 第三层卷积层的输出(已修正的,所有的384个通道)

  1. feat = net.blobs['conv3'].data[0]  
  2. vis_square(feat, padval=0.5)  


17. 第四层卷积层输出(已修正的,所有384个通道)

  1. feat = net.blobs['conv4'].data[0]  
  2. vis_square(feat, padval=0.5)  

18. 第5层卷积输出(已修正的,所有的256个通道)
  1. feat = net.blobs['conv5'].data[0]  
  2. vis_square(feat, padval=0.5)  


19.第5层池化后的输出

  1. feat = net.blobs['pool5'].data[0]  
  2. vis_square(feat, padval=1)  


20. 第一个全连接层输出直方分布图(fc6,已修正的)

  1. feat = net.blobs['fc6'].data[0]  
  2. plt.subplot(211)  
  3. plt.plot(feat.flat)  
  4. plt.subplot(212)  
  5. _ = plt.hist(feat.flat[feat.flat > 0], bins=100)  

21. 第二个全连接层的输出(fc7, 已修正的)分布不在平均

  1. feat = net.blobs['fc7'].data[0]  
  2. plt.subplot(211)  
  3. plt.plot(feat.flat)  
  4. plt.subplot(212)  
  5. _ = plt.hist(feat.flat[feat.flat > 0], bins=100)  


22. 最后的概率输出(prob)

  1. feat = net.blobs['prob'].data[0]  
  2. plt.plot(feat.flat)  

23. 看一下概率最大的几个标签
  1. # load labels  
  2. imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'  
  3. try:  
  4.     labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')  
  5. except:  
  6.     !/data/ilsvrc12/get_ilsvrc_aux.sh  
  7.     labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')  
  8.   
  9. # sort top k predictions from softmax output  
  10. top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]  
  11. print labels[top_k]  


打印结果:

  1. ['n02123045 tabby, tabby cat' 'n02123159 tiger cat'  
  2.  'n02124075 Egyptian cat' 'n02119022 red fox, Vulpes vulpes'  
  3.  'n02127052 lynx, catamount']  


参考网站:

http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值