date:2017.9-2018.4 purpose:毕设
1caffe
简介
Caffe框架主要有五个组件:Blob,Solver,Net,Layer,Proto,
模型定义在.prototxt文件中,训练好的模型在model目录下.binaryproto格式的文件中。模型的格式由caffe.proto定义。采用Google Protocol Buffer可以节省空间还有它对C++和Pyhton的支持也很好
caffe的matlab和python接口安装
(详细见github的学习笔记中的word文件)
使用微软的caffe版本(https://github.com/Microsoft/caffe)时遇到了"gpu/mxGPUArray.h" Not Found问题,是因为的matlab版本太新了,修改CommonSettings.props配置如下:
<IncludePath>$(MatlabDir)\extern\include;$(MatlabDir)\toolbox\distcomp\gpu\extern\include;$(IncludePath)</IncludePath> <!-- 增加了一个include路径 -->
具体排查过程,全局查找mxGPUArray.h,发现在$(MatlabDir)\toolbox\distcomp\gpu\extern\include路径下,遂在配置中加上。估计是matlab新版本中gpu文件夹已从\extern\include独立出来了。
### ***\*Matlab接口参考:\****
http://blog.youkuaiyun.com/zb1165048017/article/details/51702686
重启后生效,电脑重启
### 4Matcaffe使用
classfy_demo的 matlab运行不了:要把release路径加入matlab的路径
[scores, maxlabel] = classification_demo(im, 0); %0是cpu,1是gpu
先运行classfy——demo没有错误然后用
[scores, maxlabel] = classification_demo(im, 0); 试一下
http://blog.youkuaiyun.com/kkk584520/article/details/49475633
http://blog.youkuaiyun.com/sinat_31821401/article/details/69945442?locationNum=2&fps=1
mnist调试caffe
http://blog.youkuaiyun.com/zb1165048017/article/details/52447109#reply
1生成txt,matlab或者脚本
http://www.cnblogs.com/denny402/p/5083300.html
2训练500张图片预测
http://blog.youkuaiyun.com/baidu_30028771/article/details/60882620
3solver.prototxt参数说明
olver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
caffe train --solver=_slover.prototxt
Python:
:无法打开包括文件 "pyconfig" no such file or directory
Python的路径换成绝对路径 :<IncludePath>$(PythonDir)\include;D:\AnZhuangbao\p_anaconda\include;$(IncludePath)</IncludePath>
1.2 编译生成pycaffe
编译解决方案,注意需要在【release】模式下,因为在debug下找不到 python对应的调试版本。
在[caffe_root]\Build\x64\Release 目录下会生成pycaffe目录。我一般会把内部的caffe文件夹直接拷贝到python包管理目录site-packages中。
#### 1测试cifar图像:
caffe+python.py
http://www.mamicode.com/info-detail-1319332.html
#### 生成txt和lmdb,训练
http://blog.youkuaiyun.com/u010417185/article/details/52119863
Python格式均值计算
http://www.cnblogs.com/denny402/p/5102328.html
训练过程
http://blog.youkuaiyun.com/deeplearninglc007/article/details/40086503
测试:
$ ./build/tools/caffe.bin test -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0
2卷积神经网络(cnn)
参考:魏秀参 知乎
自从AlexNet在2012年的成功以来,CNN已有各种改进。
而卷积神经网络中conv+relu(早期为sigmoid)+pooling(以下称三剑客)的组合,不仅可以替代手工设计特征算子的繁琐,而且局部感受野+权值共享的设计思想也能避免全连接网络中的种种弊端。此时人们将三剑客的组合视为特征提取的过程,如果按照早期人们特征提取+分类的设计思路,那么分类使用全连接的设计方式,就可以刚好实现了一个end-to-end的架构,也即早起卷积神经网络的原型。
1全连接层(FC)在整个卷积神经网络中起到“分类器”的作用
2softmax等损失函数作为网络目标函数
3微调(fine tuning)是深度学习领域最常用的迁移学习技术。
4特别是在源域与目标域差异较大的情况下,FC可保持较大的模型capacity从而保证模型表示能力的迁移。
局部感知野、权值共享、多卷积核
cnn几个主要部分
1激活函数:Relu; 只对前两个全连接层进行dropout,sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。ReLU的优点是收敛快,求梯度简单
- 是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
- CONV:卷积计算层,线性乘积 求和。
- RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
- POOL:池化层,简言之,即取区域平均或最大。
- FC:全连接层
神经网络
区别CNN、RNN,dnn
CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。
RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征提取层
DNN 说白了就是 多层网络,只是用了很多技巧,让它能够 deep 。
人工特征
人工特征:sift,spin image,HoG,RIFT,GLOH,Textons
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子
第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。第二阶段:SIFT特征向量的匹配
Spin image的思想是将一定区域的点云分布转换成二维的spin image,然后对场景和模型的spin images进行相似性度量。原理图如下
Hog:方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主
LBP是一种图像纹理特征(提取算法),它是一种局部特征,是照片分类和人脸检索研究中采用较多的特征提取算法之一。
特征提取算法是模式识别算法的重要组成部分之一,另外一个重要部分是分类算法。
参考文献及推荐阅读
- 人工神经网络wikipedia
- 斯坦福机器学习公开课
- http://neuralnetworksanddeeplearning.com/
- 雨石 卷积神经网络:http://blog.youkuaiyun.com/stdcoutzyx/article/details/41596663
- cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/,中译版
- cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/
- 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
- 七月在线5月深度学习班第5课CNN训练注意事项部分视频:https://www.julyedu.com/video/play/42/207
- 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
- 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:http://blog.youkuaiyun.com/joycewyj/article/details/51792477
- 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
- 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:http://blog.youkuaiyun.com/han_xiaoyang/article/details/50100367
- 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.youkuaiyun.com/han_xiaoyang/article/details/50447834
- 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.youkuaiyun.com/han_xiaoyang/article/details/50542880
- zxy 图像卷积与滤波的一些知识点:http://blog.youkuaiyun.com/zouxy09/article/details/49080029
- zxy 深度学习CNN笔记:http://blog.youkuaiyun.com/zouxy09/article/details/8781543/
- http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/,中译版
- 《神经网络与深度学习》中文讲义:http://vdisk.weibo.com/s/A_pmE4iIPs9D
- ReLU与sigmoid/tanh的区别:https://www.zhihu.com/question/29021768
- CNN、RNN、DNN内部网络结构区别:https://www.zhihu.com/question/34681168
- 理解卷积:https://www.zhihu.com/question/22298352
- 神经网络与深度学习简史:1 感知机和BP算法、4 深度学习的伟大复兴
- 在线制作gif 动图:http://www.tuyitu.com/photoshop/gif.htm
- 支持向量机通俗导论(理解SVM的三层境界)
- CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象
代码阅读
1python
net = caffe.Net(model_def, # 定义模型结构deploy.prototxt
model_weights, # 包含了模型的训练权值bvlc_reference_caffenet.caffemodel
caffe.TEST) # 使用测试模式(不执行dropout)??
设置输入图像大小??
# 加载ImageNet图像均值 (随着Caffe一起发布的)????
mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
mu = mu.mean(1).mean(1) # 对所有像素值取平均以此获取BGR的均值像素值
print 'mean-subtracted values:', zip('BGR', mu)
# 对输入数据进行变换 ????caffe.io.Transformer
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1)) # 将图像的通道数设置为outermost的维数
transformer.set_mean('data', mu) # 对于每个通道,都减去BGR的均值像素值
transformer.set_raw_scale('data', 255) # 将像素值从[0,255]变换到[0,1]之间
transformer.set_channel_swap('data', (2, 1, 0)) # 交换通道,从RGB变换到BGR
# 设置输入图像大小
net.blobs['data'].reshape(50, # batch 大小 ????net.blobs
3, # 3-channel (BGR) images
227, 227) # 图像大小为:227x227
# 3.2 加载图像(caffe自带的)并进行预处理。caffe.io.load_image
image = caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')
transformed_image = transformer.preprocess('data', image)
plt.imshow(image)
plt.show()
# 将图像数据拷贝到为net分配的内存中
net.blobs['data'].data[...] = transformed_image
### 执行分类
output = net.forward()
output_prob = output['prob'][0] # batch中第一张图像的概率值
print 'predicted class is:', output_prob.argmax()
2
# 加载ImageNet标签,确定类别
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()]
2脚本代码
1二进制到lmdb
测试图片和标签转换成二进制:
D:\AnZhuangbao\caffe\719\caffe-master716\caffe-master\data\mnist\812testmnist的readjpg.m
二进制转换成lmdb
create_mnist.bat
..\..\Build\x64\Release\convert_mnist_data.exe train-images.idx3-ubyte train-labels.idx1-ubyte..\..\examples\mnist\mnist_train_lmdb
2图像到lmdb,用python??/convert_imageset
利用convert_imageset
1创建图片清单
create_filelist.sh
# /usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
create_lmdb.sh
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \--resize_height=256 --resize_width=256 \/home/xxx/caffe/examples/images/ $DATA/train.txt $DATA/img_train_lmdb
得到db文件
1
3、create_mnist812.bat,mnist二进制生成lmdb
..\..\Build\x64\Release\convert_mnist_data.exe test_img_ubyte test_lable_ubyte ..\..\examples\mnist\mnist_test_lmdb
4、mnist_test.bat
4均值文件生成与使用,
利用caffe的compute_image_mean.exe
利用mnist_mean.bat
Build\x64\Release\compute_image_mean.exe examples\mnist\mnist_train_lmdb mean.binaryproto --backend=lmdb
Pause
##
提取特征:caffe的工具
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model
examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中 fc7 是最高层的特征,我们也可以使用其他层提取,像 conv5 或 pool3
备注:用 caffe 的 python 接口提取和保存特征到text文本下
features = net.blobs['conv5'].data # 提取卷积层 5 的特征
np.savetxt('conv5_feature.txt', features) # 将特征存储到本文文件中
#!/usr/bin/env sh
# args for EXTRACT_FEATURE
TOOL=../../build/tools
MODEL=../../examples/imagenet/caffe_reference_imagenet_model #下载得到的caffe model
PROTOTXT=../../examples/_temp/imagenet_val.prototxt # 网络定义
LAYER=conv1 # 提取层的名字,如提取fc7等
LEVELDB=../../examples/_temp/features_conv1 # 保存的leveldb路径
BATCHSIZE=10
# args for LEVELDB to MAT
DIM=290400 # 需要手工计算feature长度
OUT=../../examples/_temp/features.mat #.mat文件保存路径
BATCHNUM=1 # 有多少哥batch, 本例只有两张图, 所以只有一个batch
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
python leveldb2mat.py $LEVELDB $BATCHNUM $BATCHSIZE $DIM $OUT
网络
1生成txt,matlab或者脚本
http://www.cnblogs.com/denny402/p/5083300.html
3solver.prototxt参数说明
olver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
# caffe train --solver=*_slover.prototxt
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择,接下来,我们先来看一个实例:
net: "examples/mnist/lenet_train_test.prototxt" #设置深度网络模型。每一个模型就是一个net
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
type: SGD
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU
### 提取特征:caffe的工具 extract_features
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model
examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中 fc7 是最高层的特征,我们也可以使用其他层提取,像 conv5 或 pool3
备注:用 caffe 的 python 接口提取和保存特征到text文本下
features = net.blobs['conv5'].data # 提取卷积层 5 的特征
np.savetxt('conv5_feature.txt', features) # 将特征存储到本文文件中
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请参考:
http://blog.youkuaiyun.com/jiandanjinxin/article/details/50410290
例子
```bash
#!/usr/bin/env sh
args for EXTRACT_FEATURE
TOOL=../../build/tools
MODEL=../../examples/imagenet/caffe_reference_imagenet_model #下载得到的caffe model
PROTOTXT=../../examples/_temp/imagenet_val.prototxt # 网络定义
LAYER=conv1 # 提取层的名字,如提取fc7等
LEVELDB=../../examples/_temp/features_conv1 # 保存的leveldb路径
BATCHSIZE=10
args for LEVELDB to MAT
DIM=290400 # 需要手工计算feature长度
OUT=../../examples/_temp/features.mat #.mat文件保存路径
BATCHNUM=1 # 有多少哥batch, 本例只有两张图, 所以只有一个batch
$TOOL/extract_features.bin $MODEL $PROTOTXT $LAYER $LEVELDB $BATCHSIZE
python leveldb2mat.py $LEVELDB $BATCHNUM $BATCHSIZE $DIM $OUT
```
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择,接下来,我们先来看一个实例:
#### solver文件
```bash
net: "examples/mnist/lenet_train_test.prototxt" #设置深度网络模型。每一个模型就是一个net
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
type: SGD #优化方式
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU
```
#### 转换成lmdb
**1二进制到lmdb**
测试图片和标签转换成二进制:
```bash
D:\AnZhuangbao\caffe\719\caffe-master716\caffe-master\data\mnist\812testmnist的readjpg.m
二进制转换成lmdb
create_mnist.bat
..\..\Build\x64\Release\convert_mnist_data.exe train-images.idx3-ubyte train-labels.idx1-ubyte..\..\examples\mnist\mnist_train_lmdb
```
#### 2图像数据转换成db(leveldb/lmdb)文件
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
需要带四个参数:
FLAGS: 图片参数组,后面详细介绍
ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片
DB_NAME: 最终生成的db文件存放目录
如果图片已经下载到本地电脑上了,那么我们首先需要创建一个图片列表清单,保存为txt
本文以caffe程序中自带的图片为例,进行讲解,图片目录是 example/images/, 两张图片,一张为cat.jpg, 另一张为fish_bike.jpg,表示两个类别。
1用python/convert_imageset
```bash
##create_filelist.sh
/usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
create_lmdb.sh
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \--resize_height=256 --resize_width=256 \/home/xxx/caffe/examples/images/ $DATA/train.txt $DATA/img_train_lmdb
```
得到lmdb文件
```bash
1
3、create_mnist812.bat,mnist二进制生成lmdb
..\..\Build\x64\Release\convert_mnist_data.exe test_img_ubyte test_lable_ubyte ..\..\examples\mnist\mnist_test_lmdb
4、mnist_test.bat
2利用classification.exe对自己的手写数字进行分类
1、准备若干张手写数字,二值化
Classification:proto、model、mean、words.txt、jpg
在D:\Study\Caffe\caffe-windows\examples\mnist目录下,同时将需要测试的图片也放到这里。
```
classification\prototxt\caffemodel\binaryproto\lable\jpg
```
新建test_personwrite.bat
D:\caffe-master\Build\x64\Release\classification.exe
D:\caffe-master716\caffe-master\examples\mnist\lenet.prototxt
D:\caffe-master716\caffe-master\examples\mnist\lenet_iter_10000.caffemodel D:\caffe-master\examples\mnist\mean.binaryproto
D:\AnZhuangbao\caffe\719\caffe-master716\caffe-master\examples\mnist\lable.txt D:\AnZhuangbao\caffe\719\caffe-master716\caffe-master\examples\mnist\39.jpg
pause
4均值文件生成与使用,
利用caffe的compute_image_mean.exe
利用mnist_mean.bat
Build\x64\Release\compute_image_mean.exe examples\mnist\mnist_train_lmdb mean.binaryproto --backend=lmdb
Pause
```
术语和概念
从神经网络说起:深度学习初学者不可不知的25个术语和概念http://www.afenxi.com/post/44887