caffe学习系列2—步骤记录

1.为训练做准备工作

参考链接:http://blog.csdn.net/Losteng/article/details/50799998?ref=myread
先写上caffe训练命令,如下:

sudo /home/caffe/caffe/build/tools/caffe train -solver data/myfile/solver.prototxt

其中solver.prototxt文件会调用train_net.prototxt网络,并且train_net.prototxt中需要写数据集的路径,所以需要做以下准备工作:

1)准备caffe支持的数据格式(以lmdb格式为例:)

同上,先贴上生成lmdb格式的命令代码:

#!/usr/bin/env sh
DATA=images/train
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/caffe/caffe/images/train $DATA/train.txt  $DATA/img_train_lmdb

参数解释:

设置参数-shuffle,打乱图片顺序。
设置参数-resize_height-resize_width将所有图片尺寸都变为256*256.
/home/caffe/caffe/images/train/ 为图片保存的绝对路径。
可以根据实际情况将路径修改。
运行脚本,img_train_lmdb数据生成。

其中:convert_imageset 参数有:


由上面命令可知,还需要train.txt(文件名(亲测可以含路径)与标签清单):linux下可参考:

##(修改至符合自己需求)
#!/usr/bin/env sh
DATA=images/train
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name cat*.jpg | cut -d '/' -f4 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name dog*.jpg | cut -d '/' -f4 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."

windows下可参考:
http://blog.csdn.net/u012617944/article/details/78128218

然后按照最初的命令生成就好了!

2)计算均值文件

$TOOLS/compute_image_mean $EXAMPLE/train_lmdb \
  $DATA/imagenet_mean.binaryproto

其中:EXAMPLE=/caffe/examples/lmdb_test/train //你的train_lmdb所在路径
DATA=/caffe/examples/lmdb_test/train //生成的均值文件存放路径
TOOLS=/caffe/build/tools //caffe的tools路径

3)写训练需要的xx_train_test.prototxt和solver.prototxt文件

xx_deploy.prototxt:设置网络中间层的结构。data层仅定义4D的input_dim(分别表示batch大小,通道数,滤波器高度,滤波器宽度),最后一层没有loss层。提取特征或预测输出时使用;
xx_solver.prototxt:设置训练网络所需的网络结构文件(xx_train_test.prototxt)和超参数,训练网络时使用;
xx_train_test.prototxt:设置网络每层的结构。data层中include的phase为TRAIN或TEST区分是输入数据是训练数据还是测试数据。data层有完整的定义,最后一层为loss层,训练和测试网络时都用。
这里写图片描述

网络模型测试见我的另一篇博客笔记:
http://blog.csdn.net/u012617944/article/details/78264639

4)CSV文件转HDF5格式

(LMDB或LevelDB提供训练的标签只能是标量,无法提供向量或是矩阵形式,比如人脸关键点及多标签问题,这时往往考虑用hdf5格式)
贴上我自己的代码:以人脸关键点进行表情识别为例:我的数据102维关键点data和6种表情标签label;

def load_data():
     print "ssssssssssssss"
     dataframe = read_csv(os.path.expanduser(FTRAIN))  # load pandas dataframe
     print "enter read_csv"
     #从csv转换成pd支持的dataframe(数据表),分别提取数据和标签
     train_feature = dataframe.iloc[:, 0:102]
     train_label = dataframe.iloc[:, 102]
     print len(train_label)
     #将df(的分别数据和标签)转成numpy的array
     labels_arr = np.zeros((len(train_label),6))
     for count,label_arr in enumerate(train_label):
        labels_arr[count][label_arr] = 1
     print(labels_arr)
     data_arr = np.vstack(train_feature.values)
     data_arr = data_arr.reshape(-1,1,1,102)#对数据产生的数组reshape
    # print(data_arr)
     #new_data = {}
     #new_data['input'] = np.reshape(train_feature, (-1,1,1,102))
     #new_data['output'] = labels_arr
     #new_data['input'], new_data['output'] = shuffle(new_data['input'], new_data['output'],random_state = 0)
     data_arr, labels_arr = shuffle(data_arr, labels_arr, random_state = 0)
     return data_arr, labels_arr

def save_data_as_hdf5(hdf5_data_filename, data, label):

     f = h5py.File(hdf5_data_filename,'w')
     f['data'] = data.astype(np.float32)
     f['label'] = label.astype(np.float32)
     f.close()

def main():
  print "this is main"
  hdf5_data_filename = 'ck_train_data.hdf5'
  data, label = load_data()
  print(data)
  save_data_as_hdf5(hdf5_data_filename, data, label)

#最后这句不要忘记,不然找不到主函数
if __name__ == "__main__":
    main()

补充知识点:

dataframe操作:http://blog.csdn.net/u014607457/article/details/51290582
reshape函数(操作numpy的array)参数介绍:https://www.zhihu.com/question/52684594
numpy.zeros函数使用方法:http://blog.csdn.net/qq_26948675/article/details/54318917

参考代码:http://blog.csdn.net/u011762313/article/details/48851015
参考项目链接:(python+caffe实现的)
https://github.com/FranckDernoncourt/caffe_demos/blob/master/iris/iris_tuto.py
代码讲解:http://m.blog.csdn.net/shadow_guo/article/details/50382446

猜你喜欢

转载自blog.csdn.net/u012617944/article/details/78300125