您的位置:首页 > Web前端

[caffe学习笔记]用自己的数据进行训练和测试

2017-11-17 12:09 627 查看
我今天尝试制作一个自己的训练数据集,参考薛开宇的学习方式,模仿搭建自己的数据库。 

1.因为我的电脑里有整个ImageNet_ILSVRC2012的数据集,所以从训练集ILSVRC2012_img_train中随便选了两种:bird和fowl
2.生成标签文件列表,即生成 train.txt 和val.txt 文件 
3.将生成的 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件


1 数据准备

首先在caffe/data下新建文件夹myself,用于存放数据文件和后面的caffe模型相关文件。 然后在myself文件夹下建立build_lmdb和datatest两个文件夹,其中build_lmdb文件夹用于存放生成的lmdb文件,datatest文件夹存放原始图片数据。



在datatest下新建2个文件夹,train和val,其中train文件夹中存放待训练的图片,val文件夹中存放待测试的图片。



在train文件夹下,又新建两个文件夹,分别存放不同动物,bird和fowl,作为训练集



其中,bird文件夹中,一共有1000张图片,作为训练集,fowl文件夹中,一共有260张图片,作为训练集。





上图的文件名是我重命名之后的样子,重命名文件代码如下:

import os;
def rename():
count=0;
name="dog";
path='/home/jack/caffe/data/myself/train/dog';
filelist=os.listdir(path)
for files in filelist:
olddir=os.path.join(path,files);
if os.path.isdir(olddir):
continue;
filename=os.path.splitext(files)[0];
filetype=os.path.splitext(files)[1];
newdir=os.path.join(path,name+str(count)+filetype);
os.rename(olddir, newdir);
count+=1;
rename();


然后在终端运行:

cd caffe
python data/myself/datatest/train/name.py

同样的,val文件夹中也新建两个文件夹,分别存放不同动物,bird和fowl,作为测试集,其中,bird一共300张,fowl一共73张。
现在原始数据就已经准备好了。


2 生成train.txt 、val.txt

生成标签文件train.txt和val.txt需要两个.sh指令文件,代码如下,放在data/myself/datatest目录下:



下面是生成train.txt标签文件的.sh文件指令,文件名称为creatlist_train.sh

其中DATA是train数据bird的目录,DATA1是train数据fowl的目录,DATASAVE是保存标签文件train.txt的路径
-name bird*.jpg的意思指以bird开头的图片名字
cut -d ‘/’ -f8-10是截取图片的路径,调整-f后面的数字可设置几级路径
sed “s/$/ 1/”是在其后面加上 1(空格和1)
然后cat的命令是将train1.txt文件中的内容保存到train.txt中
rm命令是删除上面生成的train1.txt
经过上面步骤,bird和fowl的标签文件就都放到了train.txt 中。
然后在终端运行:
cd caffe
sh ./data/myself/datatest/creatlist_train.sh


# /usr/bin/env sh
DATA=/home/zender/caffe/data/myself/datatest/train/bird/
DATA1=/home/zender/caffe/data/myself/datatest/train/fowl/
DATASAVE=/home/zender/caffe/data/myself/datatest/
echo "Create train.txt..."

find $DATA -name bird*.JPEG | cut -d '/' -f8-10 | sed "s/$/ 1/">>$DATASAVE/train.txt
find $DATA1 -name fowl*.JPEG | cut -d '/' -f8-10 | sed "s/$/ 2/">>$DATASAVE/train1.txt

cat $DATASAVE/train1.txt>>$DATASAVE/train.txt

rm -rf $DATASAVE/train1.txt

echo "Done.."


以此就可以生成train.txt文件了,见下图



下面是生val.txt标签文件的.sh文件指令代码,文件名称为creatlist_val.sh

# /usr/bin/env sh
DATA=/home/zender/caffe/data/myself/datatest/val/bird/
DATA1=/home/zender/caffe/data/myself/datatest/val/fowl/
DATASAVE=/home/zender/caffe/data/myself/datatest/
echo "Create val.txt..."

find $DATA -name bird*.JPEG | cut -d '/' -f8-10 | sed "s/$/ 1/">>$DATASAVE/val.txt
find $DATA1 -name fowl*.JPEG | cut -d '/' -f8-10 | sed "s/$/ 2/">>$DATASAVE/val1.txt

cat $DATASAVE/val1.txt>>$DATASAVE/val.txt

rm -rf $DATASAVE/val1.txt

echo "Done.."


以此就可以生成val.txt文件了,见下图



至此我们就已经完成了制作自己的数据集以及生成train.txt和val.txt


3 生成LMDB文件

在caffe root/examples/imagenet中有个create_imagenet.sh文件,我们将其复制到我们的build_lmdb文件夹下重命名为create_mynet.sh,然后对其中需要修改的地方进行修改:

