用caffe对自己的图片进行分类,包含详细代码

来源:互联网 发布:正规淘宝刷平台官网 编辑:程序博客网 时间:2024/05/17 11:03

今年开始接触深度学习,之前很多工作都没有写博客觉得很可惜,决定从这次实验开始记录过程。第一次写,缺点比较多,欢迎大家提建议,以后改正。

一、数据
数据是我从网上下载的,后期打算自己采集图片再进行一次实验。数据集由三类图片构成,分别是bike,person和both,每类200张,一共600张。需要的同学可以从我的网盘下载,也可以自己找图片进行训练。网盘链接:链接:http://pan.baidu.com/s/1mihxBnU 密码:61t6然后分成数据集和测试集,测试集450张,每类150张,训练集150张,每类50张。建两个文件夹分别存放,路径是caffe-master/data/mydata/train 和caffe-master/data/mydata/val。因为接下来的程序要求图片大小一致,所以第一步是图片预处理,把图片都处理成256*256的,具体程序如下:(这步也可以省略,用后面的脚本进行处理更加方便。)

/**********************************************  *           批量更改图片大小*          Win10 + VS2015 + Opencv 3.1.0*           Sun Ruiyun* 2017 / 07 / 06***********************************************/#include "stdafx.h"  #include <opencv2/opencv.hpp>  #include <opencv2/imgproc/imgproc.hpp>  #include <iostream>  #include <string>  #include <direct.h>  using namespace cv;using namespace std;int main(){    int k;    for (k = 1; k <= 9; k++)    {        char imageName[100];        char imageSave[100];        sprintf_s(imageName, "D:\\documents\\visual studio 2015\\Projects\\resize\\resize\\resize\\bikes\\both_00%d.bmp", k);        sprintf_s(imageSave, "D:\\documents\\visual studio 2015\\Projects\\resize\\resize\\resize\\aft_bikes\\both00%d.bmp", k);        Mat src_img = imread(imageName);//读入图片数据          Mat dst_img1;        resize(src_img, dst_img1, Size(256, 256), 0, 0, CV_INTER_LINEAR);   // 双线性插值          imwrite(imageSave, dst_img1);        waitKey(0);    }}

用程序处理完的图片如下图所示,都是256*256大小的图片。
这里写图片描述

二、转换成lmdb格式
首先,在examples下面创建一个mydata的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件.

sudo mkdir examples/mydatasudo vi examples/mydata/create_filelist.sh

图片清单由图片名称+空格+序号组成。可使用如下程序来生成,把代码写入文件并保存

#!/usr/bin/env shDATA=data/mydata/echo "Create train.txt..."rm -rf $DATA/train.txtfind $DATA/train -name bike*.bmp| cut -d '/' -f 5 | sed "s/$/ 0/">>$DATA/train.txtfind $DATA/train -name person*.bmp| cut -d '/' -f 5 | sed "s/$/ 1/">>$DATA/train.txtfind $DATA/train -name both*.bmp| cut -d '/' -f 5 | sed "s/$/ 2/">>$DATA/train.txtecho "Create val.txt..."rm -rf $DATA/val.txtfind $DATA/val -name bike*.bmp| cut -d '/' -f 5 | sed "s/$/ 0/">>$DATA/val.txtfind $DATA/val -name person*.bmp| cut -d '/' -f 5 | sed "s/$/ 1/">>$DATA/val.txtfind $DATA/val -name both*.bmp| cut -d '/' -f 5 | sed "s/$/ 2/">>$DATA/val.txtecho "All done"

然后运行此脚本

sudo sh examples/mydata/create_filelist.sh

最后生成的列表清单如下:
这里写图片描述

接下来就需要把图片转成lmdb格式了:

sudo vi examples/mydata/create_mydata_lmdb.sh

插入:

