win10下使用caffe训练自己的数据,车牌二分类

来源:互联网 发布:linux实现nat网关功能 编辑:程序博客网 时间:2024/05/18 13:04

caffe编译参考:http://blog.csdn.net/cym1990/article/details/72630584

1.数据格式转换

Caffe采用leveldb或者lmdb的数据格式

第一步就是数据的格式转换了。

编译如下图所示工程,可以生成文件convert_imageset.exe


本次训练是使用的车牌数据,只分2类,有车牌,无车牌。

在caffe根目录下新建data文件夹,在data文件夹下新建plate文件夹,plate文件夹有如下文件:


train和test文件夹存放原始数据,trainldb和testldb文件夹存放格式转换后的leveldb数据,mean存放均值文件,实验数据是车牌和非车牌二分类数据。部分数据大概如下:

有车牌:



无车牌:



在train图像数据文件夹中建立train.txt文件

在命令行中,cd到train图像数据文件夹中执行下面批处理命令:

dir /b/s/p/w *.jpg > train.txt

可以实现将文件夹中的所有文件的文件名和路径提取到train.txt中

生成如图所示:



然后使用替换功能调整为以下格式,图像后面的为标签,每个类别使用同一个标签表示(多个类别必须从0开始),可以通过查找替换功能,将jpg替换为jpg 0,这样可以快速加标签。



利用convert_imageset.exe生成对应的leveldb格式数据,注意参数和路径,参数部分可以查看conver_imageset.cpp文件中的定义。

我们可以写一个convert_imageset.bat文件,来执行数据格式转换,文件内容如下:


SET GLOG_logtostderr=1D:\WorkSpace\caffe\caffe\Build\x64\Release\convert_imageset.exe --backend=leveldb --resize_width=64 --resize_height=64  D:\WorkSpace\caffe\caffe\data\plate\ D:\WorkSpace\caffe\caffe\data\plate\train\train.txt D:\WorkSpace\caffe\caffe\data\plate\train_ldb pauseD:\WorkSpace\caffe\caffe\Build\x64\Release\convert_imageset.exe --backend=leveldb --resize_width=64 --resize_height=64 D:\WorkSpace\caffe\caffe\data\plate\ D:\WorkSpace\caffe\caffe\data\plate\test\test.txt D:\WorkSpace\caffe\caffe\data\plate\test_ldb pause

可以看到我们在转换数据的时候,将所有数据大小统一调整为64*64,这样方便数据处理。

上面的命令先转换train数据格式,然后转换测试数据格式。

在命令行中的这个需要注意:

D:\WorkSpace\caffe\caffe\data\plate\   D:\WorkSpace\caffe\caffe\data\plate\train\train.txt
前面的文件夹加上后面文件train.txt中每行的内容,需要保证是一个合法的绝对路径,这个路径就是需要寻找到每个文件的路径。同理测试数据一样。


生成成功后得到以下信息:




以上命令运行成功后,在train_ldb文件夹下生成对应的文件:



其他格式的数据转换,比如binary等可以参考examples下cifar10和mnist下的样例。这部分早晚要自己写的,可以多熟悉一下。


2.数据预处理

这一步主要计算数据的均值,得到均值文件,一般来说,训练集减去均值文件后再进行训练效果会好一点,当然也可以对数据做其他处理。
编译如下图所示工程,可以得到文件compute_image_mean.exe


同样,在plate文件夹下建立批处理文件,compute_image_mean.bat,文件内容如下:
SET GLOG_logtostderr=1D:\WorkSpace\caffe\caffe\Build\x64\Release\compute_image_mean.exe --backend=leveldb D:\WorkSpace\caffe\caffe\data\plate\train_ldb D:\WorkSpace\caffe\caffe\data\plate\mean\train_mean.binaryprotopauseD:\WorkSpace\caffe\caffe\Build\x64\Release\compute_image_mean.exe --backend=leveldb D:\WorkSpace\caffe\caffe\data\plate\test_ldb D:\WorkSpace\caffe\caffe\data\plate\mean\test_mean.binaryprotopause
以上命令会在mean文件夹中生成文件train_mean.binaryproto和test_mean.binaryproto
以上2个文件分别为训练和测试时候的均值文件,如下图所示。


