Caffe学习1-图像识别与数据可视化

本文采用深度学习库caffe做图像的识别与分类,所用模型为caffemodel。

具体参考caffe官网:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb

#用caffe来进行图像的识别和各层可视化
# 加载各个模块,比如python,numpy和matploblib
import numpy as np
import matplotlib.pyplot as plt
# 在notebook里面显示图像
%matplotlib inline

# set display defaults
plt.rcParams[‘figure.figsize‘] = (10, 10)        # 显示图像的最大范围
plt.rcParams[‘image.interpolation‘] = ‘nearest‘  # 差值方式
plt.rcParams[‘image.cmap‘] = ‘gray‘  # 灰度空间
#第二步,用来加载caffe
import sys
caffe_root=‘../../‘    #我的路径是在caffe/example/test路径下,根据你的情况将caffe_root路径进行定义
sys.path.insert(0,caffe_root+‘python‘)

import caffe
#如果没有事先下载了已经训练好了的caffemodel,这里需要判别一下,如果没有模型则提示需要下载
import os
if os.path.isfile(caffe_root+‘models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel‘):
    print ‘CaffeNet found.‘
else:
    print ‘Downloading pre-trained CaffeNet model...‘
    !../scripts/download_model_binary.py ../models/bvlc_reference_caffenet

CaffeNet found

#第三步,设置用CPU来加载Caffe并且加载网络
caffe.set_mode_cpu()

model_def=caffe_root +  ‘models/bvlc_reference_caffenet/deploy.prototxt‘   #网络结构定义文件
model_weights=caffe_root +  ‘models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel‘   #加载了caffe的预训练模型

#定义网络
net =  caffe.Net(model_def,model_weights,caffe.TEST)       #用caffe的测试模式,即只是提取特征,不训练
#定义转换也即是预处理函数
#caffe中用的图像是BGR空间,但是matplotlib用的是RGB空间;再比如caffe的数值空间是[0,255]但是matplotlib的空间是[0,1]。这些都需要转换过来
#载入imagenet的均值,实际图像要减去这个均值,从而减少噪声的影响
mu = np.load(caffe_root + ‘python/caffe/imagenet/ilsvrc_2012_mean.npy‘)
mu = mu.mean(1).mean(1)  #计算像素的平均值
print ‘mean-subtracted values:‘, zip(‘BGR‘, mu)     #打印B、G、R的平均像素值

# 定义转换输入的data数值的函数
transformer = caffe.io.Transformer({‘data‘: net.blobs[‘data‘].data.shape})

transformer.set_transpose(‘data‘, (2,0,1))  # 分离图像的RGB三通道
transformer.set_mean(‘data‘, mu)            # 减去平均像素值
transformer.set_raw_scale(‘data‘, 255)      # 将0-1空间变成0-255空间
transformer.set_channel_swap(‘data‘, (2,1,0))  # 交换RGB空间到BGR空间

mean-subtracted values: [(‘B’, 104.0069879317889), (‘G’, 116.66876761696767), (‘R’, 122.6789143406786)]

#第四步,用CPU来进行图像的分类
#首先,可以resize图像的大小
net.blobs[‘data‘].reshape(50,3,227,227)   #batchsize=50,三通道,图像大小是227*227
#第五步,加载图像
image = caffe.io.load_image(caffe_root + ‘examples/00-classification-test/dog.jpg‘)
traformed_image = transformer.preprocess(‘data‘,image)
plt.imshow(image)

#将图像数据拷贝到内存中并分配给网络net
net.blobs[‘data‘].data[...] = traformed_image

#分类,这里用的是caffemodel,这是在imagenet上的预训练模型,有1000类
output = net.forward()

output_prob = output[‘prob‘][0]                                      #这里是输出softmax回归向量
print ‘predicted class is:‘, output_prob.argmax()           #找出这个向量里面值最大的那个标号

predicted class is: 253

#第五步,加载imagenet里面1000类的标签
labels_file=caffe_root + ‘data/ilsvrc12/synset_words.txt‘
if not os.path.exists(labels_file):
    !../data/ilsvrc12/get_ilsvrc_aux.sh

labels =  np.loadtxt(labels_file,str,delimiter=‘\t‘)
print ‘output label:‘, labels[output_prob.argmax()]    #输出是一个八仙吉犬,牛逼!

output label: n02110806 basenji

#输出概率较大的前五个物体
top_inds = output_prob.argsort()[::-1][:5]

print ‘probailities and labels:‘
zip(output_prob[top_inds],labels[top_inds])             #根据概率,输出排名前五个

probailities and labels:

[(0.81211644, ‘n02110806 basenji’),

(0.098898478, ‘n02087046 toy terrier’),

(0.030348787, ‘n02113023 Pembroke, Pembroke Welsh corgi’),

(0.022625968, ‘n02091032 Italian greyhound’),

(0.015911266, ‘n02113186 Cardigan, Cardigan Welsh corgi’)]

#采用cpu查看一次正向传播时间
%timeit net.forward()

