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

作者: 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