【caffe源码研究】第二章:使用篇(4) : python接口
来源:互联网 发布:淘宝天猫优惠券网站 编辑:程序博客网 时间:2024/06/18 00:33
本小节介绍一下python的使用接口。python接口的调用需要在编译正确python接口的环境下,详见安装篇。
make pycaffe
一、画网络结构图
使用python接口的draw_net.py可以将提供的网络结构画出图像。
首先,需要安装graphviz,源码安装,yum源安装,jumbo安装等等都可以。
这里讲一下源码安装。
graphviz源码安装暂留
然后安装pydot,直接使用pip安装即可
pip install pydot
然后可以使用draw_net.py来画网络图,如下
draw_net.py执行的时候带三个参数
- 第一个参数:网络模型的prototxt文件
- 第二个参数:保存的图片路径及名字
- 第三个参数:–rankdir=x , x 有四种选项,分别是LR, RL, TB, BT 。用来表示网络的方向,分别是从左到右,从右到左,从上到小,从下到上。默认为LR。
python draw_net.py ../examples/cifar10/cifar10_quick_train_test.prototxt cifa10.png
画出来的网络图如下
二、python接口
Python接口应用的很广泛,主要是简单易用。
写一个预测数字的python代码
predict_num.py代码如下:
__author__ = 'frank'import osimport numpy as npimport matplotlib.pyplot as pltimport sysimport caffecaffe_root = '/home/thirdparty/caffe-master/'import syssys.path.append(caffe_root + 'python')Path = "F:/caffe/data/"# load mean filemean_filename = Path+'image_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]#load pretrain filepretrained_file = Path+'lenet_iter_10000.caffemodel'#load modle filemodel_file = Path+'deploy.prototxt'#create caffe netnumReg_net = caffe.Classifier(model_file, pretrained_file, mean = mean, channel_swap=(2,1,0), raw_scale=255, image_dims=(32, 32))#labelslist=['0','1','2','3','4','5','6','7','8','9']image_path = Path + 'trainData/7/7-5-IFPYM1SLG8.jpg'test_image = caffe.io.load_image(image_path)plt.imshow(test_image)plt.show()prediction = numReg_net.predict([test_image])print 'predictions:', prediction[0] #list[prediction[0].argmax()]print 'predicted num:', list[prediction[0].argmax()]
运行结果
predictions: [ 0. 0.5 0. 0. 0. 0. 0. 0.5 0. 0. ]predicted num: 1
试了好几次,每次都是输出两个概率为0.5的数字。后来经过调试,发现问题在于predict函数定义为
def predict(self, inputs, oversample=True): """ Predict classification probabilities of inputs. Parameters ---------- inputs : iterable of (H x W x K) input ndarrays. oversample : boolean average predictions across center, corners, and mirrors when True (default). Center-only prediction when False. Returns ------- predictions: (N x C) ndarray of class probabilities for N images and C classes. """
其中有一个默认参数oversample,如果将其值设为True,则会将图像从中心,边界取图,做镜像翻转,然后预测之后取平均值。这里做数字预测肯定是不能开启这个选项的!
修改代码为
prediction = numReg_net.predict([test_image],False)
再次运行即得到正确结果
predictions: [ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]predicted num: 7
三、python预测
python接口是对函数进行了封装,这部分不使用封装好的函数,直接用python进行预测。其实本质就是Classifier和predict函数。
一个实例如下
# -*- coding:utf-8 -*-__author__ = 'fangjin'import numpy as np #调用numpy模块,调用名称为npimport matplotlib.pyplot as plt #调用matplotlib.pyplot模块,调用名称为pltimport sysimport caffeImageEqulity_root = 'D:/data/' #caffe根目录model_file = ImageEqulity_root + 'lenet_deploy.prototxt' #CaffeNet网络结构pretrained = ImageEqulity_root + 'lenet_iter_10000.caffemodel' #参数文件image_file = ImageEqulity_root+'testData/4/4-3-0Z5FN38C0Q.jpg' #测试数据mean_filename = ImageEqulity_root + 'image_mean.binaryproto'#npload = ImageEqulity_root + '/python/caffe/imagenet/ilsvrc_2012_mean.npy' #计算平均值# 显示图像模块plt.rcParams['figure.figsize'] = (10, 10) # 显示图标大小为10plt.rcParams['image.interpolation'] = 'nearest' # 图形差值以最近为原则plt.rcParams['image.cmap'] = 'gray' #背景颜色为灰色IMAGE_SIZE = (32, 32)MEAN_VALUE = 128caffe.set_mode_cpu()net = caffe.Net(model_file, pretrained, caffe.TEST)proto_data = open(mean_filename, "rb").read()a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)mean = caffe.io.blobproto_to_array(a)[0]transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})transformer.set_transpose('data', (2,0,1))# transformer.set_channel_swap('data',(2,1,0)) # 参考模型通道为BGR,需转换成RGB,括号中的数字表示排列顺序#transformer.set_mean('data', np.array([MEAN_VALUE]))#transformer.set_mean('data', mean)transformer.set_raw_scale('data', 255)image = caffe.io.load_image(image_file, True)# net.blobs['data'].reshape(1, 3, 100, 100)# net.blobs['data'].reshape(1, 3, *IMAGE_SIZE) # reshaoetransformed_image = transformer.preprocess('data',image)#读取文件net.blobs['data'].data[...]=transformed_imageout = net.forward()score = out['prob'][0]num_list=['0','1','2','3','4','5','6','7','8','9']print "Predicted class is : " ,scoreprint 'predicted num:', num_list[score.argmax()]
主要是定义了一个Transformer,对图像进行预处理。然后通过out = net.forward()
进行前向计算,之后score = out['prob'][0]
输出prob层的结果就可以了,因为只有一张图像,所以是out['prob'][0]
。
1 0
- 【caffe源码研究】第二章:使用篇(4) : python接口
- 【caffe源码研究】第二章:使用篇(3) : C++接口
- 【caffe源码研究】第二章:使用篇(2):tools
- 【caffe源码研究】第二章:使用篇(5) : 模型可视化
- 【caffe源码研究】第二章:使用篇(1): 制作数据集
- 【caffe源码研究】第二章:使用篇(6) : 训练过程分析工具
- 【caffe源码研究】第二章:实战篇(2) : ImageNet分类
- 【caffe源码研究】第三章:源码篇(4) :Solver
- 【caffe源码研究】第三章:源码篇(6) :caffe.proto
- 【caffe源码研究】第二章:实战篇(1) : 字符识别项目
- caffe python 接口使用
- caffe中使用python接口
- 【caffe源码研究】第三章:源码篇(3) :工厂模式
- 【caffe源码研究】第三章:源码篇(5) :Net
- 【caffe源码研究】第三章:源码篇(7) :Layer种类
- 【caffe源码研究】第三章:源码篇(8) :Layer代码
- 【caffe源码研究】第三章:源码篇(9) :DataLayer
- 【caffe源码研究】第三章:源码篇(10) :ConvolutionLayer
- co01/co02时通过增强 EXIT_SAPLCOSD_001修改组件的默认库存地点
- ArcGIS Desktop 10.5 安装实录
- MongoDB Requested option conflicts with current storage engine option for directoryPerDB
- 阿里云配置mysql远程连接
- Unity 3D中的内存管理
- 【caffe源码研究】第二章:使用篇(4) : python接口
- android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)
- 可变参数
- 前端知识小测验
- unreal engine 4.13 打包出错
- MySQL中MyISAM文件损坏时的一种修复方法
- 二叉树的可视化
- js返回两个数之间的随机数
- android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(二)