zoukankan      html  css  js  c++  java
  • 深度学习人脸识别实验---VGG模型

    特别说明:本次实验步骤大部分来源于http://blog.csdn.net/wjmishuai/article/details/50658670

    1、caffe环境配置

      主要参考:《深度学习 21天实战Caffe》

    2、VGG人脸识别模型资料(提供论文和以及训练完的人脸模型)

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

    3、LMDB数据集的获取

    • 数据集划分
      #保存图片的路径    
      PATH=/media/img  
      echo "start..."  
      #遍历文件夹  
      for name in $PATH/webface_img/*;do  
              var=0  
      #遍历文件夹中的图片  
              for file_name in $name/*;do    
                  var=$(($var+1));    
                  str=$file_name    
                  #保存图片路径  
                  str=${str#*img}    
                  #保存图片lable    
                  lable=${str#*/}    
                  lable=${lable%%/*}    
                  if [ "$var" = "1" ] || [ "$var" = "3" ] || [ "$var" = "5" ]; then    
                  #验证集    
                  echo $str" "$lable>>/home/gk/val.txt    
                  else    
                  #测试集    
                  echo $str" "$lable>>/home/gk/train.txt    
                  fi    
      done    
      done    
      echo "Done."  
        
    • 转换为LMDB格式
      #保存生成的lmdb的目录    
      EXAMPLE=/media/gk/img
          
      #train.txt和val.txt所在的目录  
      DATA=/home/gk  
          
      #转换图片的工具所在的目录    
      TOOLS=/home/gk/caffe-master/build/tools    
          
      #图片所在的目录  
      TRAIN_DATA_ROOT=/media/gk/img/webface_img  
      VAL_DATA_ROOT=/media/gk/img/webface_img  
          
      # 设置 RESIZE=true 可以把图片resize成想要的尺寸。  
      RESIZE=true  
      if $RESIZE; then  
        RESIZE_HEIGHT=227  
        RESIZE_WIDTH=227  
      else  
        RESIZE_HEIGHT=0  
        RESIZE_WIDTH=0  
      fi  
      
      echo "Creating train lmdb..."  
        
      GLOG_logtostderr=1 $TOOLS/convert_imageset   
          --resize_height=$RESIZE_HEIGHT   
          --resize_width=$RESIZE_WIDTH   
          --shuffle   
          $TRAIN_DATA_ROOT   
          $DATA/train.txt   
          $EXAMPLE/train_lmdb  
        
        
      echo "Creating val lmdb..."  
        
        
      GLOG_logtostderr=1 $TOOLS/convert_imageset   
          --resize_height=$RESIZE_HEIGHT   
          --resize_width=$RESIZE_WIDTH   
          --shuffle   
          $VAL_DATA_ROOT   
          $DATA/val.txt   
          $EXAMPLE/val_lmdb  
        
      echo "Done."  

    4、mean文件,计算图像均值

    #lmdb格式的文件所在的路径  
    EXAMPLE=/media/gk/img/lmdb_webface  
    #均值文件保存的路径  
    DATA=/media/gk/44CA719BCA718A46    
    #转换图片的工具所在的目录   
    TOOLS=/home/gk/caffe-master/build/tools    
        
    $TOOLS/compute_image_mean $EXAMPLE/train_lmdb     
      $DATA/mean.binaryproto    
        
    echo "Done."    

    5、模型训练

    ./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
    • 主要是训练模型参数文件(slover.prototxt)和网络模型结构配置文件(tarin.prototxt)的编写。

    6、模型的测试

    • 参考:

      http://nbviewer.jupyter.org/github/BVLC/caffe/tree/master/examples/

      http://blog.csdn.net/wjmishuai/article/details/50854168

    • 主要代码
      //模型加载
      net=caffe.Classifier('/home/gk/caffe-master/examples/VGG_net/deploy.prototxt',  
          '/home/gk/caffe-master/examples/VGG_net/VGG_face.caffemodel') 
      
      def compar_pic(path1,path2):  
          global net  
          #加载验证图片  
          X=read_image(path1)  
          test_num=np.shape(X)[0]  
          #X  作为 模型的输入  
          out = net.forward_all(data = X)  
          #fc7是模型的输出,也就是特征值  
          feature1 = np.float64(out['fc7'])  
          feature1=np.reshape(feature1,(test_num,4096))  
          #加载注册图片  
          X=read_image(path2)  
          #X  作为 模型的输入  
          out = net.forward_all(data=X)  
          #fc7是模型的输出,也就是特征值  
          feature2 = np.float64(out['fc7'])  
          feature2=np.reshape(feature2,(test_num,4096))  
          #求两个特征向量的cos值,并作为是否相似的依据  
          predicts=pw.cosine_similarity(feature1,feature2)  
          return  predicts  
        
      def read_image(filelist):  
        
          averageImg = [129.1863,104.7624,93.5940]  
          X=np.empty((1,3,224,224))  
          word=filelist.split('
      ')  
          filename=word[0]  
          im1=skimage.io.imread(filename,as_grey=False)  
          #归一化  
          image =skimage.transform.resize(im1,(224, 224))*255  
          X[0,0,:,:]=image[:,:,0]-averageImg[0]  
          X[0,1,:,:]=image[:,:,1]-averageImg[1]  
          X[0,2,:,:]=image[:,:,2]-averageImg[2]  
          return

    7、模型的微调

      参考:http://blog.csdn.net/hlx371240/article/details/51388022  

    http://www.cnblogs.com/ddblog/
  • 相关阅读:
    docker学习及应用
    openstack入门及应用
    C# 值类型,引用类型区别
    C# 继承
    Unity 使用Plugins接入安卓SDK 基础篇
    详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
    Unity3D 协程 浅谈
    《俄罗斯,有点意思》
    老男孩之《生日快乐》
    【诗歌系列】《神曲》
  • 原文地址:https://www.cnblogs.com/ddblog/p/5965119.html
Copyright © 2011-2022 走看看