Linux下使用caffe进行图像分类

笔者也是刚刚学习,操作流程模仿http://www.linuxidc.com/Linux/2016-11/136774p12.htm

一、准备数据

采用500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。

编号分别以34567开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张,测试图片100张,共5类。

将图片放在:/home/sys418/LYY_study/datalist

即训练图片目录:/home/sys418/LYY_study/datalist/image_train

测试图片目录:/home/sys418/LYY_study/datalist/image_train

二、转换为lmdb格式

1.设置数据清单(traintest

编写一个脚本create_filelist.sh,用来生成train.txttest.txt清单文件               

# sudo vi /home/sys418/LYY_study/datalist/create_filelist.sh

编辑此文件,写入如下代码,并保存

DATA=/home/sys418/LYY_study/datalist此处注意不加/”易导致之后的字符插入时无法判定是地址还是单纯的字符串

echo "Create train.txt..."

rm -rf $DATA/train.txt

for i in 3 4 5 6 7

do

find  $DATA/image_train -name $i*.jpg | cut -d '/' -f7 |sed "s/$/ $i/">>$DATA/train.txt

解析:1.find  /home/sys418/LYY_study/datalis/image_train -name $i*.jpg

      寻找/home/sys418/LYY_study/datalis/image_train路径下以i”开头以“.jpgt”接我的文件

      2. XXX | cut -d '/' -f7

      XXX进行分割,以“/”为分隔符(-d '/'),取用第7段被分割出的字符(-f7

      /home/sys418/LYY_study/datalis/image_train/123.jpg

      1段:空

      2段:Home

      3段:sys418

      4段:LYY_study

      5段:Datalis

      6段:image_train

      7段:123.jpg

      3. XXX |sed "s/$/ $i/"

      XXX的内容在每行的最末尾(s/$/)标注i$i

done

 

echo "Create test.txt..."

rm -rf $DATA/test.txt

for i in 3 4 5 6 7

do

find  $DATA/image_test -name $i*.jpg | cut -d '/' -f7 | sed "s/$/ $i/">>$DATA/test.txt

done

 

echo "All done"

然后,运行此脚本

# sudo sh  /home/sys418/LYY_study/datalist/create_filelist.sh

成功的话,就会在/home/sys418/LYY_study/datalist/文件夹下生成train.txttest.txt两个文本文件,里面就是图片的列表清单。

2.编写和运行一个调用convert_imageset命令(用于转换数据格式)的脚本文件

# sudo vi  /home/sys418/LYY_study/datalist/create_lmdb.sh

插入:

#!/usr/bin/env sh

 

echo "Create train lmdb.."

m -rf $MY/image_train_lmdb

/home/sys418/caffe/build/tools/convert_imageset

--shuffle --resize_height=256 --resize_width=256

/home/sys418/LYY_study/datalist/image_train/

/home/sys418/LYY_study/datalist/train.txt

/home/sys418/LYY_study/datalist/image_train_lmdb

 

echo "Create test lmdb.."

rm -rf $MY/image_test_lmdb

/home/sys418/caffe/build/tools/convert_imageset

--shuffle --resize_width=256 --resize_height=256

/home/sys418/LYY_study/datalist/image_test/

/home/sys418/LYY_study/datalist/test.txt

/home/sys418/LYY_study/datalist/image_test_lmdb

 

echo "All Done.."

然后,运行此脚本

# sudo sh /home/sys418/LYY_study/datalist/create_lmdb.sh

因为图片大小不一,因此我统一转换成256*256大小。

运行成功后,会在/home/sys418/LYY_study/datalist下面生成两个文件夹img_train_lmdbimg_test_lmdb,分别用于保存图片转换后的lmdb文件。

三、计算均值并保存

图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。

Caffe程序提供了一个计算均值的文件compute_image_mean.cpp

存放在/home/sys418/caffe/build/tools下,我们直接使用就可以了

# sudo /home/sys418/caffe/build/tools/compute_image_mean

/home/sys418/LYY_study/datalist/image_train_lmdb /home/sys418/LYY_study/datalist/mean.binaryproto

compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。

运行成功后,会在/home/sys418/LYY_study/datalist下面生成一个mean.binaryproto的均值文件。

四、创建模型并编写配置文件

模型就用程序自带的caffenet模型,位置在/home/sys418/caffe/models/bvlc_reference_caffenet文件夹下, 将需要的两个配置文件,复制到LYY_study/文件夹内

# sudo cp /home/sys418/caffe/models/bvlc_reference_caffenet/solver.prototxt

 /home/sys418/LYY_study/

# sudo cp /home/sys418/caffe/models/bvlc_reference_caffenet/train_val.prototxt

/home/sys418/LYY_study/

修改其中的solver.prototxt

# sudo vi /home/sys418/LYY_study/solver.prototxt

net: "/home/sys418/LYY_study/train_val.prototxt"

test_iter: 2

test_interval: 50

base_lr: 0.001

lr_policy: "step"

gamma: 0.1

stepsize: 100

display: 20

max_iter: 500

momentum: 0.9

weight_decay: 0.005

solver_mode: GPU

100个测试数据,batch_size50,因此test_iter设置为2,就能全cover了。在训练过程中,调整学习率,逐步变小。

修改train_val.prototxt

# sudo vi /home/sys418/LYY_study/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: "/home/sys418/LYY_study/datalist/mean.binaryproto"

  }

  data_param {

    source: "/home/sys418/LYY_study/datalist/image_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: "/home/sys418/LYY_study/datalist/mean.binaryproto"

  }

  data_param {

    source: "/home/sys418/LYY_study/datalist/image_test_lmdb"

    batch_size: 50

    backend: LMDB

  }

}

实际上就是修改两个data layermean_filesource这两个地方,其它都没有变化 。

五、训练和测试

如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。直接使用/home/sys418/caffe/build/tools下的caffe文件和solver.prototxt文件执行训练。

# sudo /home/sys418/caffe/build/tools/caffe train -solver /home/sys418/LYY_study/solver.prototxt

运行时间和最后的精确度,会根据机器配置,参数设置的不同而不同。使用gpu+cudnn运行500次,大约8分钟,精度为95%

猜你喜欢

转载自blog.csdn.net/qq_32751937/article/details/78233442