caffe学习

一、python接口
1.1 加载caffe
$ import caffe
$ import numpy as np
$ import cv2
$ import os
设置caffe的路径
$ caffe_root = ‘/home/skyedu/project/hand/Hand-Gesture-Recognition-with-JetsonTX2/GEST/’

1.2 设置GPU模式
$ caffe.set_mode_gpu()
在GPU模式下运行
$ caffe.set_device(0)
使用第一块显卡

1.3 模型文件、权重、标签
$ MODEL_FILE = caffe_root + ‘data/deploy.prototxt’
$ WEIGHT_CAFFEMODEL = caffe_root + ‘data/ snapshot_iter_17255.caffemodel’
$ LABEL = caffe_root + ‘data/ post_label.txt ’

1.4 加载网络
$ net = caffe.Net(MODEL_FILE,WEIGHT_CAFFEMODEL,caffe.TEST)
参数MODEL_FILE为定义模型结构
WEIGHT_CAFFEMODEL为模型权重
caffe.TEST使用测试模型(训练中不能执行dropout)

1.5 图像预处理
1.5.1
加载均值文件
$ MEAN_FILE = caffe_root + ‘data/ mean.npy’
$ mu = np.load(MEAN_FILE)

1.5.2
取像素平均值
$ mu = mu.mean(1).mean(1)
对所有像素值取平均值以此获取彩色图像的均值像素值

1.5.3
变换输入数据
$ transformer = caffe.io.Transformer({‘data’:net.blobs[‘data’].data.shape})
caffe.io.transformer是一个类,实体化的时候构造函数__init__(self, inputs)给一个初值。其中net.blobs本身是一个字典,每一个key对应每一层的名字。
net.blobs[‘data’].data.shape计算结果为(10, 3, 227, 227)。

1.5.4
caffe.io.Transformer类的函数方法
caffe.io.transformer的类定义放在io.py文件中,也可用help函数查看说明。
$ transformer.set_transpose(‘data’, (2,0,1))
将图像通道数设置为outermost的维数
$ 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

1.6 图片reshape
$ net.blobs[‘data’].reshape(batchsize, channel, height, width)
如:net.blobs[‘data’].reshape(50, 3, 227,227)
第一个参数是batchsize数,即使载入的是一张图像,batchsize也是50,具体使用情况可以自己设置。
第二个参数是输入图像的通道数。
第三四个参数是输入图像的尺寸。

1.7载入图片
$ image = caffe.io.load_image(caffe_root + ‘temp.png’)
加载图片,函数声明为load_image(filename, color = True)
$ transformd_image = transformer.preprocess(‘data’, image)
对图片进行预处理

1.8 对图片分类
$ net.blobs[‘data’].data[…] = transformed_image
将图像数据拷贝到net分配的内存中
$ output = net.forward()
前向传播,进行分类,跑一遍网络,默认结果为最后一层的blob(也可以指定某一中间层),赋给output
$ output_prob = output[‘prob’][0]
$ print(output[‘prob’].argmax())
取batch中第一张图像的概率值,输出最大概率值
$ output_prob = output[‘softmax’][0]
$ print(output[‘softmax’].argmax())
输出概率最大的类别代号,argmax()函数是求取矩阵中最大元素的索引

1.9 标签
$ labels = np.loadtxt(LABEL, str, delimiter=’\t’)
前面已加载标签数据,现在是读取纯文本数据,三个参数分别是文件地址、数据类型和数据分隔符,保存为字典格式。
$ print(‘output lable = ’, labels[output_prob.argmax()])
输出标签数据

1.10 取置信度最高的五个结果
$ top_inds = output_prob.argsort()[::-1][:5]
从softmax output中可以查看置信度最高的五个结果,并对其进行逆序排序。
$ print(“It looks like a”, labels[top_inds][0][1])
输出第一个概率的标签

1.11 中间层的可视化
1.11.1
net.blob
net.blob对应网络每一层数据,对于每一层,都有四个维度:(batchsize, channel_dim, height, width)。可以用下面的for循环打印出每层网络的参数:
$ 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)
1.11.2
net.params
net.parmas对应网络中的参数(卷积核参数,全连接层参数等),有两个字典值,net.params[0]是权值(weights),net.params[1]是偏移量(biases),权值参数的维度表示是(output_channels, input_channels, filter_heights, filter_width),偏移量参数的维度表示(output_channels)。
循环打印参数名称、权值参数和偏移量参数的维度可用以下代码实现:

   $ for layer_name, param in net.params.iteritems():
          print(layer_name + ‘\t’ + str(param[0].data.shape),str(param[1].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)
二、部署模型
2.1 实现解析
2.1.1 网络结构可视化

2.1.2 图文并解caffe源码
https://blog.csdn.net/mounty_fsc/article/category/6136645
2.1.3 caffe源码解析
https://blog.csdn.net/qq_16055159
2.1.4 caffe代码阅读
https://blog.csdn.net/xizero00/article/details/60137700
2.1.5 caffe为什么这么设计
https://www.cnblogs.com/neopenx/
2.1.6 caffe代码导读21天实战caffe
2.1.7 CNN卷积神经网络推到和实现
https://blog.csdn.net/zouxy09/article/details/9993371
2.1.8 caffe(卷积实现)
https://blog.csdn.net/mounty_fsc/article/details/51290446
2.1.9 反向传播
https://blog.csdn.net/mounty_fsc/article/details/51379395
2.1.10 caffe卷积层代码阅读笔记
https://blog.csdn.net/tangwei2014/article/details/47730797
2.1.11 caffe的python接口学习
https://www.cnblogs.com/denny402/tag/caffe/default.html?page=2

三、参考原文
https://blog.csdn.net/minstyrain/article/details/53045749
https://blog.csdn.net/jesse_mx/article/details/58605385

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值