caffe预测、特征可视化python接口调用(caffe python接口调用示例)
2016-06-14 15:50
811 查看
原文地址: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
# coding=utf-8
import os
import numpy as np
from matplotlib import pyplot as plt
import cv2
import shutil
import time
#因为RGB和BGR需要调换一下才能显示
def showimage(im):
if im.ndim == 3:
im = im[:, :, ::-1]
plt.set_cmap('jet')
plt.imshow(im)
plt.show()
#特征可视化显示,padval用于调整亮度
def vis_square(data, padsize=1, padval=0):
data -= data.min()
data /= data.max()
#因为我们要把某一层的特征图都显示到一个figure上,因此需要计算每个图片占用figure多少比例,以及绘制的位置
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))
# tile the filters into an image
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:])
showimage(data)
#设置caffe源码所在的路径
caffe_root = '../../../caffe/'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
#加载均值文件
mean_filename='./imagenet_mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean = caffe.io.blobproto_to_array(a)[0]
#创建网络,并加载已经训练好的模型文件
gender_net_pretrained='./caffenet_train_iter_1500.caffemodel'
gender_net_model_file='./deploy_gender.prototxt'
gender_net = caffe.Classifier(gender_net_model_file, gender_net_pretrained,mean=mean,
channel_swap=(2,1,0),#RGB通道与BGR
raw_scale=255,#把图片归一化到0~1之间
image_dims=(256, 256))#设置输入图片的大小
#预测分类及其可特征视化
gender_list=['Male','Female']
input_image = caffe.io.load_image('1.jpg')#读取图片
prediction_gender=gender_net.predict([input_image])#预测图片性别
#打印我们训练每一层的参数形状
print 'params:'
for k, v in gender_net.params.items():
print 'weight:'
print (k, v[0].data.shape)#在每一层的参数blob中,caffe用vector存储了两个blob变量,用v[0]表示weight
print 'b:'
print (k, v[1].data.shape)#用v[1]表示偏置参数
#conv1滤波器可视化
filters = gender_net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
#conv2滤波器可视化
'''''filters = gender_net.params['conv2'][0].data
vis_square(filters[:48].reshape(48**2, 5, 5))'''
#特征图
print 'feature maps:'
for k, v in gender_net.blobs.items():
print (k, v.data.shape);
feat = gender_net.blobs[k].data[0,0:4]#显示名字为k的网络层,第一张图片所生成的4张feature maps
vis_square(feat, padval=1)
#显示原图片,以及分类预测结果
str_gender=gender_list[prediction_gender[0].argmax()]
print str_gender
plt.imshow(input_image)
plt.title(str_gender)
plt.show()
作者:hjimce
网上有很多caffe训练好的模型,有的时候我们仅仅想要方便的调用已经训练好的模型,利用python进行预测分类测试,查看可视化结果,这个时候,我们可以使用caffe为我们写好的python接口文件,我们在安装caffe的时候,有一步:make pycaffe。这个便是安装caffe的python 结果函数,把自己用的代码记录一下,以便日后直接复制粘贴使用。感觉使用python就是轻松,如果用caffe的c++接口,挺麻烦的。
下面的使用例子是自己搞利用CNN进行性别预测的python接口调用实例:
[python] view
plain copy
# coding=utf-8
import os
import numpy as np
from matplotlib import pyplot as plt
import cv2
import shutil
import time
#因为RGB和BGR需要调换一下才能显示
def showimage(im):
if im.ndim == 3:
im = im[:, :, ::-1]
plt.set_cmap('jet')
plt.imshow(im)
plt.show()
#特征可视化显示,padval用于调整亮度
def vis_square(data, padsize=1, padval=0):
data -= data.min()
data /= data.max()
#因为我们要把某一层的特征图都显示到一个figure上,因此需要计算每个图片占用figure多少比例,以及绘制的位置
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))
# tile the filters into an image
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:])
showimage(data)
#设置caffe源码所在的路径
caffe_root = '../../../caffe/'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
#加载均值文件
mean_filename='./imagenet_mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean = caffe.io.blobproto_to_array(a)[0]
#创建网络,并加载已经训练好的模型文件
gender_net_pretrained='./caffenet_train_iter_1500.caffemodel'
gender_net_model_file='./deploy_gender.prototxt'
gender_net = caffe.Classifier(gender_net_model_file, gender_net_pretrained,mean=mean,
channel_swap=(2,1,0),#RGB通道与BGR
raw_scale=255,#把图片归一化到0~1之间
image_dims=(256, 256))#设置输入图片的大小
#预测分类及其可特征视化
gender_list=['Male','Female']
input_image = caffe.io.load_image('1.jpg')#读取图片
prediction_gender=gender_net.predict([input_image])#预测图片性别
#打印我们训练每一层的参数形状
print 'params:'
for k, v in gender_net.params.items():
print 'weight:'
print (k, v[0].data.shape)#在每一层的参数blob中,caffe用vector存储了两个blob变量,用v[0]表示weight
print 'b:'
print (k, v[1].data.shape)#用v[1]表示偏置参数
#conv1滤波器可视化
filters = gender_net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
#conv2滤波器可视化
'''''filters = gender_net.params['conv2'][0].data
vis_square(filters[:48].reshape(48**2, 5, 5))'''
#特征图
print 'feature maps:'
for k, v in gender_net.blobs.items():
print (k, v.data.shape);
feat = gender_net.blobs[k].data[0,0:4]#显示名字为k的网络层,第一张图片所生成的4张feature maps
vis_square(feat, padval=1)
#显示原图片,以及分类预测结果
str_gender=gender_list[prediction_gender[0].argmax()]
print str_gender
plt.imshow(input_image)
plt.title(str_gender)
plt.show()
相关文章推荐
- python 有序字典OrderedDict
- python新手中常见疑惑及解答
- Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
- 全面了解Python的getattr(),setattr(),delattr(),hasattr()
- 浅谈python中的getattr函数 hasattr函数
- mac安装opencv+python
- Python 文件处理方法详解
- python url解析
- python基础之模块(一)
- numpy入门学习笔记
- python循环嵌套遍历前后关联的select下拉框
- python安装NumPy
- 深入解析Python中的线程同步方法
- python os模块
- 用PDB库调试Python程序
- python 字符串 大小写转换
- [教程]Python 求解任意闭区间的所有素数
- [教程]Python 求解任意闭区间的所有素数
- [教程]Python 求解任意闭区间的所有素数
- [教程]Python 求解任意闭区间的所有素数