用自己的数据完成“分类”

作者: wendy_要努力努力再努力 | 来源:发表于2017-10-08 19:29 被阅读0次

深度学习框架用的是caffe;网络模型是CaffeNet(AlexNet的变形)。

1.准备数据

我用的是Fish4knowledge数据集,数据集内总共有27370张图片,23类,每一类的数量不等且差异大。将其按照5:1:1的比例分为训练集、验证集、测试集。(记住由于每类的数据不均衡,所以一定要随机分配)

  • 训练集:19550张图片
  • 验证集:3910张图片
  • 测试集:3910张图片

2.生成filelist的txt文件

接下来要生成三个文件列表,train.txt、val.txt、test.txt。文件中的每一行存放的是一张图片的文件名(包含相对路径)和类别号,中间用空格隔开。我的类别号从1开始,到23。
可以用python\matlab\shell,任意挑一种你熟练的语言遍历整个数据集,获取文件名列表以及每个文件的类别。

3.转换为lmdb格式

在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。因此我们可以调用caffe里的convert_imageset工具来将图片文件转换成caffe框架中能直接使用的db文件。create_lmdb.sh 且数据集中的图片大小根据情况统一成47*47。

#!/usr/bin/en sh
rm -rf img_lmdb_train
/home/zh/caffe/build/tools/convert_imageset --shuffle \    #  "\" 是另起一行的意思 
--resize_height=47 --resize_width=47 \
Image/train/ \
ImageSets/train.txt img_lmdb_train

rm -rf img_lmdb_val
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/val/ \
ImageSets/val.txt img_lmdb_val

rm -rf img_lmdb_test
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/test/ \
ImageSets/test.txt img_lmdb_test

convert_imageset的使用格式:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

FLAGS: 图片参数 # --shuffle是打乱数据顺序,--backend设置生成的数据形式:lmdb或者leveldb,默认生成lmdb。
ROOTFOLDER/: 图片存放路径
LISTFILE: 图片文件列表清单
DB_NAME: 最终生成的db文件存放目录

4.计算均值并保存

图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的可执行文件compute_image_mean,我们直接使用就可以了。
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,会在 设定的保存路径下面生成一个mean.binaryproto的均值文件。

5.创建模型并编写配置文件

模型就用caffe自带的"CaffeNet"模型( AlexNet的一个变体),位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件solver.prototxt,train_val.prototxt 复制到自己的工程文件夹下;在models/文件夹下,除了CaffeNet还有AlexNet、GoogleNet、R-CNN等网络。

  1. 修改solver.prototxt

3910个测试数据,测试集的batch_size为50,因此test_iter设置为80,就能全cover了。

net: "/home/zh/data/fish4knowledge/Fish_species_recognition/train_val.prototxt"
test_iter: 80         # 测试集的迭代次数
test_interval: 80      #训练的时候,每迭代test_interval次就进行一次测试,得到准确率值。
base_lr: 0.01          #初始的学习率
lr_policy: "step"
gamma: 0.1
stepsize: 5000    #每隔stepsize次,学习率降低gamma倍
display: 20              #每隔20次打印一次loss
max_iter: 25000   #训练的最大迭代次数
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000    #每迭代10000次备份一次中间caffemodel
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train"      #中间模型的保存地址和命名前缀
solver_mode: GPU  

2.修改train_val.prototx

只需要修改train和test的data层就可以了,其它可以不用管。

  name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN       #这个层仅在train阶段     
  }
  transform_param {          #数据的预处理
    mirror: true
    crop_size: 47   ##change
    mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto"   ##change
  }
  data_param {
    source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_train"    ##change
    batch_size: 256
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST       #这个层仅在test阶段  
  }
  transform_param {
    mirror: false
    crop_size: 47  ##change
    mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto"   ##change
  }
  data_param {
    source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_test"   ##change
    batch_size: 50    #测试集的batch_size
    backend: LMDB
  }
}

6.训练和测试

如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。

build/tools/caffe train -solver 绝对路径/solver.prototxt
实验结果截图

相关文章

网友评论

    本文标题:用自己的数据完成“分类”

    本文链接:https://www.haomeiwen.com/subject/aqdyyxtx.html