1 loop, best of 3: 521 ms per loop

#采用gpu查看一次正向的时间
caffe.set_device(0)  # 假如有多块gpu,选择第一块gpu
caffe.set_mode_gpu()
net.forward()
%timeit net.forward()

10 loops, best of 3: 61.6 ms per loop

#显示各个层的参数和输出类型,输出分别是(batchsize,通道数或者feature map数目,输出image高,输出image宽)
for layer_name,blob in net.blobs.iteritems():
    print layer_name +‘\t‘ + str(blob.data.shape)

data (50, 3, 227, 227)

conv1 (50, 96, 55, 55)

pool1 (50, 96, 27, 27)

norm1 (50, 96, 27, 27)

conv2 (50, 256, 27, 27)

pool2 (50, 256, 13, 13)

norm2 (50, 256, 13, 13)

conv3 (50, 384, 13, 13)

conv4 (50, 384, 13, 13)

conv5 (50, 256, 13, 13)

pool5 (50, 256, 6, 6)

fc6 (50, 4096)

fc7 (50, 4096)

fc8 (50, 1000)

prob (50, 1000)

#查看参数,存放参数的数据结构是输出的feature-map数量,输入的feature-map数量,卷积核大小
#这里conv3和conv4分开了,分别是192,则192*2=384
#后面只有一个参数的表示偏置b数量
for layer_name,param in net.params.iteritems():
    print layer_name + ‘\t‘ + str(param[0].data.shape),str(param[1].data.shape)

conv1 (96, 3, 11, 11) (96,)

conv2 (256, 48, 5, 5) (256,)

conv3 (384, 256, 3, 3) (384,)

conv4 (384, 192, 3, 3) (384,)

conv5 (256, 192, 3, 3) (256,)

fc6 (4096, 9216) (4096,)

fc7 (4096, 4096) (4096,)

fc8 (1000, 4096) (1000,)

#第六步,定义卷积核可视化函数
def vis_square(data):
    """
    将数列(通道数,高度,宽度)可视化为(高度,宽度),即卷积核可视化。
    """
    #标准化数据normalize
    data = (data-data.min())/(data.max()-data.min())
    #强制滤波器/卷积核数量为偶数
    n = int(np.ceil(np.sqrt(data.shape[0])))
    padding = (((0, n ** 2 - data.shape[0]),
               (0, 1), (0, 1))                 # add some space between filters
               + ((0, 0),) * (data.ndim - 3))  # don‘t pad the last dimension (if there is one)
    data = np.pad(data, padding, mode=‘constant‘, constant_values=1)  # pad with ones (white)

#给卷积核命名
    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:])

    plt.imshow(data);
#  plt.axis(‘off‘)         #关闭坐标轴
#查看各个层的参数(params)
filters = net.params[‘conv1‘][0].data
vis_square(filters.transpose(0,2,3,1))

#可视化数据卷积层的效果图
feat = net.blobs[‘data‘].data[0,:3]
vis_square(feat)

#显示/统计全连接层和prob层
feat = net.blobs[‘fc7‘].data[0]
plt.subplot(2,1,1)         #两行一列第一个
plt.plot(feat.flat)
plt.subplot(2,1,2)        #两行一列第二个图像
a= plt.hist(feat.flat[feat.flat > 0], bins=100)     #统计直方图

#第七步,统计属于哪一类的概率,记住imagenet有1000类
feat = net.blobs[‘prob‘].data[0]
plt.figure(figsize=(15,3))
plt.plot(feat.flat)

#第八步,载入网上任意的图像,统计其特性
#输入图像的URL地址
my_image_url ="https://upload.wikimedia.org/wikipedia/commons/b/be/Orang_Utan%2C_Semenggok_Forest_Reserve%2C_Sarawak%2C_Borneo%2C_Malaysia.JPG"

!wget -O image.jpg $my_image_url
#转换数据
image = caffe.io.load_image("image.jpg")
net.blobs[‘data‘].data[...] = transformer.preprocess(‘data‘,image)

net.forward()

out_prob = net.blobs[‘prob‘].data[0]
top_inds = output_prob.argsort()[::-1][:5]

plt.imshow(image)

print ‘probabilites and labels:‘

zip(output_prob[top_inds],labels[top_inds])

–2016-05-04 20:57:11– https://upload.wikimedia.org/wikipedia/commons/b/be/Orang_Utan%2C_Semenggok_Forest_Reserve%2C_Sarawak%2C_Borneo%2C_Malaysia.JPG

正在解析主机 upload.wikimedia.org (upload.wikimedia.org)… 198.35.26.112, 2620:0:863:ed1a::2:b

正在连接 upload.wikimedia.org (upload.wikimedia.org)|198.35.26.112|:443… 已连接。

已发出 HTTP 请求,正在等待回应… 200 OK

长度: 1443340 (1.4M) [image/jpeg]

正在保存至: “image.jpg”

100%[======================================>] 1,443,340 25.8KB/s 用时 80s

