在 UBOOT 下串口调试助手显示乱码乱码,有人碰到过吗

Caffe训练自己的数据集并用python接口预测 - 简书
Caffe训练自己的数据集并用python接口预测
Caffe训练自己的数据集并用Python接口预测
本教程作者是清华大学在读硕士金天童鞋,在当地较为英俊的男子,大家对教程有任何疑问欢迎联系我:WeChatjintianiloveu,同时也欢迎大家转载评论,不过请保留这段版权信息,桑口~
之前写了一个博客讲Caffe训练自己的数据集,但是是英文版的,为了防止大家说我有装逼的嫌疑我还是写个中文版吧,而且这次是分五类,简洁明了,caffe入门必备,大家有任何疑问直接在下面评论吧,最后马上过年了大家给我的github repo挨个赞一个呗,我拯救世界的梦想就靠你们了!
首先还是简要的说一下Caffe在Ubuntu下的安装过程,具体安装过程如下:
安装前置依赖前置依赖项较多,好在Ubuntu下都可以通过apt下载安装,这个命令一阵复制粘帖吧:
sudo apt-get upgrade
sudo apt-get install -y build-essential cmake git pkg-config
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install -y libatlas-base-dev
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev
然后安装OpenCV3.1,这个安装已经轻车熟路了。大家对此有和疑问的查看我这个,找到Ubuntu下安装OpenCV的教程进行安装。接下来就简单了,不过为了防止后面导入caffe出问题,建议软链接一下这个东西:
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python3.so
接着clone项目:
git clone /BVLC/caffe.git
然后在我的里面下载Makefile和Makefile.config来替换原有的。接着就是安装python依赖,这里不要按照其他教程里面的安装官方的caffe/python下的requirement.txt,instead,下载我的,然后运行:
sudo pip3 install --upgrade -r python/requirements_python3.txt
后面的requirements_python3.txt也可以从上面的Repo下载。接着直接安装就行了:
make all -j
make pycaffe
测试一下是否安装成功:
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh
如果成功你就会看到caffe在训练mnist了,大概几千次之后准确度就可以达到99%,非常好。
Caffe生成并训练自己的数据集
本教程所有的代码,文件目录结构可以在我的github上下载,,下载之后你会看到一个完整的caffe训练架构,但是数据还得另外下载,我在这里只是上传了5类图片的样张图片,真正的数据集大概有600张的样子。下载地址为。接下来要生成caffe需要的数据了,步骤如下,大家先不要方,生成数据是整个过程最复杂的部分,不过这个部分也不是很麻烦,我精简一下步骤:
Step 1 Generate the image name file
Run caffe_path_gen.py in your terminal, just type:
python3 caffe_path_gen.py -train=/home/jfg/caffe_tiny5/tiny5/train -shuffle=True
-shuffle is optional, because caffe can do this too.In this tutorial we only have train data in image_data folder, we don't have test image, so we just generate the train image path, and manully divide them into train and test. But if you have test data folder, you also can type:
python3 caffe_path_gen.py -train=/home/jfg/Documents/PythonSpace/caffe_tiny5/tiny5/train -test=/home/jfg/Documents/PythonSpace/caffe_tiny5/tiny5/test -valid=/home/jfg/Documents/PythonSpace/caffe_tiny5/tiny5/valid
the valid data only generate image path without labels.After this, you gonna have train.txt, words.txt.
Step 2 Split train.txt into to train.txt and test.txt
Before split please remove the path just make it like this:
/flower/683.jpg 3
/bus/334.jpg 0
/bus/336.jpg 0
/dinosaur/481.jpg 2
/dinosaur/436.jpg 2
/bus/327.jpg 0
/elephant/595.jpg 4
/bus/357.jpg 0
/bus/393.jpg 0
/bus/375.jpg 0
/dinosaur/453.jpg 2
/flower/654.jpg 3
/dinosaur/491.jpg 2
/bus/365.jpg 0
/flower/636.jpg 3
/flower/629.jpg 3
/bus/347.jpg 0
/bus/398.jpg 0
/horse/761.jpg 1
/elephant/560.jpg 4
/dinosaur/449.jpg 2
/elephant/531.jpg 4
/horse/794.jpg 1
/horse/743.jpg 1
/elephant/586.jpg 4
But stay with the class prefix
Step 3 Generate Caffe LMDB data fileFirst mkdir a data folder just inside the project directory, and place train.txt and test.txt into it.And then open caffe_create_lmdb.sh and just edit the following two lines:
TRAIN_DATA_ROOT=/home/jfg/Documents/PythonSpace/caffe_tiny5/tiny5/train
VAL_DATA_ROOT=/home/jfg/Documents/PythonSpace/caffe_tiny5/tiny5/valid
在这一步中,确保TRAIN_DATA_ROOT和上面的train.txt中的文件名能够组成完整的路径即可。
Simply edit two lines, leave other along.Then type:
bash caffe_create_lmdb.sh
Tip: Anything wrong, check you mkdir a data folder, and have train.txt and test.txt in it.OK, after this, you gonna have two new folder in your data folder, that is:caffe_train_lmdbcaffe_val_lmdbthis is what we need to feed into caffe net and it is nothing with your original image anymore! It's complete and clean! Do not warry about path wrong anymore! Very nice!
Step 4 Generate Mean Binary FileThis step is very easy, don't change anything ,just type this in your terminal:
bash caffe_make_mean.sh
And you gonna have caffe_mean.binaryproto file in your data folder.
开始Caffe训练
you already have your data, just finish 80% work. 20% to go. Next, we gonna using solver folder. In this folder we have a solver.prototxt and a train_test.prototxt.solver.prototxt is the net pramas setting file.train_test.prototxt is the net structure setting file and your lmdb data feed into net in here.
name: "cifar"
type: "Data"
top: "data"
top: "label"
phase: TRAIN
transform_param {
mean_file: "/home/jfg/caffe_tiny5/data/caffe_mean.binaryproto"
data_param {
source: "/home/jfg/caffe_tiny5/data/caffe_train_lmdb"
batch_size: 100
backend: LMDB
name: "cifar"
type: "Data"
top: "data"
top: "label"
phase: TEST
transform_param {
mean_file: "/home/jfg/caffe_tiny5/data/caffe_mean.binaryproto"
data_param {
source: "/home/jfg/caffe_tiny5/data/caffe_val_lmdb"
batch_size: 100
backend: LMDB
This 2 layer is data feed layer, so you have to change your data path in here.Make sure it correct.Open solver.prototxt, find this 2 and edit it:
net: "/home/jfg/caffe_tiny5/solver/caffenet_train_valid.prototxt"
snapshot_prefix: "/home/jfg/caffe_tiny5/model/caffenet"
net: it is your train_test.prototxt file postion, snapshot_prefix is your save model path and prefix name, we place all saved models into a model_snapshot folder with prefix cifar10.
只需要一行命令:
bash train_caffe.sh
重点来了,得到模型之后怎么预测
这里我们使用python接口,直接上代码吧,实际上该的地方也不多:
# !/usr/bin/env python
# -*- coding: utf-8 -*-
caffe_test.py
http://www.lewisjin.coding.me
~~~~~~~~~~~~~~~
This script implement by Jin Fagang.
: copyright: (c) 2017 Didi-Chuxing.
: license: Apache2.0, see LICENSE for more details.
import numpy as np
import sys
import cv2
caffe_root = '/home/jfg/caffe/'
sys.path.insert(0, caffe_root + 'python')
import caffe
net_file = '/home/jfg/Documents/PythonSpace/caffe_tiny5/solver/caffenet_deploy.prototxt'
caffe_model = '/home/jfg/Documents/PythonSpace/caffe_tiny5/solver/model/caffenet_iter_4500.caffemodel'
mean_file = '/home/jfg/Documents/PythonSpace/caffe_tiny5/data/caffe_mean.binaryproto'
print('Params loaded!')
caffe.set_mode_gpu()
net = caffe.Net(net_file,
caffe_model,
caffe.TEST)
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
a = mean_npy[0, :, 0, 0]
print(net.blobs['data'].data.shape)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1))
transformer.set_mean('data', a)
transformer.set_raw_scale('data', 255.0)
transformer.set_channel_swap('data', (2, 1, 0))
test_img = 'elephant.jpeg'
im = caffe.io.load_image(test_img)
net.blobs['data'].data[...] = transformer.preprocess('data', im)
predict = net.forward()
names = []
with open('words.txt', 'r+') as f:
for l in f.readlines():
names.append(l.split(' ')[1].strip())
print(names)
prob = net.blobs['prob'].data[0].flatten()
print('prob: ', prob)
print('class: ', names[np.argmax(prob)])
img = cv2.imread(test_img)
cv2.imshow('Image', img)
cv2.waitKey(0)
OK,本教程到此结束,欢迎乘坐本次老司机列车。这几天一直没有更新博客不是没有写,而且写了没有上传,还是得发时间整理整理,笔耕不啜才是一代文豪应该做的事情啊。
这是一个花絮,最近我还是决定干点事情了,接下来我会研究一下如何用目标检测算法来识别交通信号灯,这个在无人驾驶领域是肯定会遇到的一个问题,具体来说它有几个难点:
检测信号灯的位置
要检测信号灯就需要训练图片,标注信号灯的方框,这个好办,现有的网络可以做到很好,接下来有个问题就是第二个点。
检测信号等每个路口转向的信号等情况
比如我检测到了信号灯,但是这个信号灯是左转通行还是右转通行呢?是左转通行直行禁止右转禁止还是其他情况呢?而且我检测算法可能在一个视角中检测多个红绿灯,但是我真正感兴趣的只是我前方的红绿灯,那么如何来却分识别出来的红绿灯也是个问题。
这两个问题如何解决还得看数据标注的情况。训练接口
人工智能爱好者,清华大学控制科学与工程硕士,深度学习领域内的一位大神级人物,魔术师利用GPU和Caffe训练神经网络
发表于 07:53|
来源www.joyofdata.de|
作者Raffael Vogler
摘要:本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。
【编者按】本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。Caffe是由发起的一个开源深度学习框架,它允许你利用你的GPU训练神经网络。相对于其他的深度学习框架如Theano或Torch等,Caffe不需要你自己编写算法程序,你只需要通过配置文件来指定网络。显然,这种做法比自己编写所有程序更加节省时间,也将你限制在一定的框架范围内。不过,在大多数情况下,这没有太大的问题,因为Caffe提供的框架相当强大,并且不断进步。这篇文章的主题由一种多层前馈网络组成。该模型将根据Kaggle的“”的数据进行训练。我们还关注将模型应用于新数据,以及如何将网络图(network graph)和训练得到的权值可视化。限于篇幅,本文不会解释所有的细节。另外,简单的代码比一千多字的话更有说服力。相对于对照来程序化细节,本文将着重描述观念以及一些我遇到的绊脚石。设置如果你还没有把Caffe安装在你的系统上,我建议在一个允许GPU处理的EC2实例上工作,例如g2.2xlarge实例。有关如何使用EC2工作的介绍可以查看,设置Caffe及其准备工作可以参考。对于使用Caffe,我也建议你在你的实例上安装IPython
Notebook——在可以找到教程。定义模型和元参数一个模型及其应用的训练至少需要三个配置文件。这些配置文件的格式遵循界面描述语言,称为协议缓冲区()。它表面上类似于JSON,但却又显著不同,实际上应该在需要进行验证(通过自定义模式的方式——像Caffe的这样)和序列化的数据文档中取代它。为了训练,你必须有一个prototxt文件保持训练的元参数()以及一个模型用于定义网络图形()——以非周期和定向的方式连接各层。需要注意的是,数据从底部流向到顶部时伴随着关于怎样指定层的顺序。这里的示例网络有五个层次:数据层(一个用于训练,一个用于测试)内积层(权值Ⅰ)ReLUs(隐含层)内积层(权值Ⅱ)输出层(用于分类的Soft Max)&A,Soft Max层给出损失&B,准确性层——允许我们看到网络如何在训练的同时提升。以下从model_train_test.prototxt的摘录显示层(4)和(5A):[...]
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
inner_product_param {
num_output: 9
weight_filler {
type: "xavier"
bias_filler {
type: "constant"
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
phase: TEST
[...]第三个prototxt文件()指定应用于它的网络。在这种情况下,它与训练规范大体上是一致的——但它缺乏数据层(因为我们不从产品的数据源中读取数据)并且Soft Max层不会产生损耗值但有分类的可能。另外,准确性层现在已经没有了。还要注意的是,我们现在在开始指定输入尺寸(如预期:1,93,1,1)——它是肯定混乱的,所有四个尺寸被称为input_dim,只有顺序定义哪个是哪个,并没有指定明确的背景。支持的数据源这是开始尝试使用Caffe时要克服的首要心理障碍之一。它不像使用一些CSV来提供Caffe可执行的方式那样简单。实际上,对于没有图像的数据,你有三种选择。LMDB(闪电内存映射数据库)LevelDBHDF5格式HDF5可能是最容易使用的,因为你只需要采用HDF5格式把数据集存储到文件中。LMDB和LevelDB是数据库,所以你必须按照他们的协议。HDF5格式存储数据集的大小会被内存限制,这就是为什么我抛弃它的原因。LMDB和LevelDB之间的选择是相当随便的——从我掠过的资源来看,LMDB似乎更强大,速度更快,更成熟。然后从GitHub来看,LevelDB的维护似乎更积极,也具有较大的Google和StackOverflow的足迹。Blobs和DatumsCaffe内部使用一个叫做Blobs的数据结构进行工作,它用于正向传递数据和反向渐变。这是一个四维数组,其四个维度被称为:N或batch_size通道高度宽度这与我们有关,因为在把它存储到LMDB之前我们必须按照结构塑造我们的案例——从它被送到Caffe的地方。图像的形状是直观的,一批次64个按规定的100×200 RGB像素的图像将最终作为形阵列(64,3,200,100)。对于一批64个特征矢量,每个长度93的Blob的形状为(64,93,1,1)。在将数据加载到LMDB时,你可以看到个别案例或特征向量存储在Datum的对象上。整型数据被存储在(字节串格式)data中,浮点型数据存储在float_data中。一开始我犯错将浮点型数据分配到data中,从而导致该模型不学习任何东西。在将Datum存储到LMDB之前,你需要将对象序列化成一个字节的字符串表示。总结对我来说,掌握Caffe是一个令人惊讶的非线性体验。也就是说,要深刻理解这个系统,还没有任何的切入点和持续的学习路径。让Caffe对你发挥作用的有效信息,分布在很多不同的,,以及。这就是为什么我花时间撰写本教程及相关的代码。在我将学到的知识总结形成文本之后,我自己都要从头读一下。我认为Caffe有一个光明的未来——只要添加新的功能,它将不仅仅是水平的增长,而且会垂直的重构和改善所有用户的体验。这绝对是高性能深度学习的好工具。如果你想要做图像处理和卷积神经网络,我建议你看看,它会为你提供一个舒适的GUI来实现目标。原文链接:(翻译/王玮 责编/周建丁)
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章用Caffe&训练和测试MNIST数据:
训练和测试MNIST数据:
MNIST,一个经典的手写数字库,包含60000个训练样本和10000个测试样本,图片大小28*28,在Caffe上配置的第一个案例
1. 准备数据
1.1 运行脚本,从MNIST网站下载和转换数据格式:
在Caffe安装路径下执行 /data/mnist: ./get_mnist.sh
& /examples/mnist:
./create_mnist.sh
1.2 运行完以上脚本后得到两个数据集: mnist_train_lmdb,
mnist_test_lmdb
使用LeNet模型定义分类,但在我们的分类应用中,最初LeNet中的神经元由s型激活被替换成
&校正线性单元(ReLU)激活,一般说来LeNet包含convolutional
layer,后面是pooling
& &layer,另一个convolutional
layer,紧跟pooling layer,然后将类似与卷及多层感知器
& &的两个层连接,上述层被定义在
/examples/mnist/lenet_train_test.prototxt
3. 定义MNIST Network
&在/src/caffe/proto/caffe.proto中可以了解Caffe
protobuf的定义,通常我们写一个
&caffe::NetParameter(或者Python,
caffe.proto.caffe_pb2.NetParameter),我们
&定义该network名称 name: "LeNet"
写Data Layer
&目前我们从之前创立的lmdb中读取MNIST
data,该数据层定义为
name: "mnist"
type: DATA
data_param {
"mnist_train_lmdb"
batch_size:
&top: "data"
&top: "label"
该layer名称为mnist,
类型为data, 从给定的lmdb读取数据。bactch size 为64
scale输入像素使得它们在[0,1)之间变化,0.
= 1 / 256, 最后该层产生
两个blobs,一个是data
blob, 另一个是label blob
写Convolution Layer
& 定义地一层convolution layer:
name: "conv1"
tyoe: CONVOLUTION
blobs_lr: 1.
blobs_lr: 2.
convolution_param {
num_output:
kernelsize:
weight_filler
"xavier" & &
bias_filler
"constant"
&bottom: "data"
&top: "conv1"
该层接收data
blob(由data layer提供),产生conv1 layer, 其产生 20
channels的
convolutional kernel size为 5, 以 stride 为 1 产生结果。
fillers允许我们随机初始化weights和bias值,对于weight
filler,我们使用 xavier
算法基于输入输出神经元数目来决定初始scale.
对于bias filler,我们仅仅初始化其为常数,
filling 值为 0.
blobs_lr是
learning rate. 在该情况下, 我们会设置weight learning rate 和
期间给定的 learning rate相同, bias learning rate 通常比 weight
& & & rate 大2倍,
这会导致较好的 convergence rates.
写Pooling Layer
& Pooling Layers通常比较容易去定义
name: "pool1"
type: POOLING
pooling_param {
kernel_size:
bottom: "conv1"
top: "pool1"
该层定义表明我们以kernel
size为2, stride 为2(因此在neighboring poolings regions
之间没有c重叠)来执行max
类似地,你还可以定义第二个covolution和pooling
layers, 具体可参考
/examples/mnist/lenet_train_test.prototxt
写Fully connected Layer
& Fully connected Layer也很简单:
name: "ip1"
type: INNER_PRODUCT
blobs_lr: 1.
blobs_lr: 2.
inner_product_param {
num_output:
weight_filler
bias_filler
"constant"
bottom: "pool2"
top: "ip1"
该层定义了Fully
connected layer(因为一些原因,Caffe称该层为一种innerproduct
具有500个输出
写ReLU Layer
Layer也很简单:
name: "relu1"
type: RELU
bottom: "ip1"
top: "ip1"
由于ReLU是一种element-wise操作,
我们可以做in-place去节约内存。仅仅给bottom和top blobs
相同的名字就能实现该目标,当然,我们不给其他layer
Types使用duplicated blob名字。
layer之后,我们可以写另一个innerproduct layer:
name: "ip2"
type: INNER_PRODUCT
blobs_lr: 1.
blobs_lr: 2.
inner_product_param {
num_output:
weight_filler
bias_filler
"constant"
bottom: "ip1"
top: "ip2" &
写Loss Layer
& &最后写loss
&name: “loss”
&type: SOFTMAX_LOSS
&bottom: "ip2"
&bottom: "label"
softmax_loss
layer结合softmax和multinomial logistic
loss(节省时间和提高稳定性)
该层接收2个blobs,第一个预测,第二个由data
layer提供的label. 第二个不会产生任何outputs
它所做的是计算loss
function 的值, 当 backpropagation 开始的时候,report 该值,
并表明梯度为ip2
写Layer Rules
definition可以包括是否以及何时在network definition中的rules
//...layer definition...
include: { phase: TRAIN }
这是一个规则,基于当前network's
state来控制network中的layer inclusion. 详细可参考
/src/caffe/proto/caffe.proto
在以上的例子中,该layer包含在TRAIN阶段,如果我们将TRAIN改为TEST,那么该layer就会被应用于
阶段。lenet_train_test.prototxt有两个DATA
layers(定义为不同的batch_size)
一个是training
phase另一个是testing phase.并且,在TEST phase有一个ACCURACY
次iteration就会报告model accuracy,
定义于lenet_solver.protxt.
定义MNIST Solver
检查在prototxt中每行的注释解释:
/examples/mnist/lenet_solver.prototxt:
训练和测试模型
在已经写了network definition protobut和 solver protobuf
files之后,cd到caffe根目录
&&仅仅执行:./examples/mnist/train_lenet.sh
运行代码初始化时,出现的信息包括每一层的详细信息,其连接和输出形状,该信息有助于debugging.
初始化之后,开始training,基于solver
setting,根据设置,每100次iterations将会打印出training
function,每1000次iterations将会测试network,出现的信息中,对于每一次training
lr是iteration的learning
rate, loss是training function,对于testing phase的输出,
0 是精确度, scorce 1是 testing loss function.
经过几分钟后,Optimization Done信息出现表明训练完成,最终的model,以二进制protobuf
lenet_iter_10000, 接下来你可以将此训练模型用于实际的数据集。
GPU和CPU training 转换
lenet_solver.prototxt中
改成solver_mode:CPU,则实现从GPU向CPU的转换训练,对于
小数据集,CPU和GPU速度相差不大,当在大数据集上运行时,这种差距就会很显著。
总结lenet_solver.prototxt中的各参数含义
iteration:
数据进行一次前向-后向的训练
batchsize:
每次迭代训练图片的数量
1个epoch就是将所有的训练图像全部通过网络训练一次
例如:例子中1280000张图片,batchsize=256,则1个epoch需要=5000次iteration
它的max-iteration=450000,则共有0=90个epoch,而lr什么时候衰减与stepsize
有关,减少多少与gamma有关,即:若stepsize=500,
base-lr=0.01, gamma=0.1,则当迭代到
第一个500次时,lr第一次衰减,衰减后的lr=lr*gamma=0.01*0.1=0.001,以后重复该过程,所以
stepsize是lr的衰减步长,gamma是lr的衰减系数。在训练过程中,每到一定的迭代次数都会test
这里的迭代次数是由test-interval决定的,如test=1000,则每迭代1000次测试一遍网络,而
test-size,
test-iter, 和test图片的数量决定了怎样test,
test-size决定了test时每次
迭代输入图片的数量,test-iter就是test所有的图片的迭代次数,如:500张test图片,test-iter=100
则test-size=5,
而solver文档里只需要根据test图片总数量来设置test-iter,以及根据需要
设置test-interval即可。
测试数据集
有三种接口可以进行测试数据,命令行、Python、MATLAB,本例中采用命令行进行测试,在
&/examples/mnist路径下,执行:
./test_lenent.sh
test_lenent.sh脚本是自己根据train_lenet.sh脚本对照改写的,具体脚本内容
&可参考Caffe官网tutorial/interfaces中TEST的讲解
&当所有数据都训练好之后,接下来就是如何将模型应用到实际数据了:
./build/tools/caffe.bin test
-model=examples/mnist/lenet_train_test.prototxt
-weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0
如果没有GPU则使用
./build/tools/caffe.bin test
-model=examples/mnist/lenet_train_test.prototxt
-weights=examples/mnist/lenet_iter_10000.caffemodel
test:表示对训练好的模型进行Testing,而不是training。其他参数包括train, time,
device_query。
-model=XXX:指定模型prototxt文件,这是一个文本文件,详细描述了网络结构和数据集信息。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Caffe学习系列(四)之--训练自己的模型-爱编程
Caffe学习系列(四)之--训练自己的模型
& & 本文章记录了我将自己的数据集处理并训练的流程,帮助一些刚入门的学习者,也记录自己的成长,万事起于忽微,量变引起质变。
&   1)准备数据集
   &2)数据转换为lmdb格式
   &3)计算均值并保存(非必需)
&   4)创建模型并编写配置文件
&   5)训练和测试
(一)准备数据集
在深度学习中,数据集准备往往是最难的事情,因为数据涉及隐私、商业等各方面,获取难度很大,不过有很多科研机构公布了供学习使用的数据集,我们可以在网上下载。还有一种获取的途径是论文,查阅国内外相关的论文,看他们是如何获取到数据集的,我们也可以使用他 们所采用的数据集。
我要训练的模型是人脸识别,训练的数据集是在网上下载的,经过整理,在我的网盘可以下载:
(二)数据转换为lmdb格式
& & 生成lmdb格式的文件通过脚本来实现,这就需要我们自己编写脚本文件,这里遇到了一些坑,首先使用vim创建脚本文件create1.sh
#!/usr/bin/env sh
MY=newfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: #0
find $DATA/train/$i -name *.pgm|cut -d '/' -f2-<span style="color: # | sed "s/$/ $i/"&&$MY/train.txt
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: # <span style="color: #0
find $DATA/test/$i -name *.pgm|cut -d '/' -f2-<span style="color: # | sed "s/$/ $i/"&&$MY/test.txt
echo "All done"
这个脚本文件中,用到了rm,find, cut, sed,cat等linux命令。
rm: 删除文件
find: 寻找文件
cut: 截取路径
sed: 在每行的最后面加上标注。本例中将找到的*cat.jpg文件加入标注为1,找到的*bike.jpg文件加入标注为2
cat: 将两个类别合并在一个文件里。
执行这个脚本:
sh data/face/create1.sh
& &成功的话就会在newfile文件夹里生成train.txt和test.txt文件,比如
f2-4的含义是选取以“/”而分隔开的第2至第4部分
接着再编写一个脚本文件,调用convert_imageset命令来转换数据格式。
vim lmdb.sh
#!/usr/bin/env sh
MY=data/face/newfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=<span style="color: #6 \
--resize_width=<span style="color: #6 \
/home/zyf/ygh/project/caffe/data/face/AR1/ $MY/train.txt $MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=<span style="color: #6 \
--resize_height=<span style="color: #6 \
/home/zyf/ygh/project/caffe/data/face/AR1/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
我统一转换成256*256大小。
sh lmdb.sh
运行成功后,会在 newfile下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。
(三)计算均值并保存(非必需)
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的文件compute_image_mean.cpp,我们直接使用就可以了
build/tools/compute_image_mean data/face/newfile/img_train_lmdb data/face/newfile/mean.binaryproto
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。运行成功后,会在 newfile/ 下面生成一个mean.binaryproto的均值文件。
(四)创建模型并编写配置文件
模型里面的数据
data_param {
source: "data/face/newfile/img_train_lmdb"
backend:LMDB
batch_size: <span style="color: #8
transform_param {
mean_file: "data/face/newfile/mean.binaryproto"
mirror: true
这其中的source和mean_file的路径要改成前面你自己生成的文件目录,其余的不需要修改,我这里采用的是网上训练精度不错的一个网络,具体下载可以转到百度云:
&其中的train_val.prototxt是训练网络
然后修改其中的solver.prototxt
net: "data/face/train_val.prototxt"
test_iter: <span style="color: #
test_interval: <span style="color: #0
base_lr: <span style="color: #.001
lr_policy: "step"
gamma: <span style="color: #.95
<span style="color: #0
momentum: <span style="color: #.9
weight_decay: <span style="color: #.0005
display: <span style="color: #0
<span style="color: #00
<span style="color: #00
snapshot_prefix: "data/face"
solver_mode: GPU
device_id:<span style="color: #
#debug_info: true
其中test_iter: 10,test_interval: 100,一千张图片每次测试100张,10次就都可以覆盖了。。在训练过程中,调整学习率,逐步变小。
(五)训练和测试
&如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。
build/tools/caffe train -solver data/face/solver.prototxt
直接训练即可,可以实时在命令行下查看其精度与loss。
待续。。。
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & by &still
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。

我要回帖

更多关于 串口显示乱码 的文章

 

随机推荐