其中EXAMPLE=examples/imagenet改为自己文件的路径,EXAMPLE=/home/zender/caffe/data/myself/build_lmdb,用来保存生成的lmdb文件
DATA=data/ilsvrc12,改为自己的原始图片路径:DATA=/home/zender/caffe/data/myself/datatest
TRAIN_DATA_ROOT和VAL_DATA_ROOT指的是训练集和测试集的路径,修改为:TRAIN_DATA_ROOT=/home/zender/caffe/data/myself/datatest/             VAL_DATA_ROOT=/home/zender/caffe/data/myself/datatest/这里因为train.txt文件和val.txt文件的路径是从datatest开始的
TOOLS保持不变
resize是调整其大小为256*256以适应net的输入,因为我的数据集bird和fowl大小是不一样的,所以需要resize
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e

EXAMPLE=/home/zender/caffe/data/myself/build_lmdb
DATA=/home/zender/caffe/data/myself/datatest
TOOLS=build/tools

TRAIN_DATA_ROOT=/home/zender/caffe/data/myself/datatest/
VAL_DATA_ROOT=/home/zender/caffe/data/myself/datatest/

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi

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."
exit 1
fi

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."
exit 1
fi

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb

echo "Done."


然后在终端里面执行

cd caffe
./data/myself/build_lmdb/create_mynet.sh


注意:如果不在caffe的根目录下执行,会报错,所以需要先cd caffe

即可得到lmdb文件



4 计算图像均值文件

减去图像均值会获得更好的效果,所以我们使用tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。

我们同样复制/examples/imagenet的 make_imagenet_mean.sh文件到data/myself/build_lmdb中,将其改名为creat_mymean.sh,加以修改路径。

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12

EXAMPLE=/home/zender/caffe/data/myself/build_lmdb
DATA=/home/zender/caffe/data/myself/datatest
TOOLS=build/tools

$TOOLS/compute_image_mean $EXAMPLE/train_lmdb \
$EXAMPLE/mymean.binaryproto

echo "Done."


其中,DATA用于保存生成的 mymean.binaryproto文件

然后在终端里面执行

cd caffe
./data/myself/build_lmdb/creat_mymean.sh




5 网络的定义

这个文件是caffenet的模型配置文件,里面有输入层、卷积层、池化层和全连层的定义,在这里我们只需要对输入层中的两个位置进行修改。把caffe/models/bvlc_reference_caffenet中所有文件复制到caffe/data/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:

name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "data/myself/build_lmdb/mymean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
#  transform_param {
#    crop_size: 227
#    mean_value: 104
#    mean_value: 117
#    mean_value: 123
#    mirror: true
#  }
data_param {
source: "data/myself/build_lmdb/train_lmdb"
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "data/myself/build_lmdb/mymean.binaryproto"
}
# mean pixel / channel-wise mean instead of mean image
#  transform_param {
#    crop_size: 227
#    mean_value: 104
#    mean_value: 117
#    mean_value: 123
#    mirror: false
#  }
data_param {
source: "data/myself/build_lmdb/val_lmdb"
batch_size: 50
backend: LMDB
}
}


再看下solver.prototxt文件,其中:

1. net的路径需要修改为自己的

2. snapshot_prefix的路径是生成的模型放在哪里

3. solver_mode: CPU 选择CPU模式

4. 其余的就根据自己的需要调整参数

net: "data/myself/train_val.prototxt"
test_iter: 10
test_interval: 100
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 400
momentum: 0.9
weight_decay: 0.0005
snapshot: 200
snapshot_prefix: "data/myself/"
solver_mode: CPU

使用下面的train_mynet.sh文件来训练caffenet模型,将其中的 –solver后面改成自己的路径

#!/usr/bin/env sh

./build/tools/caffe train --solver=data/myself/solver.prototxt


6.进行训练

在Linux终端下输入下面的代码进行训练

cd caffe
./data/myself/train_mynet.sh


由于我选择使用CPU进行训练,所以电脑特别卡,没有训练完就停止了



7 恢复数据
把caffe-master/examples/imagenet中的resume_training.sh复制到data/myself/build_lmdb文件夹下,修改文件内容(倒数第二行,不是很确定):

 

#!/usr/bin/env sh
set -e

./build/tools/caffe train \
--solver=data/myself/solver.prototxt \
--snapshot=models/bvlc_reference_caffenet/myself_iter_2.caffemodel \
$@


我们用指令./resume_training.sh即可。

8.出现的问题

1.caffe训练遇到./build/tools/caffe: not found 错误解决方法

这是因为当前目录在/caffe/data/myself/build_lmdb,而执行./create_mynet.sh ,需要在caffe目录下,因此我们需要切换到caffe目录下,然后执行

./data/myself/build_lmdb/create_mynet.sh

参考:

1.http://blog.csdn.net/fly_egg/article/details/53672592

2.http://blog.csdn.net/fly_egg/article/details/53670047

3.http://blog.csdn.net/u010194274/article/details/50575284

4.http://blog.csdn.net/thystar/article/details/51167334

5.http://blog.csdn.net/zhongshaoyy/article/details/53502373

6.http://blog.csdn.net/qqlu_did/article/details/47131549
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