使用caffe的cifar10网络模型训练自己的图片数据

由于我涉及一个车牌识别系统的项目,计划使用深度学习库caffe对车牌字符进行识别。刚开始接触caffe,打算先将示例中的每个网络模型都拿出来用用,当然这样暴力的使用是不会有好结果的- -||| ,所以这里只是记录一下示例的网络模型使用的步骤,最终测试的准确率就暂且不论了!

一、图片数据库

来源

我使用的图像是在项目的字符分割模块中分割出来的字符图像,灰度化并归一化至32*64,字符图片样本示例如下:

建立自己的数据文件夹

在./caffe/data/目录下建立自己的数据文件夹mine,并且在mine文件夹下建立train文件夹和test文件夹(由于只是为了熟悉cifar10网络模型,为减少训练时长,所以只选取了A,B,C三个字符样本进行训练和测试)。train文件夹用于存放训练样本,test文件夹用于存放测试样本。

然后,将你处理好的训练样本图片放在./caffe/data/mine/train/这个文件夹下面,测试样本放在./caffe/data/mine/test/这个文件夹下面。

train:

test:

编写train.txt和test.txt文本

(1)--train.txt  :存放训练图片的路径名(相对于./caffe/data/mine/train/)和类别标签,一行一张图片,如下所示:

(2)--test.txt  :存放测试样本的路径名(相对于./caffe/data/mine/test/)和类别标签,一行代表一张图片,如下图所示:

二、将图片数据转换为LEVELDB格式的数据

在原caffe工程中将caffe.cpp从工程中移除,将tools文件夹中的convert_imageset.cpp添加到工程中,编译后在./caffe/bin/下生成.exe,将其改名为convert_imageset.exe。

然后,在根目录下(我的是F:\caffe\)写一个批处理bat文件,命名为converttrain2ldb.bat,旨在将训练集中的数据格式转换为leveldb格式:

运行后,在data/mine/下生成mtrainldb文件夹,文件夹的内容如下所示:

当你生成的.ldb文件的大小为0KB或很小很小,那应该就是你的bat文件出错了。

同理将测试集转换为leveldb文件:

三、计算图像的均值

在原caffe工程中将caffe.cpp从工程中移除,将tools文件夹中的compute_image_mean.cpp添加到工程中,编译后在./caffe/bin/下生成.exe,将其改名为compute_image_mean.cpp.exe。

在根目录下写一个批处理bat文件,命名为computeMean.bat,旨在计算图像的均值,生成均值文件:

运行后,在data/mine/下生成均值文件。如下所示:

四、创建网络模型,编写配置文件,编写训练脚本,验证测试集

创建网络模型

在./data/mine下建立文件夹train-val,将./examples/cifar10/文件夹下的cifar10_quick_train_test.prototxt网络模型配置文件copy至该文件夹下面,如下所示:

并且进行如下的修改:

name: "CIFAR10_quick"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {        //【第1块修改的地方】下面是均值文件所在的路径,改为你自己的均值文件所在的路径
    mean_file: "data/mine/train_mean.binaryproto"
  }
  data_param {            //【第2块修改的地方】下面改为训练样本生成的数据库所在的目录[注意:是训练样本数据库]
    source: "data/mine/mtrainldb"
    batch_size: 50    //【第3块修改的地方】由于我们的训练样本不多,所以我们一次读入50张图片就好
    backend: LEVELDB
  }
}
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {    //【第4块修改的地方】下面是均值文件所在的路径,改为你自己的均值文件所在的路径
    mean_file: "data/mine/train_mean.binaryproto"
  }
  data_param {      //【第5块修改的地方】下面改为测试样本生成的数据库所在的目录[注意:是测试样本数据库]
    source: "data/mine/mtestldb"
    batch_size: 50//【第6块修改的地方】由于我们的测试样本只有150张,所以我们一次读入50张图片就好
    backend: LEVELDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }

   中间的省略......
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 3         //【第7块修改的地方】我们现在是3分类问题,所以将第二个全连接层改为3
    weight_filler {
      type: "gaussian"
      std: 0.1
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

编写超参数配置文件

同样的,将cifar10_quick_solver.prototxt超参数配置文件copy至./data/mine/train-val下,进行下面的修改:

//【1】改为你自己的网络模型配置文件的目录
net: "data/mine/train-val/cifar10_quick_train_test.prototxt"
//【2】预测阶段迭代次数,设为3,因为batch_size设为50,这样就可以覆盖150张测试集图片
test_iter: 3
//【3】每迭代50次, 进行一次测试
test_interval: 50
//【4】权值学习率,其实就是在反向传播阶段,权值每次的调整量的程度
base_lr: 0.001
momentum: 0.9
weight_decay: 0.004
//【5】在整个过程中,我们使用固定的学习率,也可尝试使用可变学习率
lr_policy: "fixed"
//【6】因为想观察每一次训练的变化,所以设置迭代一次显示一次内容
display: 1
//【7】将最大迭代次数设为4000
max_iter: 4000
//【8】每迭代1000次输出一次结果
snapshot: 1000
//【9】输出格式
snapshot_format: HDF5
//【10】输出文件的前缀
snapshot_prefix: "data/mine/cifar10_quick"
//【11】用的是CPU
solver_mode: CPU

编写训练脚本

在根目录下新建批处理bat文件,命名为trainMine_useCifar10.bat,内容如下所示:

运行后,即调用train-val文件夹下的cifar10_quick_solver.prototxt开始训练,训练过程如下图所示:

...

训练完成后,在指定目录下生成了HDF5格式的训练模型:

验证测试集

在根目录下编写批处理bat文件,命名为testMine_useCifar10.bat:

双击运行后,开始对测试集中的数据进行测试,输出结果如下所示:

可以看到,有些测试batch的准确率为1,有些batch的准确率为0,accuracy部分除了这两个数字,未出现其它数字,所以我估摸着必有蹊跷,但还不知道问题出在哪,待日后再弄明白!

以上。

时间: 2024-08-02 09:05:36

使用caffe的cifar10网络模型训练自己的图片数据的相关文章

caffe中cifar10的full_train模型出现nan的解决办法

caffe在cifar10 的example上给出了两个模型,一个是quick模式,一个是full模式,训练full模式时会出现loss=nan的错误(当然不会报错,不过出现这个结果就是bug) 自己google了一下,在github上找到了原因跟解决方案,原来是作者把用在cuda-convnet的模型照搬过来了,在caffe上的模型应该去掉LRN层,所以解决的方法很简单:将网络结构中所有的归一化层全部去掉,并修改下一层的bottom参数,然后就不会出现loss=nan的错误了. 当然,如果自己

caffe简易上手指南(二)—— 训练我们自己的数据

训练我们自己的数据 本篇继续之前的教程,下面我们尝试使用别人定义好的网络,来训练我们自己的网络. 1.准备数据 首先很重要的一点,我们需要准备若干种不同类型的图片进行分类.这里我选择从ImageNet上下载了3个分类的图片(Cat,Dog,Fish). 图片需要分两批:训练集(train).测试集(test),一般训练集与测试集的比例大概是5:1以上,此外每个分类的图片也不能太少,我这里每个分类大概选了5000张训练图+1000张测试图. 找好图片以后,需要准备以下文件: words.txt:分

总结一下用caffe跑图片数据的研究流程

最近在用caffe玩一些数据集,这些数据集是从淘宝爬下来的图片.主要是想研究一下对女性衣服的分类. 下面是一些具体的操作流程,这里总结一下. 1 爬取数据.写爬虫从淘宝爬取自己需要的数据. 2 数据预处理.将图片从jpg,png格式转为leveldb格式.因为caffe的输入层datalayer是从leveldb读取的.这一步自己基于caffe写了个工具实现转换. 转换命令例子: ./convert_imagedata.bin /home/linger/imdata/skirt_train/ /

Caffe上用SSD训练和测试自己的数据

    学习caffe第一天,用SSD上上手. 我的根目录$caffe_root为/home/gpu/ljy/caffe 一.运行SSD示例代码 1.到https://github.com/weiliu89/caffe.git下载caffe-ssd代码,是一个caffe文件夹 2.从已经配置好的caffe目录下拷贝一个Makefile.config放到$caffe_root下 3.在$caffe_root下打开命令行终端,输入以下命令 make -j8 make py make test -j8

caffe初步实践---------使用训练好的模型完成语义分割任务

caffe刚刚安装配置结束,乘热打铁! (一)环境准备 前面我有两篇文章写到caffe的搭建,第一篇cpu only ,第二篇是在服务器上搭建的,其中第二篇因为硬件环境更佳我们的步骤稍显复杂.其实,第二篇也仅仅是caffe的初步搭建完成,还没有编译python接口,那么下面我们一起搞定吧! 首先请读者再回过头去看我的<Ubuntu16.04安装配置Caffe>( http://www.cnblogs.com/xuanxufeng/p/6150593.html  ) 在这篇博文的结尾,我们再增加

Caffe利用测试好的模型测试图片以及每层的可视化

如果我们已经训练好了一个CNN模型,怎么去利用这个模型去测试呢?以及怎么去看每一层的输出结构呢?基于python可视化可以实现,这些都集成在了caffe-master/python中 1. 准备一些必要模板 import numpy as np #导入numpy模块用作后面的数值计算 import matplotlib.pyplot as plt #导入matplotlib 主要用作画图 2. 导入caffe, 我们的工作目录是在caffe-master/examples文件下下 import

caffe如何将图片数据写成lmdb格式

本人也才开始使用caffe 配好环境跑了mnist和另外一个例子,当时就蒙了   如果是图片的例子应该怎么导入,后来看了两天终于整明白了 给大家讲述一下具体过程很简单.我用minst数据库做个实验. 首先我们要得到两个txt一个是train.txt另一个是test.txt 内容如下: 前面代表是图像所在目录下的名字  第二个数字代表标签  test.txt   train.txt 下面是matlab代码 clc; clear; load('mnist_uint8.mat') num=size(t

caffe 图片数据的转换成lmdb和数据集均值(转)

转自网站: 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

用KNN算法分类CIFAR-10图片数据

KNN分类CIFAR-10,并且做Cross Validation,CIDAR-10数据库数据如下: knn.py : 主要的试验流程 from cs231n.data_utils import load_CIFAR10 from cs231n.classifiers import KNearestNeighbor import random import numpy as np import matplotlib.pyplot as plt # set plt params plt.rcPar