2016-05-04 20:58:35 (17.6 KB/s) - 已保存 “image.jpg” [1443340/1443340])

probabilites and labels:

[(0.96807837, ‘n02480495 orangutan, orang, orangutang, Pongo pygmaeus’),

(0.030588904, ‘n02492660 howler monkey, howler’),

(0.00085891597, ‘n02493509 titi, titi monkey’),

(0.00015429019, ‘n02493793 spider monkey, Ateles geoffroyi’),

(7.2596624e-05, ‘n02488291 langur’)]

时间: 2024-10-28 19:18:31

Caffe学习1-图像识别与数据可视化的相关文章

Caffe学习系列(13):数据可视化环境(python接口)配置

caffe程序是由c++语言写的,本身是不带数据可视化功能的.只能借助其它的库或接口,如opencv, python或matlab.大部分人使用python接口来进行可视化,因为python出了个比较强大的东西:ipython notebook, 现在的最新版本改名叫jupyter notebook,它能将python代码搬到浏览器上去执行,以富文本方式显示,使得整个工作可以以笔记的形式展现.存储,对于交互编程.学习非常方便. 一.安装python和pip 一般linux系统都自带python,

Caffe学习系列(11):数据可视化环境(python接口)配置

参考:http://www.cnblogs.com/denny402/p/5088399.html 这节配置python接口遇到了不少坑. 1.我是利用anaconda来配置python环境,在将caffe根目录下的python文件夹加入到环境变量这一步时遇到 问题,我用那个命令打开后不知道怎么加入export.其实可以用如下命令解决: sudo gedit ~/.bashrc 2.修改配置文件,只需修改anaconda部分,但注意!原注释中的anaconda改为anaconda2 3.在jup

Caffe学习系列(2):数据层及参数

要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成.所有的参数都定义在caffe.proto这个文件中.要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写. 层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs的方式进行. 今天我们就先介绍一下数据层. 数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从B

转 Caffe学习系列(2):数据层及参数

http://www.cnblogs.com/denny402/p/5070928.html 要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成.所有的参数都定义在caffe.proto这个文件中.要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写. 层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs的方式进行. 今天我们就

Caffe 学习系列

学习列表: Google protocol buffer在windows下的编译 caffe windows 学习第一步:编译和安装(vs2012+win 64) caffe windows学习:第一个测试程序 Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn Caffe学习系列(2):数据层及参数 Caffe学习系列(3):视觉层(Vision Layers)及参数 Caffe学习系列(4):激活层(Activiation Layers)及参数

转 Caffe学习系列(3):视觉层(Vision Layers)及参数

所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision Layers)的参数,视觉层包括Convolution, Pooling, Local Response Normalization (LRN), im2col等层. 1.Convolution层: 就是卷积层,是卷积神经网络(CNN)的核心层. 层类型:Convolution lr_mult: 学习率

Python数据可视化库-Matplotlib(一)

今天我们来学习一下python的数据可视化库,Matplotlib,是一个Python的2D绘图库 通过这个库,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率图,条形图,错误图,散点图等等 废话不多说,我们直接通过例子来进行讲解. 首先我们有一组数据如下: 我们可以看到,这组数据有日期,还有日期对应的值,因为这组数据中的日期格式不是标准的日期格式 那么我们对数据做一下转换,取1948年的整年的数据,来进行一个绘图操作 import pandas as pd unrate = pd.rea

CAFFE学习笔记(四)将自己的jpg数据转成lmdb格式

1 引言 1-1 以example_mnist为例,如何加载属于自己的测试集? 首先抛出一个问题:在example_mnist这个例子中,测试集是人家给好了的.那么如果我们想自己试着手写几个数字然后验证识别效果又当如何呢? 观察CAFFE_ROOT/examples/mnist/下的lenet_train_test.prototxt文件,发现里面既给出了训练集的路径,又给出了测试集的路径.因此答案很显然了,我们可以把自己的测试集做成leveldb(或lmdb)格式的,然后在lenet_train

Caffe学习系列——工具篇:神经网络模型结构可视化

Caffe学习系列--工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py 本文将就这两种方法加以介绍 1. Netscope:支持Caffe的神经网络结构在线可视化工具 Netscope是个支持prototxt格式描述的神经网络结构的在线可视工具,网址:  http://ethereon.github.io/netscope/quickstart.html  它可以用来可

CAFFE学习笔记(五)用caffe跑自己的jpg数据

1 收集自己的数据 1-1 我的训练集与测试集的来源:表情包 由于网上一幅一幅图片下载非常麻烦,所以我干脆下载了两个eif表情包.同一个表情包里的图像都有很强的相似性,因此可以当成一类图像来使用.下载个eif解压包可以把eif文件解压成gif和jpg格式的文件,然后删除gif文件,只留下jpg格式的文件,这些图就是我的训练集与测试集了. 1-2 使用rename批量重命名图像 (1)对于一个存放了图像src.jpg的文件夹ROOT,在ROOT中新建一个test.txt文件,在里面写下"renam