转自网站:

http://blog.csdn.net/muyiyushan/article/details/70578077

1.准备数据

使用dog/cat数据集,在训练项目根目录下分别建立train和val文件夹,作为训练数据和验证数据的保存位置。train和val文件夹下各有两个文件夹:dogs和cats,分别保存dog和cat的图片。dog和cat分别有1000张训练图像和400张测试图像。

写一个python脚本文件,遍历train和val两个文件夹,分别生成train.txt和val.txt,其中保存图片的相对路径和标签。类似下面格式,但是最好要将cat和dog的路径顺序打乱,不要一开始全cat,之后全是dog。


/cats/cat.0.jpg 0
/cats/cat.1.jpg 0
/cats/cat.10.jpg 0
/cats/cat.100.jpg 0
/cats/cat.101.jpg 0
/cats/cat.102.jpg 0
/cats/cat.103.jpg 0
/cats/cat.104.jpg 0

  

 

2.数据预处理

2.1转换数据格式

使用convert_imageset.exe将原始图像转换成caffe直接读取的格式:lmdb或leveldb。默认是lmdb,如果要生成leveldb,要添加–backend=leveldb参数。建立convert_image.bat文件,里面命令如下。


SET GLOG_logtostderr=1
E:\Code\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe --resize_width=256 --resize_height=256 E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train.txt E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\trainldb
E:\Code\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe --resize_width=256 --resize_height=256 E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\val\ E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\val.txt E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\valldb
pause

参数说明: 
1. E:\Code\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe是执行程序路径。 
2. –resize_width=256 –resize_height=256重新指定生成图像大小。 
3. E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train是训练图像存储位置。 
4. E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train.txt训练图像的索引文件。 
5. E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\trainldb生成的lmdb格式文件路径。

测试图像同上。

注意:3的路径和4中train.txt里指定路径连接在一块是图像的绝对路径,否则找不到图片) 
执行convert_image.bat文件,即可生成lmdb文件,分别保存在指定路径中。

2.3计算图像均值

建立compute_mean.bat并执行,内容如下


E:\Code\Caffe\caffe-master\caffe-master\Build\x64\Release\compute_image_mean.exe E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\trainldb E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train_mean.binaryproto

参数说明 
1. E:\Code\Caffe\caffe-master\caffe-master\Build\x64\Release\compute_image_mean.exe是计算均值的执行文件。 
2. E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\trainldb上一步生成的了 lmdb文件路径。 
3. E:\Code\Caffe\caffe-master\caffe-master\data\dogCat\train_mean.binaryproto生成的均值文件,后缀是.binaryproto。

3.修改配置文件

在项目根目录新建train_val文件夹,将.\caffe-master\models\bvlc_reference_caffenet中的配置文件复制到train_val中。包括train_val.prototxt和solver.prototxt。

train_val.prototxt中修改mean_file路径(训练和测试时用同样的mean file)和data_source的路径,设置相应的batch_size。将最后一层fc8的num_output设置为相应的输出类别数目,也就是2。

solver.prototxt中设置如下。

net: "E:/Code/Caffe/caffe-master/caffe-master/data/dogCat/train_val/train_val.prototxt"
test_iter: 16
test_interval: 50
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 2000
display: 20
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 500
snapshot_prefix: "E:/Code/Caffe/caffe-master/caffe-master/data/dogCat/caffenet_finetune"
solver_mode: CPU

  

net参数为刚才设置好的train_val.prototxt。 
test_iter为测试时使用的batch个数,test_iter*testbatch_size=test images number。 
test_interval: 测试的迭代间隔次数。 
max_iter:迭代次数。 

4.开始训练

建立caffe.bat训练模型。并保存log文件。

5.可视化训练过程

使用log文件可视化accuracy和loss等参数。

6.微调

1-5完成了从头训练一个模型,我们也可以从头训练一个模型。但是这样花费时间很多,而且如果训练数据不够多,训练精度也不高。基于迁移学习的思想,可以用自己的数据finetune用imagenet预训练过的模型,这样减少训练时间,效果也更好。实际上就是参数初始化方法不同。

下载预训练模型。

相应修改train_val.prototxt和solver.prototxt。train_val.prototxt中配置好数据文件路径,将最后一层的名称改掉,设置相应num_output,增大weights和bias的lr_mult(从头训练,要加快速度)。

solver.prototxt中减少初始学习率。

开始训练。

caffe 图片数据的转换成lmdb和数据集均值(转)的更多相关文章

  1. 获取minist数据并转换成lmdb

    caffe本身是没有数据集的,但在data目录下有获取数据的一些脚本.MNIST,一个经典的手写数字库,包含60000个训练样本和10000个测试样本,每个样本为28*28大小的黑白图片,手写数字为0 ...

  2. 7.caffe:create_lmdb.sh(数据预处理转换成lmdb格式)

    个人实践代码如下: #!/usr/bin/env sh # Create the imagenet lmdb inputs # N.B. set the path to the imagenet tr ...

  3. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

  4. 【caffe-windows】 caffe-master 之图片转换成lmdb or leveldb

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

  5. base64格式的图片数据如何转成图片

    base64格式的图片数据如何转成图片 一.总结 一句话总结:不仅要去掉前面的格式串,还需要base64_decode()解码才行. // $base_img是获取到前端传递的值 $base_img ...

  6. java中,字符串类型的时间数据怎样转换成date类型。

    将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...

  7. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  8. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  9. python - django 将图片路径地址转换成 InMemoryUploadedFile 并存储数据库

    # 问题场景:对接第三方时遇到一个图片存储问题,对方给的是他们服务器的图片路径地址,但是 我这里存储图片用的是 ImageField  字段属性,也设置了存储路径,现在一旦将图片显示到前端就会将设置的 ...

随机推荐

  1. 使用绘图API自定义组件

    -----------------siwuxie095                                 工程名:CustomizeSwing 包名:com.siwuxie095.swi ...

  2. go get

    go get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包.注意,go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中,并安装. 如果在 g ...

  3. Arduino 002 --- 在Ubuntu(Linux) 中搭建Arduino开发环境

    在Ubuntu/Linux 中搭建Arduino开发环境 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 需要安装的Arduino的版本:Arduino 1.6.11(最新版本) ...

  4. Luogu 4137 Rmq Problem / mex

    一个主席树题. 一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了. 但是这样是错的,因为一个权值会出现很多次……然后就错了. 所以我们考 ...

  5. ZOJ 2301 Color the Ball (离散化+线段树)

    题意:有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内 的-所有球涂成 ci 表示的颜色(黑 or 白) ...

  6. oracle-dmp文件导入导出过程命令

    创建表空间 create tablespace coss datafile 'D:\soft\db\oracle\oradata\orcl\coss.dbf' size 1000m autoexten ...

  7. zen coding

    zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器. zen-Coding插件支持多种编辑器 ...

  8. python 全局搜索路径

    在~/.bachrc中添加 export PYTHONPATH=$PATHONPATH:[需要添加的路径]

  9. Unity中Awake的执行时间点

    https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html 根据官方文档,Awake的实际执行点,应该是对应mono脚本所在物体 ...

  10. 使用metasploit进行栈溢出攻击-3

    有了shellcode,就可以进行攻击了,但是要有漏洞才行,真实世界中的漏洞很复杂,并且很难发现,因此我专门做一个漏洞来进行攻击. 具体来说就是做一个简单的tcp server,里面包含明显的栈溢出漏 ...