#!/usr/bin/env sh# Create the imagenet lmdb inputs# N.B. set the path to the imagenet train + val data dirsset -eEXAMPLE=examples/mydataDATA=data/mydataTOOLS=build/toolsTRAIN_DATA_ROOT=/home/sun/caffe-master/data/mydata/train/VAL_DATA_ROOT=/home/sun/caffe-master/data/mydata/val/RESIZE=trueif $RESIZE; then  RESIZE_HEIGHT=256  RESIZE_WIDTH=256else  RESIZE_HEIGHT=0  RESIZE_WIDTH=0fiecho "Creating train lmdb..."rm -rf $EXAMPLE/mydata_train_lmdbGLOG_logtostderr=1 $TOOLS/convert_imageset \    --resize_height=$RESIZE_HEIGHT \    --resize_width=$RESIZE_WIDTH \    --shuffle \    $TRAIN_DATA_ROOT \    $DATA/train.txt \    $EXAMPLE/mydata_train_lmdbecho "Creating val lmdb..."rm -rf $EXAMPLE/mydata_val_lmdbGLOG_logtostderr=1 $TOOLS/convert_imageset \    --resize_height=$RESIZE_HEIGHT \    --resize_width=$RESIZE_WIDTH \    --shuffle \    $VAL_DATA_ROOT \    $DATA/val.txt \    $EXAMPLE/mydata_val_lmdbecho "Done."

后来我才发现,上面这个脚本直接就可以resize 图片,所以大家也可以不用之前的程序进行resize,而直接用这个脚本。然后运行脚本

sudo sh examples/mydata/creat_mydata_lmdb.sh

运行结束会生成两个lmdb格式的文件,如下:
这里写图片描述这里写图片描述
三、计算均值
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
同样的,我们先创建一个脚本文件:

sudo vi examples/mydata/make_mydata_mean.sh

编辑

#!/usr/bin/env shEXAMPLE=examples/mydataDATA=data/mydataTOOLS=build/toolsrm -rf $DATA/mydata_mean.binaryproto$TOOLS/compute_image_mean $EXAMPLE/mydata_train_lmdb \  $DATA/mydata_mean.binaryprotoecho "Done."

然后运行

sudo sh examples/mydata/make_mydata_mean.sh

运行成功后生成一个mydata_mean.binaryproto文件,在以后运用。生成文件如下
这里写图片描述

四、创建模型并编写配置文件
我们用caffe自带的caffenet模型进行实验,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到mydata文件夹内

sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/mydata/sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/mydata/

然后打开solver.prototxt进行修改:我的修改如下,大家可根据需要自己设置参数:

net: "/home/sun/caffe-master/examples/mydata/train_val.prototxt"test_iter: 3test_interval: 50base_lr: 0.001lr_policy: "step"gamma: 0.1stepsize: 100display: 20max_iter:500momentum: 0.9weight_decay: 0.005snapshot: 50snapshot_prefix: "examples/mydata/caffenet_train"solver_mode: CPU

再打开train_val.prototxt进行修改,只需要修改两个data层,把需要的文件路径改成自己的文件路径即可,其他的不需要修改。

name: "CaffeNet"layer {  name: "data"  type: "Data"  top: "data"  top: "label"  include {    phase: TRAIN  }  transform_param {    mirror: true    crop_size: 227    mean_file: "data/mydata/mydata_mean.binaryproto"   //第一处  }  data_param {    source: "examples/mydata/mydata_train_lmdb"      //第二处    batch_size:150       //第三处    backend: LMDB  }}layer {  name: "data"  type: "Data"  top: "data"  top: "label"  include {    phase: TEST  }  transform_param {    mirror: false    crop_size: 227    mean_file: "data/mydata/mydata_mean.binaryproto"     //第四处  }  data_param {    source: "examples/mydata/mydata_val_lmdb"         //第五处    batch_size:50        //第六处    backend: LMDB  }}

五、训练和测试
最后一步,输入训练命令,就开始训练啦!

sudo build/tools/caffe train -solver examples/mydata/solver.prototxt

训练的时间和精度与设备和参数有关,可通过调整提高。我的是仅CPU模式,所以运行的时间比较久。训练结果如下:
这里写图片描述

学习过程中参考了很多博客:
http://blog.csdn.net/maweifei/article/details/53024380
http://www.cnblogs.com/denny402/p/5083300.html

阅读全文
0 0