zoukankan      html  css  js  c++  java
  • caffe windows训练测试自己的图片

    https://www.jianshu.com/p/607f1e51e3ab

    geaus
    2016.05.17 14:31:53字数 540阅读 4,272

    前言:本文参考博客denny402
    这里简要的介绍了下如何使用自己准备的图片数据来训练和测试网络。主要的几个步骤有,图片数据转换为lmdb格式,计算训练数据的均值,sovler文件和网络的简单修改,最后caffe训练。

    数据准备

    这里我照搬denny402准备的数据。其中共有5个类,每个类100张图片,每个类中用于测试的是20张图片(编号0-19),用于训练的是80张图片(编号20-99)。
    首先我在caffe的根目录下的data目录新建文件夹my,将test和train两个目录拷贝到其中。
    然后为train和test中的数据建立了两个txt的列表,分别是文件路径名和对应的label号,需要注意的是label号是从0开始,至4。

     
    testlist.png


    之后是使用convert_imageset.exe将图片转换为lmdb形式。如果你并没有生成这个exe,可以打开caffe的convert_imageset这个工程,右击生成,exe会保存在.in文件夹中。
    然后调用下面的命令行生成两个数据集的lmdb。

    //转换训练数据
    .inconvert_imageset.exe
     --shuffle                      //表示打乱数据的顺序
     --resize_height=256
     --resize_width=256 
     .datamy                    //存放train和test文件夹的路径
     .data	rainlist.txt         //根据trainlist.txt读取图片
     .dataimg_train_lmdb
    
    //转换测试数据
    .inconvert_imageset.exe
     --shuffle                      //表示打乱数据的顺序
     --resize_height=256
     --resize_width=256 
     .datamy                   
     .data	estlist.txt         
     .dataimg_test_lmdb
    
    

    这样在data文件夹中会生成img_train_lmdb和img_test_lmdb两个文件夹分别保存了lmdb格式的数据。

    计算图片均值

    计算图片均值使用的是前一步生成的训练数据的lmdb求的。
    同样如果需要使用的compute_image_mean.exe并没有生成,可以打开该工程,右击生成即可。生成后,使用下面的命令行得到均值文件。

    .incompute_image_mean.exe .dataimg_train_lmdb .datamean.binaryproto
    

    这样就得到了训练数据的均值文件mean.binaryproto。

    sovle.prototxt配置文件和train_val.prototxt模型修改

    这里拷贝了modelsvlc_reference_caffenetsolver.prototxt和train_val.prototxt,并在其中简单修改。

    //solver.prototxt
    net: "data/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
    
    //train_val.prototxt
    name: "CaffeNet"
    layer {
      name: "data"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }
      transform_param {
        mirror: true
        crop_size: 227
        mean_file: "data/mean.binaryproto"
      }
      data_param {
        source: "data/img_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: "data/mean.binaryproto"
      }
      data_param {
        source: "data/img_test_lmdb"
        batch_size: 50
        backend: LMDB
      }
    }
    

    主要的修改就是test iter和test batchsize,以及数据源的修改。前者是因为我们的数据量发生了改变。另外,在FC这个layer处也要修改下,将1000改为5,因为我们这里只有5个类别。

    训练和测试

    以上最终完成了程序caffe.exe运行的准备,最后在命令行中输入

    .incaffe.exe train -solver=.datasolver.prototxt
    

    等待程序运行结束后可以查看结果。我这里的accuracy大致为93%。

    _________________________________________________________________________________________________________________________________________________
    每一个不曾起舞的日子,都是对生命的辜负。
    But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
    其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采
  • 相关阅读:
    关于图片色彩位深度与颜色模式(待完善)
    Android 跨进程数据共享
    Android实现模拟表单上传
    Android数据库无缝升级方案
    Dagger2在Android开发中的应用
    Dagger2学习笔记
    Android开发随手记
    Android Shape Divider
    带你玩转java多线程系列 “道篇” 多线程的优势及利用util.concurrent包测试单核多核下多线程的效率
    带你玩转java多线程系列 二 Thread 和 Runnable
  • 原文地址:https://www.cnblogs.com/leoking01/p/14547423.html
Copyright © 2011-2022 走看看