图像分类入门 4-图像分类的应用

一个简单的应用:使用CNN对图像进行分类

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

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

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

./scripts/download_model_binary.py   或者直接在http://dl.caffe.berkeleyvision.org/ 上下载bvlc_reference_caffenet.caffemodel文件,下载完成后放到 $CAFFE-ROOT/models/bvlc_reference_caffenet文件夹下, $CAFFE-ROOT为caffe根目录

在ipython下运行:

import numpy as np #调用numpy模块,调用名称为np
import matplotlib.pyplot as plt #调用matplotlib.pyplot模块,调用名称为plt
import sys

caffe_root = '/home/username/caffe-master' #caffe根目录
sys.path.append('/usr/lib/python2.7/dist-packages')
model_file = caffe_root + '/models/bvlc_reference_caffenet/deploy.prototxt' #CaffeNet网络结构
pretrained = caffe_root + '/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel' #参数文件

image_file = caffe_root+'/examples/images/cat.jpg' #测试数据

npload = caffe_root + '/python/caffe/imagenet/ilsvrc_2012_mean.npy' #计算平均值

import caffe

plt.rcParams['figure.figsize'] = (10, 10) # 显示图标大小为10
plt.rcParams['image.interpolation'] = 'nearest' # 图形差值以最近为原则
plt.rcParams['image.cmap'] = 'gray' #背景颜色为灰色

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

需转换成RGB,括号中的数字表示排列顺序

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

3 测试数据

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

4 显示图片:

plt.imshow(transformer.deprocess('data', net.blobs['data'].data[0]))

图片

5 获取标签

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

./data/ilsvrc12/get_ilsvrc_aux.sh 之后代码输入:

imagenet_labels_filename = caffe_root + '/data/ilsvrc12/synset_words.txt'
labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
print labels[top_k]
可以看到如下结果:

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

6 CPU下获取一次运行事件

net.forward() # call once for allocation
%timeit net.forward()
输出:1 loops, best of 3: 4.53 s per loop

7 在GPU下运行

caffe.set_device(0)
caffe.set_mode_gpu()
net.forward() # call once for allocation
%timeit net.forward() 输出:1 loops, best of 3: 397 ms per loop

展开全文
Top