Caffe初试(三)使用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: //【第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: //【第6块修改的地方】由于我们的测试样本只有150张,所以我们一次读入50张图片就好
backend: LEVELDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult:
}
param {
lr_mult:
} 中间的省略......
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult:
}
param {
lr_mult:
}
inner_product_param {
num_output: //【第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】每迭代50次, 进行一次测试
test_interval:
//【4】权值学习率,其实就是在反向传播阶段,权值每次的调整量的程度
base_lr: 0.001
momentum: 0.9
weight_decay: 0.004
//【5】在整个过程中,我们使用固定的学习率,也可尝试使用可变学习率
lr_policy: "fixed"
//【6】因为想观察每一次训练的变化,所以设置迭代一次显示一次内容
display:
//【7】将最大迭代次数设为4000
max_iter:
//【8】每迭代1000次输出一次结果
snapshot:
//【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部分除了这两个数字,未出现其它数字,所以我估摸着必有蹊跷,但还不知道问题出在哪,待日后再弄明白!
以上。
Caffe初试(三)使用caffe的cifar10网络模型训练自己的图片数据的更多相关文章
- python+caffe训练自己的图片数据流程
1. 准备自己的图片数据 选用部分的Caltech数据库作为训练和测试样本.Caltech是加州理工学院的图像数据库,包含Caltech101和Caltech256两个数据集.该数据集是由Fei-Fe ...
- 【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写
深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成.Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型.它将所有的信息数据定义为blob ...
- Caffe学习系列——工具篇:神经网络模型结构可视化
Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...
- caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题
之前已经配置过一次caffe环境了: Caffe初试(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe环境 但其中也提到,编译时,用到了cuda6.5,但 ...
- Caffe初试(二)windows下的cafee训练和测试mnist数据集
一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...
- 【撸码caffe 三】 caffe.cpp
caffe.cpp文件完成对网络模型以及模型配置参数的读入和提取,提供了网络模型训练的入口函数train和对模型的测试入口函数test.文件中使用了很多gflags和glog指令,gflags是goo ...
- Caffe初试
1.基本概念 Caffe是一个比较流行的神经网络框架,它支持C++.Python等语言,容易上手,但是代码貌似不怎么好读,等有空我...;) 2.Windows10下的部署 我把我Windows下的编 ...
- CAFFE(三):Ubuntu下Caffe框架安装(仅仅Caffe框架安装)
步骤一. 从github上下载(克隆)安装包 1.1 在你要安装的路径下 clone 此处我直接安装到home目录,执行: ~$ cd ~ 2 :~$ git clone https://github ...
- caffe训练自己的图片进行分类预测--windows平台
caffe训练自己的图片进行分类预测 标签: caffe预测 2017-03-08 21:17 273人阅读 评论(0) 收藏 举报 分类: caffe之旅(4) 版权声明:本文为博主原创文章,未 ...
随机推荐
- MapReduce实现手机上网日志分析(排序)
一.背景 1.1 流程 实现排序,分组拍上一篇通过Partitioner实现了. 实现接口,自动产生接口方法,写属性,产生getter和setter,序列化和反序列化属性,写比较方法,重写toStri ...
- NOIP2016呵呵记
经过了一年的想象和臆测,经历了学长们的几次考试,通过老师的言语莫名感受过了所谓oi式压力之后,自己的考试也终于到来了. 考前的生活也没有想象中的那么充实,无非跟着神犇刷刷题,讨论算法,学点新技巧,然后 ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- 新手指南: Linux 新手应该知道的 26 个命令
当你进入了 Linux 的世界,在下载.安装 了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软件之后,应该去了解下 Linux 真正的魅力所在:命令行.每一个 Linu ...
- CSS-border属性制作小三角
1--三角向上下左上.右上.右下.左下这四个方向突出的样式 向左上角突出: border-color: transparent transparent transparent #FFCC00; bor ...
- Java编程中的美好
java程序员如何写出"优美"代码,动力节点告诉你怎么办: 1.注释尽可能全面 对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说 ...
- python程序一直在后台运行的解决办法
刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...
- 转:C#中TransactionScope的使用方法和原理
在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Con ...
- 【转载】使用Pandas对数据进行筛选和排序
使用Pandas对数据进行筛选和排序 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas对数据进行筛选和排序 目录: sort() 对单列数据进行排序 对多列数据进行排序 获取金额最小前10项 ...
- WindowsPhone8.1RT建立空白应用挂起没反应的解决方案
wp8.1下, 建立空白应用后遇到的问题:想要实现保存.提取数据都无法成功 在退出程序后无法进入到OnNavigatedFrom()中去. 网上说要手动的Invoke OnSuspending事件. ...