关于caffe训练自己数据集测试INRIA数据集,求助大神

caffe 训练测试自己的数据集
简单记录一下自己使用caffe的过程和遇到的一些问题。下载caffe以及安装不详细叙述了, 可参照http://caffe.berkeleyvision.org/installation.html。下面准备数据
简单记录一下自己使用caffe的过程和遇到的一些问题。
下载caffe以及安装不详细叙述了, 可参照&。
下面准备数据集和训练的过程参照imagenet的过程:可参考 &
1. 将数据集分为train和validate, 分别写到train.txt和val.txt中。 格式每一行文件名+ 空格 + label (label 是从0开始, 并连续)
00001.jpg 0
00002.jpg 1
00004.jpg 1
00003.jpg 2
2. 将准备好的两个txt, 放到caffe_root/data/myfile/ & &(caffe_root是caffe的根目录, myfile自己命名)。
3. 进入caffe_root/examples/imagenet/ 目录中, 修改create_imagenet.sh
DATA=data/myfile
TRAIN_DATA_ROOT=/img_full_dir1(img_full_dir1 存放训练图片的目录)
VAL_DATA_ROOT=/img_full_dir2 (img_full_dir2 存放测试图片的目录)
在caffe_root 下执行&./examples/imagenet/create_imagenet.sh , 可以在examples/imagenet 目录下找到,&ilsvrc12_train_lmdb &ilsvrc12_val_lmdb两个目录
4. &在caffe_root 下执行&./examples/imagenet/make_imagenet_mean.sh , 结果保存在data/ilsvrc12/imagenet_mean.binaryproto
5. &修改models/bvlc_reference_caffenet 下的solver.prototxt和&train_val.prototxt, 如果不修改网络的结构, 只需修改图片的大小crop_size &imagewidth。
6.&在caffe_root 下执行&./examples/imagenet/train_caffenet.sh, 进行训练,训练好的模型放在models/bvlc_reference_caffenet
测试网络及模型
1. 在python下执行, 需要先在根目录下运行&make&all
& &make pycaffe & & make&distribute
2. 将data/ilsvrc12/imagenet_mean.binaryproto 转为numpy格式, 在caffe_root 创建一个mycode的文件夹,创建一个convertmean.py,,内容如下:
#!/usr/bin/python
import numpy as np
import sys
sys.path.append('/caffe_root/python')&span style=&white-space:pre&&
&/span&#caffe_root is your caffe root dir need change
import caffe
if len(sys.argv) != 3:
print &Usage: python convert_protomean.py proto.mean out.npy&
sys.exit()
blob = caffe.proto.caffe_pb2.BlobProto()
data = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(data)
arr = np.array( caffe.io.blobproto_to_array(blob) )
out = arr[0]
np.save( sys.argv[2] , out )
3. 执行 python&convertmean.py /caffe_root/data/ilsvrc12/imagenet_mean.binaryproto&mean.npy
4. 将一张图片放到mycode的目录下,vim testcode.py
#!/usr/bin/python
import numpy as np
caffe_root = '/caffe_root/'&span style=&white-space:pre&&
&/span&#&span style=&font-family: Arial, Helvetica, sans-&&caffe_root is your caffe root dir need change&/span&
import sys
sys.path.insert(0,caffe_root+'python')
import caffe
MODEL_FILE = caffe_root + '/models/bvlc_reference_caffenet/deploy.prototxt'&span style=&white-space:pre&&
&/span&#your net
PRETRAINED = caffe_root + '/models/bvlc_reference_caffenet/caffenet_train.caffemodel'&span style=&white-space:pre&&
&/span&#your model
IMAGE_FILE = caffe_root + 'mycode/imagename.jpg'&span style=&white-space:pre&&
&/span&#your image
if not os.path.isfile(PRETRAINED):
print(&Downloading pre-trained CaffeNet model...&)
caffe.set_mode_cpu()
#net = caffe.Classifier(MODEL_FILE, PRETRAINED,
mean=np.load(caffe_root + 'mycode/mean.npy').mean(1).mean(1),
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(256, 256))
net = caffe.Classifier(MODEL_FILE, PRETRAINED)
net.set_raw_scale('data',255)
net.set_channel_swap('data',(2,1,0))
net.set_mean('data',np.load(caffe_root + 'mycode/mean.npy'))
input_image = caffe.io.load_image(IMAGE_FILE)
prediction = net.predict([input_image])
print 'prediction shape:', prediction[0].shape
print 'predicted class:', prediction[0].argmax()
以上就是整个过程, 仅供参考。 引用了许多网上的代码。
你最喜欢的运行环境 Ubuntu14.04.4MNIST数据集是大型的手写数字数据库,60000个训练集和10000个测试集。一、下载MNIST数据集cd /home/wjx/caffe/data/mnist./get_mnist.sh二、格式转换下载的原始数据集为二进制文件,需要转化成LEVELDB或LMDB才能被Caffe识别。cd /home/wjx/caffe/examples/mnist./create_mnist.sh如果没有修改create_mnist.sh文件的话,会出现下面的情况:说明路径出现问题,要对create_mnist.sh做如下修改:更改EXAMPLE,DATA,BUILD为绝对路径&然后再次运行./create_mnist.sh,得到结果:说明已经改好了,浏览所在的目录 example/mnist,发现生成了mnist_train_lmdb/和mnist_test_lmdb两个目录,每个目录下都有两个文件:data.mdb和lock.mdb。接下来可以训练&三、训练./train_lenet.sh直接在终端输入会出现下面的情况:无法找到路径&对train_lenet.sh做如下的修改:修改路径为绝对路径再次输入命令进行训练得到如下结果:&发现问题,还是出现路径的问题,这次修改lenet_solver.prototxt文件特别注意最后一行的CPU/GPU模式# The train/test net protocol buffer definitionnet: &/home/neutech/caffe/examples/mnist/lenet_train_test.prototxt& #修改为绝对路径# test_iter specifies how many forward passes the test should carry out.# In the case of MNIST, we have test batch size 100 and 100 test iterations,# covering the full 10,000 testing images.test_iter: 100# Carry out testing every 500 training iterations.test_interval: 500# The base learning rate, momentum and the weight decay of the network.base_lr: 0.01momentum: 0.9weight_decay: 0.0005# The learning rate policylr_policy: &inv&gamma: 0.0001power: 0.75# Display every 100 iterationsdisplay: 100# The maximum number of iterationsmax_iter: 10000# snapshot intermediate resultssnapshot: 5000snapshot_prefix: &/home/neutech/caffe/examples/mnist/lenet& #修改为绝对路径# solver mode: CPU or GPUsolver_mode: CPU #如果为CPU模式改成CPU,默认为GPU再次运行命令开始训练,出现下面的情况:&还是训练失败,同样的问题,找不到mnist_train_lmdb和mnist_train_lmdb文件的路径。通过查看lenet_solver.prototxt的内容net: &/home/neutech/caffe/examples/mnist/lenet_train_test.prototxt& #修改为绝对路径这一行描述的用于训练/预测的网络描述文件(ProtoBuffer文件格式),打开lenet_train_test.prototxt文件,修改:name: &LeNet&layer {name: &mnist&type: &Data&top: &data&top: &label&include {phase: TRAIN}transform_param {scale: 0.}data_param {source: &/home/neutech/caffe/examples/mnist/mnist_train_lmdb& #此处文件路径要检查清楚,修改为绝对路径batch_size: 64backend: LMDB}}layer {name: &mnist&type: &Data&top: &data&top: &label&include {phase: TEST}transform_param {scale: 0.}data_param {source: &/home/neutech/caffe/examples/mnist/mnist_test_lmdb& #此处文件路径要检查清楚,修改为绝对路径batch_size: 100backend: LMDB}}layer {name: &conv1&type: &Convolution&bottom: &data&top: &conv1&param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 20kernel_size: 5stride: 1weight_filler {type: &xavier&}bias_filler {type: &constant&}}}layer {name: &pool1&type: &Pooling&bottom: &conv1&top: &pool1&pooling_param {pool: MAXkernel_size: 2stride: 2}}layer {name: &conv2&type: &Convolution&bottom: &pool1&top: &conv2&param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: &xavier&}bias_filler {type: &constant&}}}layer {name: &pool2&type: &Pooling&bottom: &conv2&top: &pool2&pooling_param {pool: MAXkernel_size: 2stride: 2}}layer {name: &ip1&type: &InnerProduct&bottom: &pool2&top: &ip1&param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500weight_filler {type: &xavier&}bias_filler {type: &constant&}}}layer {name: &relu1&type: &ReLU&bottom: &ip1&top: &ip1&}layer {name: &ip2&type: &InnerProduct&bottom: &ip1&top: &ip2&param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10weight_filler {type: &xavier&}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&}接下来可以进行训练了。会出现下面的训练日志:OK,大功告成!就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    
4【原】初步认识电脑4404人阅读
机器学习(2)
在caffe提供的例程当中,例如mnist与cifar10中,数据集的准备均是通过调用代码自己完成的,而对于ImageNet1000类的数据库,对于高校实验室而言,常常面临电脑内存不足的尴尬境地。而对于应用者而言,用适合于自己条件的的数据集在caffe下训练及测试才是更重要的。所以我们有必要自己做数据库以及在caffe上训练及测试。
1,数据准备
在data中新建文件夹myself,我们截取了ImageNet1000类中的两类—panda与sea_horse,训练panda的图片24张,测试panda的图片6张,训练sea_horse的图片38张,测试sea_horse的图片7张。如图所示:
培训和测试的输入是用train.txt和val.txt描述的,这些文档列出所有文件和他们的标签。注意,在imagenet1000类中,我们分类的名字是ASCII码的顺序,即0-999,对应的分类名和数字的映射在synset_words.txt(自己写)中。
运行以下指令:
find -name *.jpeg |cut -d '/' -f2-3& train.txt
然后,因为自己的数据库样本数比较少,可以自行手动做分类标签。在train.txt的每个照片后用1-2分类。如图:
当样本过多,就自己编写指令批量处理。
同理,获得val.txt。matlab(windows下)批量处理代码如下:
% batch write in txt
file=dir('F:\animal\sea_horse');
temp=length(file);
file=file(3:temp);
fp=fopen('F:\animal\animal.txt','at');
% 'at' open or create file for reading and append data to end of file
% 'wt' discard existing contents
for n=1:length(file)
fprintf('iter=%d\n',n)
txt=[file(n).name ' 2' '\n'];
fprintf(fp,txt);
fclose(fp);
Test.txt不能标签,全部设置成0。
我们还需要把图片的大小变成256X256,官网上提供了下面的命令:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
但是我自己并没有成功,就只好用matlab(windows下)代码处理了一下:
for n=1:length(file)
temp=imread(['F:\animal\panda\' file(n).name]);
temp=imresize(temp,2);
temp=imresize(temp,[256 256]);
imwrite(temp,['F:\animal\panda\' file(n).name]);
然后在caffe-master/examples中新建myself文件夹,然后将caffe-maester/examples/imagenet的create_imagenet.sh复制到该文件夹下,将其名改为create_animal.sh,修改训练和测试路径的设置,运行该sh.如图:
最后得到myself_train_lmdb和myself_val_lmdb:
2 计算图像均值
模型需要我们从每张图片减去均值,所以我们必须获得训练的均值,用
tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们同样复制caffe-maester/examples/imagenet的
./make_imagenet_mean到examples/myself中,将其改名为make_animal_mean.sh,加以修改路径。
3 网络的定义
把caffe-master/models/bvlc_reference_caffenet中所有文件复制到caffe-master/examples/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:
如果你细心观察train_val.prototext,你会发现他们除了数据来源不同和最后一层不同,其他基本相同。在训练中,我们用一个softmax——loss层计算损失函数和初始化反向传播,而在验证,我们使用精度层检测我们的精度。
我们还有一个运行的协议solver.prototxt,复制过来,将第一行路径改为我们的路径net: “examples/myself/train_val.prototxt”,从里面可以观察到,我们将运行256批次,迭代4500000次(90期),每1000次迭代,我们测试学习网络验证数据,我们设置初始的学习率为0.01,每期)次迭代减少学习率,显示一次信息,训练的weight_decay为0.0005,每10000次迭代,我们显示一下当前状态。
以上是教程的,实际上,以上需要耗费很长时间,因此,我们稍微改一下
test_iter: 1000是指测试的批次,我们就10张照片,设置10就可以了。
test_interval: 1000是指每1000次迭代测试一次,我们改成500次测试一次。
base_lr: 0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001
lr_policy: “step”学习率变化
gamma: 0.1学习率变化的比率
stepsize: 0000次迭代减少学习率
display: 20每20层显示一次
max_iter: 450000最大迭代次数,
momentum: 0.9学习的参数,不用变
weight_decay: 0.0005学习的参数,不用变
snapshot: 10000每迭代10000次显示状态,这里改为2000次
solver_mode: GPU末尾加一行,代表用GPU进行
把caffe-master/examples/imagenet中的train_caffenet.sh复制过来并修改名为train_myself.sh运行,修改里面的路径,如图:
当然,只有两类,正确率还是相当的高,例如迭代到2000次的时候,正确率是0.924,即13张var样本只有1张预测错了。
5 恢复数据
把caffe-master/examples/imagenet中的resume_training.sh复制过来并运行。
我们用指令./即可。
参照材料:学习笔记3
用自己的数据训练和测试“CaffeNet”
ImageNet tutorial
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11085次
排名:千里之外
原创:15篇
(1)(1)(3)(1)(3)(1)(4)(1)&|&&|&&|&&|&&
当前位置: >
caffe 练习2 用自己的数据集在ImageNet 测试------by 香蕉麦乐迪
作者:sloanqin & 来源:转载 &
摘要: 目的:使用自己的数据集,使用caffe自带的ImageNet网络结构,训练测试参考官网链接:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html我自己准备的数据集:/s/1o60802I我们的数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20
目的:使用自己的数据集,使用caffe自带的ImageNet网络结构,训练测试
参考官网链接:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
我自己准备的数据集:/s/1o60802I
我们的数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20个test图片(val文件夹下,一共200)
1 首先准备自己的数据集
我们需要准备的文件有:
1 文件夹train:里面放训练的图片
2 文件夹val:里面放val的图片
3 train.txt :训练图片的文件名和对应的类别
4 val.txt:测试图片的文件名和对应的类别
我已经为大家准备好了,下载链接:/s/1o60802I
以后大家自己准备数据集,就按照上面的方式将 图片和txt文件,放入对应目录下
2 &创建lmdb格式数据集
在caffe安装的根目录下执行下面的脚本可以创建lmdb文件,用于caffe的数据输入;
./examples/imagenet/create_imagenet.sh
对于这个脚本,我们打开,根据自己的路径做更改;
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
EXAMPLE=examples/imagenet
%@@ 这里是一些路径,根据自己的路径修改
DATA=data/ilsvrc12
TOOLS=build/tools
TRAIN_DATA_ROOT=/path/to/imagenet/train/
VAL_DATA_ROOT=/path/to/imagenet/val/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=false
%@@ 这是设置RESIZE = true,caffe就可以帮我们修改好图片的尺寸
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
%@@ 这里会调用作者已经写好的 convert_imageset 函数
--resize_height=$RESIZE_HEIGHT \
%@@ 通过该函数可以产生lmdb的数据
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
%@@ 训练图片的路径
$DATA/train.txt \
%@@ 输入train.txt的路径
$EXAMPLE/ilsvrc12_train_lmdb %@@输出train_lmdb的路径
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
&span style="font-family: Arial, Helvetica, sans-"&%@@ 训练图片的路径&/span&
$DATA/val.txt \
%@@ 输入val.txt的路径
$EXAMPLE/ilsvrc12_val_lmdb %@@输出val_lmdb的路径
echo "Done."
ps:注意,要设置
RESIZE = true。因为imagenet这个网络结构输入图片的大小都必须是227*227的,设置RESIZE = true后,caffe就可以帮我们将图片的大小变换好;
3 计算图像均值
输入数据需要训练图片的均值图像
官方提供脚本帮助我们计算,如下:
./examples/imagenet/make_imagenet_mean.sh 计算完后得到一个文件:
data/ilsvrc12/imagenet_mean.binaryproto. 当然,跟上面一样,我们使用需要更改脚本对应的路径
脚本原文件:
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=examples/imagenet
DATA=data/ilsvrc12
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
$DATA/imagenet_mean.binaryproto
echo "Done."
根据我的路径修改后的文件:(注意,你的跟我的不一定一样)
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
ROOT=/home/a216/caffe-master
EXAMPLE=$ROOT/sloanqin/examples/godpool
DATA=$ROOT/sloanqin/data/godpool/txt
TOOLS=$ROOT/build/tools
$TOOLS/compute_image_mean $EXAMPLE/godpool_train_lmdb \
$DATA/godpool_mean.binaryproto
echo "Done."
4 配置网络结构文件
网络模型文件在 &models/bvlc_reference_caffenet/train_val.prototxt 文件中;
这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改;
注意:大家需要打开这个文件,更改里面的路径
5 训练参数文件
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中
我对solver.prototxt 修改后的参数如下:
net: "/home/a216/caffe-master/sloanqin/data/godpool/txt/train_val.prototxt"
test_iter: 4
//测试的时候,输入4个batch
test_interval: 1000 //每迭代1000次,测试一次
base_lr: 0.01
// 初始的学习率是0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 //每迭代3000次,调整一次学习率
display: 20
//每20次迭代,显示一次
max_iter: 12000 //最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "/home/a216/caffe-master/sloanqin/data/godpool/txt/caffenet_train"
solver_mode: GPUps:你要根据自己的路径做修改
知识点说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以
test_iter=4
6 &开始训练
./build/tools/caffe train --solver=/home/a216/caffe-master/sloanqin/data/godpool/txt/solver.prototxt
当然,上面的命令,需要根据你自己的路径相应的改下
训练过程中,可以看到正确率在不断提升;最后的准确率是50%;
我们的样本数很少,当图片到百万数量级的时候,效果会很大提升;
而且我提供的数据是淘宝的图片,本身的难度很大,就是人也很难分清楚;
版权所有 IT知识库 CopyRight (C)
, All Rights Reserved.}

我要回帖

更多关于 caffe imagenet数据集 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信