前言:

本文章记录了我将自己的数据集处理并训练的流程,帮助一些刚入门的学习者,也记录自己的成长,万事起于忽微,量变引起质变。

正文:

一、流程

  1)准备数据集

    2)数据转换为lmdb格式

    3)计算均值并保存(非必需)

  4)创建模型并编写配置文件

  5)训练和测试

二、实施

(一)准备数据集

在深度学习中,数据集准备往往是最难的事情,因为数据涉及隐私、商业等各方面,获取难度很大,不过有很多科研机构公布了供学习使用的数据集,我们可以在网上下载。还有一种获取的途径是论文,查阅国内外相关的论文,看他们是如何获取到数据集的,我们也可以使用他 们所采用的数据集。

我要训练的模型是人脸识别,训练的数据集是在网上下载的,经过整理,在我的网盘可以下载:http://pan.baidu.com/s/1jIxCcKI

(二)数据转换为lmdb格式

生成lmdb格式的文件通过脚本来实现,这就需要我们自己编写脚本文件,这里遇到了一些坑,首先使用vim创建脚本文件create1.sh

#!/usr/bin/env sh
DATA=AR1
MY=newfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in
do
find $DATA/train/$i -name *.pgm|cut -d '/' -f2- | sed "s/$/ $i/">>$MY/train.txt
done
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in
do
find $DATA/test/$i -name *.pgm|cut -d '/' -f2- | sed "s/$/ $i/">>$MY/test.txt
done
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= \
--resize_width= \
/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= \
--resize_height= \
/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:
} 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:
test_interval: base_lr: 0.001
lr_policy: "step"
gamma: 0.95
stepsize:
momentum: 0.9
weight_decay: 0.0005 display:
max_iter:
snapshot:
snapshot_prefix: "data/face"
solver_mode: GPU
device_id:
#debug_info: true
其中test_iter: 10,test_interval: 100,一千张图片每次测试100张,10次就都可以覆盖了。。在训练过程中,调整学习率,逐步变小。

(五)训练和测试

如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。

build/tools/caffe train -solver data/face/solver.prototxt

直接训练即可,可以实时在命令行下查看其精度与loss。

待续。。。

by  still

Caffe学习系列(四)之--训练自己的模型的更多相关文章

  1. Caffe学习系列(13):对训练好的模型进行fine-tune

    使用http://www.cnblogs.com/573177885qq/p/5804863.html中的图片进行训练和测试. 整个流程差不多,fine-tune命令: ./build/tools/c ...

  2. Caffe学习系列(12):训练和测试自己的图片--linux平台

    Caffe学习系列(12):训练和测试自己的图片   学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...

  3. Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  4. 转 Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  5. Caffe 学习系列

    学习列表: Google protocol buffer在windows下的编译 caffe windows 学习第一步:编译和安装(vs2012+win 64) caffe windows学习:第一 ...

  6. Caffe学习系列(23):如何将别人训练好的model用到自己的数据上

    caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...

  7. Caffe学习系列(3):视觉层(Vision Layers)及参数

    所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...

  8. Caffe学习系列(22):caffe图形化操作工具digits运行实例

    上接:Caffe学习系列(21):caffe图形化操作工具digits的安装与运行 经过前面的操作,我们就把数据准备好了. 一.训练一个model 右击右边Models模块的” Images" ...

  9. Caffe学习系列(21):caffe图形化操作工具digits的安装与运行

    经过前面一系列的学习,我们基本上学会了如何在linux下运行caffe程序,也学会了如何用python接口进行数据及参数的可视化. 如果还没有学会的,请自行细细阅读: caffe学习系列:http:/ ...

  10. 转 Caffe学习系列(3):视觉层(Vision Layers)及参数

    所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...

随机推荐

  1. hibernate jar包介绍

    Hibernate3.jar            这个是hibernate最主要的jar包 ant-1.63.jar      Ant 的核心包,在构建Hibernate 时会用到 antlr-2. ...

  2. UI状态控制

    if(BillBaseStatusEnum.ADD==this.editData.getBaseStatus()){ this.btnSave.setEnabled(true); this.btnSu ...

  3. Java虚拟机(JVM)

    Java虚拟机 Java字节码通过类加载器(Class Loader)为程序的执行加载所需要的全部类.在类的加载过程中,由于是按照先加载启动类库.再加载扩展类库最后加载用户自定义类库的顺序,从而避免一 ...

  4. Struts2中的配置文件的加载

    Struts2框架配置文件加载顺序(服务器启动之后, 这些配置文件会按照顺序一一加载进内存, 进行类等匹配的时候才会去内存查找):    1. default.properties    2. str ...

  5. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-skip

    koahub-skip koahub skip middleware koahub skip Conditionally skip a middleware when a condition is m ...

  6. javascript 随机显示指定内容

    今天碰到一个需求,一个页面显示赞助厂商的信息,但是厂商要求排序要随机排,因为是个静态页面不是读取数据库的,所以打算用js来控制 var arr = new Array('张三', '李四', '王五' ...

  7. wxpython分割窗研究(解决sashPosition=0无效的BUG)

    用wxpython开发一个简单的exe其实很简单的,但是在开发的过程中会遇到若干的坑.疑问.甚至bug,让人摸不清头脑!恰恰关于这方面的文档是少之又少,看来看去大家还是在官方的文档上加以引用说明,但是 ...

  8. Lambda&Java多核编程-6-方法与构造器引用

    在Lambda&Java多核编程-2-并行与组合行为一文中,我们对Stream<Contact>里的每一位联系人调用call()方法,并根据能否打通的返回结果过滤掉已经失效的项. ...

  9. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  10. oracle监听(lsnrctl)详解解读

    (总结)Oracle监听服务lsnrctl参数及查询状态详解   lsnrctl命令常用参数详解: lsnrctlstart启动指定的监听器 stop关闭指定的监听器 status显示监听器的状态.s ...