zoukankan      html  css  js  c++  java
  • Windows caffe VGG人脸识别

      caffe自带的例子有mnist和cifar10,cifar10和mnist的运行方式类型,下好图片数据文件后,训练例子中的模型,然后测试模型,也可以自己用图片进行预测分类(自己图片最好是cifar10训练的10种类型)。10种类型如下:

    airplane
    automobile
    bird
    cat
    deer
    dog
    frog
    horse
    ship
    truck

    其他类型的图片也只能是错误识别,没有意义。

      进入正题,跑完例子,笔者饥渴的想来点别的分类和识别模型。结合时下热门的人脸识别技术,就决定用知名的VGG人脸模型了。

      一、VGG介绍

      http://www.robots.ox.ac.uk/~vgg/software/vgg_face/

      网站提供了VGGFACE的论文出处,使用的是VGG-VERY-DEEP-16 CNN,它在YouTube网站的人脸识别结果可达到92.8%还是不错的成绩!

      网站提供了Torch和caffe两种框架的模型,以及MatConvNet文件。

      二、生成数据

      使用现有的模型来测试,属于caffe的finetuing(微调模型)。

      Windows下要将待测图片生成LEVELDB文件,我使用的是 IMM Face Database (240 images)  http://www.imm.dtu.dk/~aam/

    可自行下载,数据集包含JPG格式的彩图,每人6张图片,共40人,240图片。

      笔者在caffe/examples/目录下新建vggface目录,只要在caffe/目录下都行,在vggface下再分别创建train和val文件夹,存储训练和测试图片:如  D:caffecaffe-masterexamplesvggface rain      D:caffecaffe-masterexamplesvggfaceval
      从数据集选择测试图片放入train文件夹,再新建标签文本 train.txt

    train.txt存放图片的名称和标签类别,注意类别是从0开始,比如10类就是0-9(有点C数组下标的感觉)

      train.txt内容可通过.bat命令生成,笔者部分内容:

    36-1m.jpg 0
    36-2m.jpg 0
    36-3m.jpg 0
    36-4m.jpg 0
    36-5m.jpg 0
    37-1m.jpg 1
    37-2m.jpg 1
    37-3m.jpg 1
    37-4m.jpg 1
    37-5m.jpg 1
    38-1m.jpg 2
    38-2m.jpg 2
    38-3m.jpg 2
    38-4m.jpg 2
    38-5m.jpg 2
    39-1m.jpg 3
    39-2m.jpg 3
    39-3m.jpg 3
    39-4m.jpg 3
    39-5m.jpg 3

      val文件内的图片和val.txt也是同样操作!

      接下来是转换为LEVELDB的数据文件,笔者在网上搜索尝试了很多写法,很多都会报错,或者在Windows下使用shell脚本并不是很方便,最后综合了下,如下convertldb.bat可以成功转换。

      

    D:caffecaffe-masterBuildx64Debugconvert_imageset.exe --resize_width=224 --resize_height=224 D:caffecaffe-masterexamplesvggface	rain   D:caffecaffe-masterexamplesvggface	rain	rain.txt D:caffecaffe-masterexamplesvggface	rain_leveldb -backend=leveldb  
    Pause

      为了还原真实环境我没有在每个目录参数前面换行以显得美观,有的博客将后面3个目录的参数都换行了,贴出来很好看,但是会出现不是内部程序的错误,去掉换行改为空格间隔即可解决!(代码有点长,请拉完观看)

      convert_imageset.exe是自己在caffe工程里生成的,我没有Realease所以Debug也可以的。

      --resize_height是为了调整图片的长宽,因为VGG模型要求是224*224大小,如果你自己用OPENCV或MATLAB调整了大小,可以不要这两个参数。

      后面3个目录分别是训练图片的文件路径;训练图片的标签文件;生成的LEVELDB文件路径;

      -backend=leveldb  很重要,确保生成的是LEVELDB格式,默认是IMDB,Windows使用有问题!

    成功执行convertldb.bat后,会生成对应文件夹,看.log文件大小不为0也没报错基本没问题。

      val文件夹的图片也做和train文件夹类似的转换,只需要在convertldb.bat里修改为val文件夹路径即可!

      有了LEVELDB文件后进入计算均值阶段:

      也是脚本执行,如  compute_mean.bat

    SET GLOG_logtostderr=1
    D:caffecaffe-masterBuildx64Debugcompute_image_mean.exe -backend=leveldb  D:caffecaffe-masterexamplesvggface	rain_leveldb D:caffecaffe-masterexamplesvggfacemean.binaryproto
    pause

      计算均值一般不会出错,compute_image_mean.exe也是在caffe工程里通过VS2013生成的。

      后面两个目录参数依次是: LEVELEDB的文件路径; 生成的均值文件路径;caffe的均值文件是xx.binaryproto

      三、修改网络

      VGG网络可以使用的网络架构模型和某些基本solver参数,但是数据路径,输入层,输出全连接层之类的还是要根据自己的图片类别进行修改。

      新建vggface_train_test.protxt,将下载的模型内的VGG_FACE_deploy.prototxt内容复制到vggface_train_test.protxt。对前面的数据层和最后的输出层进行修改:  

    name: "vggface_train_test.prototxt"
    layers {
      name: "data"
      type: DATA
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }
      transform_param {
      mirror: true
      crop_size: 224
      mean_value: 66
      mean_value: 71
      mean_value: 63
      }
      data_param{
      source: "D:/caffe/caffe-master/examples/vggface/train_leveldb"
      batch_size: 3
      backend: LEVELDB
      }
    }
    layers {
      name: "data"
      type: DATA
      top: "data"
      top: "label"
      include {
      phase: TEST
      }
      transform_param{
      mirror: false
      crop_size: 224
      mean_value: 66
      mean_value: 71
      mean_value: 63
      }
      data_param{
      source: "D:/caffe/caffe-master/examples/vggface/val_leveldb"
      batch_size: 3
      backend: LEVELDB
      }
    }
    layers {
      bottom: "data"
      top: "conv1_1"
      name: "conv1_1"
      type: CONVOLUTION
      convolution_param {
        num_output: 64
        pad: 1
        kernel_size: 3
      }
    }

      修改到第一个卷积层conv1_1之前,如上所示,中间的网络层不用修改。

      最后两层改为如下形式:

    layers {
      bottom: "fc7"
      top: "facefc8"
      name: "facefc8"
      type: INNER_PRODUCT
      inner_product_param {
        num_output: 5
      }
    }
    layers {
      bottom: "facefc8"
      top: "prob"
      name: "prob"
      type: SOFTMAX
    }

      主要是修改两处: 1.name修改,不能使用之前的fc8会报错,笔者改为facefc8; 2.修改num_output分类数我的类别是5个所以改为5!

      接下来是建vggface_solver.prototxt,如下:

    # The train/test net protocol buffer definition
    net: "examples/vggface/vggface_train_test.prototxt"
    # test_iter specifies how many forward passes the test should carry out.
    test_iter: 15
    test_interval: 15
    test_initialization: false
    # The base learning rate, momentum and the weight decay of the network.
    base_lr: 0.00005
    momentum: 0.9
    weight_decay: 0.0002
    lr_policy: "step"
    stepsize: 320000
    gamma: 0.3
    average_loss: 40
    # Display every 100 iterations
    display: 40
    max_iter: 600
    # snapshot intermediate results
    snapshot: 200
    snapshot_prefix: "examples/vggface/vggmodel"
    solver_mode: CPU

      其中迭代次数,学习率,权值衰减都可以自己修改,学习率一开始要小点,笔者电脑渣为了快速看到结果迭代次数都比较少,建议大家迭代次数都是上百上千比较好!

      vggface_solver.prototxt写好后,写一个训练finetuing脚本就行,笔者为 vgg_train.bat

    cd ../../
    "Build/x64/Debug/caffe.exe" train --solver=examples/vggface/vggface_solver.prototxt --weights=examples/vggface/VGG_FACE.caffemodel
    pause 

      几点说明:caffe.exe路径自己修改

      训练网络所以使用 train 关键字,若是测试则为 test

      要加上--weigths  后面为下载的VGGcaffe模型,表示只是对网络finetuing,如果不加就是训练新的网络了!

      最后还可以带一个参数  -gpu=0  表示使用GPU加速,笔者电脑仅CPU所以没写。

    成功训练模型后会出现下图的optimization Done 表示结束!

      

      同时也会生成对应的 .caffemodel和 .solverstate文件,按迭代次数出现多个如:

      有了finetuing后的自己模型后就可以使用测试数据进行结果测试,也可以使用C++调用模型进行分类识别操作。

      测试结果步骤与mnist例子类似,先写到这!

  • 相关阅读:
    ps使logo背景色透明
    ps切图的基本操作
    json
    py3中reduce
    列表去重的多种方法
    python之小数据池
    基于中间件访问频率限制 每分钟时间间隔最多访问3次
    三种实现登录验证的方式
    时间复杂度
    importlib
  • 原文地址:https://www.cnblogs.com/chenzhefan/p/7624811.html
Copyright © 2011-2022 走看看