[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格式文件
首先在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张图片,作为训练集。
上图的文件名是我重命名之后的样子,重命名文件代码如下:
然后在终端运行:
cd caffe
python data/myself/datatest/train/name.py
同样的,val文件夹中也新建两个文件夹,分别存放不同动物,bird和fowl,作为测试集,其中,bird一共300张,fowl一共73张。
现在原始数据就已经准备好了。
生成标签文件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 中。
然后在终端运行:
以此就可以生成train.txt文件了,见下图
下面是生val.txt标签文件的.sh文件指令代码,文件名称为creatlist_val.sh
以此就可以生成val.txt文件了,见下图
至此我们就已经完成了制作自己的数据集以及生成train.txt和val.txt
在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
然后在终端里面执行
注意:如果不在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,加以修改路径。
其中,DATA用于保存生成的 mymean.binaryproto文件
然后在终端里面执行
5 网络的定义
这个文件是caffenet的模型配置文件,里面有输入层、卷积层、池化层和全连层的定义,在这里我们只需要对输入层中的两个位置进行修改。把caffe/models/bvlc_reference_caffenet中所有文件复制到caffe/data/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:
再看下solver.prototxt文件,其中:
1. net的路径需要修改为自己的
2. snapshot_prefix的路径是生成的模型放在哪里
3. solver_mode: CPU 选择CPU模式
4. 其余的就根据自己的需要调整参数
使用下面的train_mynet.sh文件来训练caffenet模型,将其中的 –solver后面改成自己的路径
6.进行训练
在Linux终端下输入下面的代码进行训练
由于我选择使用CPU进行训练,所以电脑特别卡,没有训练完就停止了
7 恢复数据
把caffe-master/examples/imagenet中的resume_training.sh复制到data/myself/build_lmdb文件夹下,修改文件内容(倒数第二行,不是很确定):
我们用指令./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
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
相关文章推荐
- caffe学习笔记3:使用caffe对自己的图像数据进行训练和测试
- Caffe_Windows学习笔记(二)用自己的数据训练和测试CaffeNet
- 深度学习文章5:使用caffe对自己的图像数据进行训练并测试
- 【神经网络与深度学习】Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
- Tensorflow学习笔记:用minst数据集训练卷积神经网络并用训练后的模型测试自己的BMP图片
- CAFFE学习笔记(二):训练和测试自己的图片
- 深度学习Caffe实战笔记(21)Windows平台 Faster-RCNN 训练好的模型测试数据
- caffe学习笔记(五)--使用自己的数据集第一次进行训练
- 【深度学习】笔记6:使用caffe中的CIFAR10网络模型和自己的图片数据训练自己的模型(步骤详解)
- 【caffe学习笔记二】学习搭建自己的网络 MNIST 在 caffe 上进行训练与学习
- caffe学习笔记4:训练自己数据的完整流程
- 深度学习-CAFFE利用CIFAR10网络模型训练自己的图像数据获得模型-4应用生成模型进行预测
- Caffe学习笔记(六)—— Windows下训练自己的数据
- Windows Caffe 学习笔记(四)搭建自己的网络,训练和测试MNIST手写字体库
- Caffe深度学习入门—— caffenet 微调网络 训练自己的数据并测试训练的模型
- 薛开宇学习笔记一之总结笔记(CIFAR-10 在 在 caffe 上进行训练与学习)--Linux语法总结
- 【深度学习】笔记7: CNN训练Cifar-10技巧 ---如何进行实验,如何进行构建自己的网络模型,提高精度
- Caffe学习系列(12):训练和测试自己的图片
- 薛开宇学习笔记二之总结笔记--caffe imagenet训练中train_val.prototxt中数据层及其参数设置
- Caffe学习系列(12):训练和测试自己的图片