3.定义网络结构并训练

将路径caffe\models\bvlc_alexnet文件夹下面的train_val.prototxt和solver.prototxt文件都复制到caffe\data\plate路径下
修改train_val.prototxt文件如下:
name: "AlexNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    #crop_size: 227
    mean_file: "D://WorkSpace//caffe//caffe//data//plate//mean//train_mean.binaryproto"
  }
  data_param {
    source: "D://WorkSpace//caffe//caffe//data//plate//train_ldb"
    batch_size: 256
    backend: LEVELDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    #crop_size: 227
    mean_file: "D://WorkSpace//caffe//caffe//data//plate//mean//test_mean.binaryproto"
  }
  data_param {
    source: "D://WorkSpace//caffe//caffe//data//plate//test_ldb"
    batch_size: 50
    backend: LEVELDB
  }
}

修改solver.prototxt文件如下:
主要是修改一下路径。
net: "D://WorkSpace//caffe//caffe//data//plate//train_val.prototxt"
test_iter: 100
test_interval: 100
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 200
snapshot_prefix: "D://WorkSpace//caffe//caffe//data//plate//"
solver_mode: GPU


最后,写一个批处理文件start_train.bat来调用caffe.exe进行训练和测试,bat文件内容如下:

D:\WorkSpace\caffe\caffe\Build\x64\Release\caffe.exe train --solver=D:\WorkSpace\caffe\caffe\data\plate\solver.prototxt pause

,如果没有错误,就可以看到训练结果了,如下图所示




可能会遇到的文件:

(1)caffe训练数据时出现了Check failed: data_怎么办?

(2)路径文件,找不到数据,这个一般仔细检查文件都可以找出来,还有就是如果路径中包含有/t,也会导致路径不可用,可以在路径中使用//来代替\

(3)http://blog.csdn.net/zr459927180/article/details/51001536,参考此文章,遇到的文件有下面几个,可以参考:

        1.  caffe训练时遇到loss一直居高不下时:http://blog.sina.com.cn/s/blog_141f234870102w941.html

另外,均值一般都是训练集的均值,测试集正常是不知道,无法求出来的。


  2. 利用Caffe训练一个基于AlexNet的三分类分类器,将train_val.prototxt的全连接输出层的输出类别数目改为3,训练一直不收敛,loss很高;当把输出改成4或1000(>3)的时候,网络可以收敛。也就是caffenet结构的输出层的类别数一定要大于我训练集的类别数才可以收敛!后来查了半天才发现原因,让我泪奔。。。
原来我把图像类别的label设置成1,2,3,改成0,1,2后,最后全连接层的转出改成3就OK了。
可能出现的问题
1.网络结构方面的配置信息:prototxt要根据自己的实际情况和数据集进行修改,每个参数的实际意义要自己弄清楚,文中给出的prototx只是个示例,具体还是要自己修改,每个参数的意义网上有,可以查一下,用法可以参见caffe.prototxt(添加自己的layer时会需要在这里加参数的),还有loss不降可能是学习率设置的问题,我最近在vgg-face的模型上finetune其他人脸数据时,学习率用0.01,怎么训练都没啥结果,换成0.0001,loss就开始降了,accuracy也挺满意。
还有就是当时写bat文件时用的都是些绝对路径,自己调整好就可以了,这个看下报错信息,问题不大

参考以下文章:

1.在caffe上跑自己的数据

2.如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口

3.http://blog.csdn.net/zr459927180/article/details/51001536

4.caffe windows训练测试自己的图片http://www.jianshu.com/p/607f1e51e3ab

原创粉丝点击