精华内容
下载资源
问答
  • 人脸识别C++实现,里面有源码和直接运行测试包,可以直接运行,也可以自己修改。这是老师布置学期大作业,可以直接使用。脸面包含人脸识别训练、标记、可以识别多人,标记
  • 本课程首先会带大家一起回顾下人脸识别的问题定义、历史发展,以及学术界的新进展。然后会跟大家聊一下工业界对人脸识别技术的需求,并分享一些工业界进行大规模人脸识别的经验,常用的人脸识别算法。后会宣布一个...
  • opencv 人脸识别训练样本处理

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤:

    • 进行人脸检测,将检测出的人脸存入数据库2
    • 对数据库2进行人脸建模
    • 在测试集上进行recognition

    本篇实现第一步:
    • 进行人脸检测,将检测出的人脸存入数据库2


    环境:vs2010+opencv 2.4.6.0

    特征:eigenface

    Input:一个人脸数据库,15个人,每人20个样本(左右)。

    Output:人脸检测,并识别出每张检测到的人脸。

    ===============================


    本文完成第一步,数据预处理:自动检测所有文件夹中每个sample中的人脸,作为训练数据。

    Input:一个color文件夹,每个文件夹中有1~N这N个子文件夹,每个子文件夹内有n张包括第n类人的照片,如图。




    最终结果:


    核心:face detection(detectAndDraw)

    辅助:截图并保存部分图片(CutImg),文件夹内图片遍历(read_img),图片转换成相同大小(normalizeone)

    括号内分别是函数名,下面分别给出代码及说明。


    1. 遍历文件夹:CBrowseDir类和CStatDir类(具体见这篇),三个文件如下:

    1.1 BrowseDir.h

    #pragma once#include "direct.h"#include "string.h"#include "io.h"#include "stdio.h" #include <vector>#include <iostream>using namespace std;class CBrowseDir{protectedchar m_szInitDir[_MAX_PATH];public: CBrowseDir(); bool SetInitDir(const char *dir)bool BeginBrowse(const char *filespec)vector<char*> BeginBrowseFilenames(const char *filespec);protectedbool BrowseDir(const char *dir,const char *filespec)vector<char*> GetDirFilenames(const char *dir,const char *filespec); virtual bool ProcessFile(const char *filename)virtual void ProcessDir(const char *currentdir,const char *parentdir);};


    1.2 BrowseDir.cpp

    #include "BrowseDir.h"#include "direct.h"#include "string.h"#include "io.h"#include "stdio.h" #include <vector>#include <iostream>using namespace std;CBrowseDir::CBrowseDir(){ getcwd(m_szInitDir,_MAX_PATH); int len=strlen(m_szInitDir); if (m_szInitDir[len-1] != '\\')  strcat(m_szInitDir,"\\");}bool CBrowseDir::SetInitDir(const char *dir){ if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)  return falseif (_chdir(m_szInitDir) != 0)  return falseint len=strlen(m_szInitDir); if (m_szInitDir[len-1] != '\\')  strcat(m_szInitDir,"\\"); return true;}vector<char*>CBrowseDir:: BeginBrowseFilenames(const char *filespec){ ProcessDir(m_szInitDir,NULL); return GetDirFilenames(m_szInitDir,filespec);}bool CBrowseDir::BeginBrowse(const char *filespec){ ProcessDir(m_szInitDir,NULL); return BrowseDir(m_szInitDir,filespec);}bool CBrowseDir::BrowseDir(const char *dir,const char *filespec){ _chdir(dir); long hFile; _finddata_t fileinfo; if ((hFile=_findfirst(filespec,&fileinfo)) != -1) {  do  {   if (!(fileinfo.attrib & _A_SUBDIR))   {    char filename[_MAX_PATH];    strcpy(filename,dir);    strcat(filename,fileinfo.name);    cout << filename << endl;    if (!ProcessFile(filename))     return false;   }  } while (_findnext(hFile,&fileinfo) == 0);  _findclose(hFile); } _chdir(dir); if ((hFile=_findfirst("*.*",&fileinfo)) != -1) {  do  {   if ((fileinfo.attrib & _A_SUBDIR))   {    if (strcmp(fileinfo.name,".") != 0 && strcmp     (fileinfo.name,"..") != 0)    {     char subdir[_MAX_PATH];     strcpy(subdir,dir);     strcat(subdir,fileinfo.name);     strcat(subdir,"\\");     ProcessDir(subdir,dir);     if (!BrowseDir(subdir,filespec))      return false;    }   }  } while (_findnext(hFile,&fileinfo) == 0);  _findclose(hFile); } return true;}vector<char*> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec){ _chdir(dir); vector<char*>filename_vec; filename_vec.clear(); long hFile; _finddata_t fileinfo; if ((hFile=_findfirst(filespec,&fileinfo)) != -1) {  do  {   if (!(fileinfo.attrib & _A_SUBDIR))   {    char *filename = new char[_MAX_PATH];    strcpy(filename,dir);    //int st = 0; while (dir[st++]!='\0');    strcat(filename,fileinfo.name); //filename[st]='\0';    filename_vec.push_back(filename);   }  } while (_findnext(hFile,&fileinfo) == 0);  _findclose(hFile); } _chdir(dir); if ((hFile=_findfirst("*.*",&fileinfo)) != -1) {  do  {   if ((fileinfo.attrib & _A_SUBDIR))   {    if (strcmp(fileinfo.name,".") != 0 && strcmp     (fileinfo.name,"..") != 0)    {     char subdir[_MAX_PATH];     strcpy(subdir,dir);     strcat(subdir,fileinfo.name);     strcat(subdir,"\\");     ProcessDir(subdir,dir);     return GetDirFilenames(subdir,filespec);    }   }  } while (_findnext(hFile,&fileinfo) == 0);  _findclose(hFile); } return filename_vec;}bool CBrowseDir::ProcessFile(const char *filename){ return true;}void CBrowseDir::ProcessDir(const char  *currentdir,const char *parentdir){}


    1.3 StatDir.h

    #pragma once#include "browsedir.h"class CStatDir:public CBrowseDir{protectedint m_nFileCount;   //保存文件个数 int m_nSubdirCount; //保存子目录个数public: CStatDir() {  m_nFileCount=m_nSubdirCount=0; } int GetFileCount() {  return m_nFileCount; } int GetSubdirCount() {  return m_nSubdirCount-1; }protectedvirtual bool ProcessFile(const char *filename) {  m_nFileCount++;  return CBrowseDir::ProcessFile(filename); } virtual void ProcessDir  (const char *currentdir,const char *parentdir) {  m_nSubdirCount++;  CBrowseDir::ProcessDir(currentdir,parentdir); }};




    2. 辅助函数Prehelper.h, Prehelper.cpp:负责返回文件夹内所有图片(read_img),检测人脸(detectAndDraw并可以在原图中画出),截图(CutImg),提取(DetectandExtract)

    2.1 Prehelper.h

    //preprocessing helper//@ Author : Rachel-Zhang#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/contrib/contrib.hpp"#include <cv.h>#include <vector>#include <utility>using namespace cv;using namespace std;void normalizeone(const char* dir,IplImage* standard);void CutImg(IplImage* src, CvRect rect,IplImage* res);vector<Rect> detectAndDraw( Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip,bool draw );IplImage* DetectandExtract(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip);int read_img(const string& dir, vector<Mat> &images);vector<pair<char*,Mat>>  read_img(const string& dir);



    2.2 Prehelper.cpp

    #include "Prehelper.h"#include "BrowseDir.h"#include "StatDir.h"#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <cv.h>using namespace cv;void normalizeone(const char* dir,IplImage* standard){ CStatDir statdir; if (!statdir.SetInitDir(dir)) {  puts("Dir not exist");  return; } vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*"); int i; for (i=0;i<file_vec.size();i++) {  IplImage* cur_img = cvLoadImage(file_vec[i],CV_LOAD_IMAGE_GRAYSCALE);  //IplImage*cur_gray = cvCreateImage(cvGetSize(cur_img),cur_img->depth,1);  cvResize(cur_img,standard,CV_INTER_AREA);  //cvCvtColor(standard,cur_gray,CV_RGB2GRAY);  //   cvNamedWindow("cur_img",CV_WINDOW_AUTOSIZE);  //   cvNamedWindow("standard",CV_WINDOW_AUTOSIZE);  //   cvShowImage("cur_img",cur_img);  //   cvShowImage("standard",standard);  //   cvWaitKey();  cvSaveImage(file_vec[i],cur_img); }}void CutImg(IplImage* src, CvRect rect,IplImage* res){ CvSize imgsize; imgsize.height = rect.height; imgsize.width = rect.width; cvSetImageROI(src,rect); cvCopy(src,res); cvResetImageROI(res);}int read_img(const string& dir, vector<Mat> &images){ CStatDir statdir; if (!statdir.SetInitDir(dir.c_str())) {  cout<<"Direct "<<dir<<"  not exist!"<<endl;  return 0; } int cls_id = dir[dir.length()-1]-'0'vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*"); int i,s = file_vec.size(); for (i=0;i<s;i++) {  Mat graymat = imread(file_vec[i],0);  //graymat.reshape(1,1);//flatten to one row  images.push_back(graymat); } return s;}vector<pair<char*,Mat>>  read_img(const string& dir){ CStatDir statdir; pair<char*,Mat> pfi; vector<pair<char*,Mat>> Vp; if (!statdir.SetInitDir(dir.c_str())) {  cout<<"Direct "<<dir<<"  not exist!"<<endl;  return Vp; } int cls_id = dir[dir.length()-1]-'0'vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*"); int i,s = file_vec.size(); for (i=0;i<s;i++) {  pfi.first = file_vec[i];  pfi.second = imread(file_vec[i]);  Vp.push_back(pfi); } return Vp;}vector<Rect> detectAndDraw( Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip, bool draw ){ int i = 0double t = 0vector<Rect> faces, faces2; const static Scalar colors[] =  { CV_RGB(0,0,255),  CV_RGB(0,128,255),  CV_RGB(0,255,255),  CV_RGB(0,255,0),  CV_RGB(255,128,0),  CV_RGB(255,255,0),  CV_RGB(255,0,0),  CV_RGB(255,0,255)} ; Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); cvtColor( img, gray, CV_BGR2GRAY ); resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); equalizeHist( smallImg, smallImg ); t = (double)cvGetTickCount(); cascade.detectMultiScale( smallImg, faces,  1.1, 2, 0  |CV_HAAR_FIND_BIGGEST_OBJECT  //|CV_HAAR_DO_ROUGH_SEARCH  //|CV_HAAR_SCALE_IMAGE  ,  Size(30, 30) ); if( tryflip ) {  flip(smallImg, smallImg, 1);  cascade.detectMultiScale( smallImg, faces2,   1.1, 2, 0   |CV_HAAR_FIND_BIGGEST_OBJECT   //|CV_HAAR_DO_ROUGH_SEARCH   //|CV_HAAR_SCALE_IMAGE   ,   Size(30, 30) );  for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ )  {   faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));  } } t = (double)cvGetTickCount() - t; printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); if(draw) {  for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )  {   Mat smallImgROI;   vector<Rect> nestedObjects;   Point center;   Scalar color = colors[i%8];   int radius;   double aspect_ratio = (double)r->width/r->height;   rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),    cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),    color, 3, 8, 0);   if( nestedCascade.empty() )    continue;   smallImgROI = smallImg(*r);   nestedCascade.detectMultiScale( smallImgROI, nestedObjects,    1.1, 2, 0    |CV_HAAR_FIND_BIGGEST_OBJECT    //|CV_HAAR_DO_ROUGH_SEARCH    //|CV_HAAR_DO_CANNY_PRUNING    //|CV_HAAR_SCALE_IMAGE    ,    Size(30, 30) );   //draw eyes   //         for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )   //         {   //             center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);   //             center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);   //             radius = cvRound((nr->width + nr->height)*0.25*scale);   //             circle( img, center, radius, color, 3, 8, 0 );   //         }  }  cv::imshow( "result", img ); } return faces;}IplImage* DetectandExtract(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip)vector<Rect> Rvec = detectAndDraw(img,cascade,nestedCascade,scale,tryflip,0); int i,maxxsize=0,id=-1,area; for (i=0;i<Rvec.size();i++) {  area = Rvec[i].width*Rvec[i].height;  if(maxxsize<area)  {   maxxsize = area;   id = i;  } } IplImage* transimg = cvCloneImage(&(IplImage)img); if(id!=-1) {  CvSize imgsize;  imgsize.height = Rvec[id].height;  imgsize.width = Rvec[id].width;  IplImage* res = cvCreateImage(imgsize,transimg->depth,transimg->nChannels);  CutImg(transimg,Rvec[id],res);  return res; } return NULL;}


    3. 主函数

    //Detect.cpp//Preprocessing - Detect, Cut and Save//@Author : Rachel-Zhang#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <cctype>#include <iostream>#include <iterator>#include <stdio.h>#include "BrowseDir.h"#include "StatDir.h"#include "Prehelper.h"using namespace std;using namespace cv;#define CAM 2#define PHO 1#define K 5string cascadeName = "E:/software/opencv2.4.6.0/data/haarcascades/haarcascade_frontalface_alt.xml";string nestedCascadeName = "E:/software/opencv2.4.6.0/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";int main( ){ CvCapture* capture = 0; Mat frame, frameCopy, image; string inputName; bool tryflip = falseint mode; CascadeClassifier cascade, nestedCascade;  double scale = 1.0if( !cascade.load( cascadeName ) ||!nestedCascade.load( nestedCascadeName)) {  cerr << "ERROR: Could not load classifier cascade or nestedCascade" << endl;//若出现该问题请去检查cascadeName,可能是opencv版本路径问题  return -1; }//  printf("select the mode of detection: \n1: from picture\t 2: from camera\n");//  scanf("%d",&mode); char** pics = (char**) malloc(sizeof*pics); /************************************************************************/ /*                                  detect face and save                                    */ /************************************************************************/ int i,j; cout<<"detect and save..."<<endlconst char dir[256] = "D:\\Face_recognition\\pic\\";   string cur_dir;  char id[5]; for(i=1; i<=K; i++) {  cur_dir = dir;  _itoa(i,id,10);  cur_dir.append("color\\");  cur_dir.append(id);  vector<pair<char*,Mat>> imgs=read_img(cur_dir);  for(j=0;j<imgs.size();j++)  {   IplImage* res = DetectandExtract(imgs[j].second,cascade,nestedCascade,scale,tryflip);   if(res)    cvSaveImage(imgs[j].first,res);  } } return 0;}


    正确的输出就是一系列人脸检测时间,且原文件夹内的图片变成了检测出的人脸(如上面结果图所示)。




    文章所用代码打包链接:http://download.csdn.net/detail/abcjennifer/7047853


    关于Computer Vision更多的学习资料将继续更新,敬请关注本博客和新浪微博Rachel Zhang




               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 人脸识别模型训练

    千次阅读 2019-03-14 21:27:33
    这里介绍我训练的人脸识别模型,放到了github上,各位看官路过可以点个star 简介 这个仓库我提供了训练人脸深度神经网络代码,框架使用是pytorch。损失函数用是center_loss。同时也提供了triplet_loss...

    github地址:  face-recognition-supervised-by-center-loss

    这里介绍我训练的人脸识别模型,放到了github上,各位看官路过的可以点个star

    简介

    这个仓库我提供了训练人脸深度神经网络的代码,框架使用的是pytorch。损失函数用的是center_loss。同时也提供了triplet_loss的实现。但是根据我的训练经验,用triplet_loss训练没有用center_loss准确度高。所以推荐center_loss。网络我使用的是标准的vgg16。你也可以根据自己的需求换成resnet 或者其他。我相信会获得更高的准确度(大概高两三个百分点的样子)。因为工作需求我选择了vgg16。训练数据我选择的是vggface2(8631个id 及300万照片)。MSLM 有更多的数据,用MSLM 训练我相信结果h会再好一点(大概一两个百分点)。测试数据集我选择的是LFW

    训练结果 

    vgg16+vggface2:   测试准确度:  0.967     auc:  0.99

    auc

    (测试时代码绘制的ROC曲线图)

    环境

    python3, pytorch  

    代码既可以在CPU运行,也可以在GPU中运行,支持多显卡

    数据准备

    所有的人脸都需要被对齐,使用MTCNN算法,然后才裁剪成112*112大小。

    获取数据以及对齐的方法请参考 https://github.com/deepinsight/insightface
    这个仓库里提供了mxnet压缩的数据,关于解压缩的方法仓库里也有提供,可以下载下来用它的代码解压缩。里边的图片已经对齐并且裁剪好的。如果你想对齐自己的数据,也可以用它src/align里的代码对齐自己的数据。如果你的数据不对齐,效果会很差。

    因为vggface2的数据太大了,还是读者自行下载,我提供了LFW测试集的下载连接

    链接:https://pan.baidu.com/s/1hfTRck0jc2HM1Ya2r-BAVQ 
    提取码:z2qn 

    数据的存放地址: datasets文件夹里

    存放格式(一定要按类别存放):--datasets

                          --vggface2(数据集名)

                                ---类别名(这里是人名或者时编号)

                                          ---1111.jpg

    训练

    使用center loss (recommand)

    paper: A Discriminative Feature Learning Approach for Deep Face Recognition

    1.修改配置文件 -------> training_certer.json

    我把所有的配置项都写在了json文件里,这样训练的时候就不用带一大堆参数了。
     

    参数名 默认值 说明
     dataroot  "datasets/vggface2" 训练集的地址,放到dataset文件夹里
     lfw_dir  |"datasets/lfw_alighed" 测试集的地址
    lfw_pairs_path  "datasets/lfw_alighed" 测试集的triplet对
     log_dir  "./checkpoints" 存放checkpoint的地址
     resume   false 是否预训练加载checkpoint
    start_epoch 0 开始的epoch序号
    epochs   50 训练的epoch数
    no_cuda  false 使用cuda为false,不适用为true
    gpu_id   "0,1" gpu序号
    num_workers  10 加载数据的进程数
    seed  | 0| random seed| 0 随机数种子
     val_interval  200 每隔$(val_interval) batchs ,用测试集测试一次
    log_interval   10 每隔$(log_interval) batchs ,打印训练的信息(loss等)
    save_interval   500 每隔$(save_interval  ) batchs ,保存checkpoint
     batch_size 256 traing batch_size
    test_batch_size   128 test_batch_size  
    optimizer   "sgd" 优化器:sgd/adam/adagrad
    lr   0.1 学习率
    center_loss_weight  0.5 center_loss 所占权重
    alpha   0.5 center的学习率
    beta1   0.9 adam param1
    lr_decay   1e-4 adam param2
    wd   0.0 adam param3

    2. 运行

    python train_center.py

     

    使用triplet loss

    paper:FaceNet: A Unified Embedding for Face Recognition and Clustering

    1.修改配置文件 -------> training_triplet.json

    比之前的配置项多了两个参数

    参数名 默认值 说明
    n_triplets   1000000  训练用的triplet pairs 的数量
    margin   0.5 margin in paper FaceNet

    2.运行

    python train_triplet.py

    你可以观察训练的过程 使用tensorboard. 具体的方式被写在了: "checkpoints/readme.txt"

    预训练的checkpoints

    这里提供我自己训练的vgg16的模型一个,可以放在checkpoints里加载

    链接:https://pan.baidu.com/s/1IPdmFy0bFfPt1xqV8S7eDg 
    提取码:89sf 

    代码中加载checkpoints的逻辑是:遍历checkpoints文件夹所有pth文件,选择Acc后面数最大的,例如checkpoints_Acc0.89 .pth  和 checkpoints_Acc0.99 .pth 就会选择 后一个加载

    展开全文
  • 人脸识别的多步模型训练
  • 人脸识别自己训练模型

    万次阅读 2018-03-30 15:15:29
    人脸识别自己训练模型OpenCV3官方中级联分类器目标检测——cv::CascadeClassifier,介绍了如何使用级联分类器进行目标检测。而且人家也训练好了,可以自己去opencv里面找。这里,我们介绍一下如何训练自己级联...

    人脸识别自己训练模型

    OpenCV3官方中的级联分类器目标检测——cv::CascadeClassifier介绍了如何使用级联分类器进行目标检测。而且人家也训练好了,可以自己去opencv里面找。这里,我们介绍一下如何训练自己的级联分类器。


    直接说明如何进行训练。在opencv的安装目录中的bin文件夹下有两个可执行文件opencv_createsamples.exe和opencv_traincascade.exe。将这两个文件拷贝到训练文件夹下,并将正、负样本的文件夹和描述文件——positive_samples.txt和negative_samples.txt也拷贝到这个文件夹下。同时,新建两个.bat文件——create_positive_samples.bat和traincascade.bat,新建一个文件夹data。这样,训练目录如下:








    其中,-info字段填写正样本描述文件;-vec用于保存制作的正样本;-num制定正样本的数目;-w和-h分别指定正样本的宽和高。


    这样,正样本制作完成。


    字段说明如下:

    -data:指定保存训练结果的文件夹;

    -vec:指定正样本集;

    -bg:指定负样本的描述文件夹;

    -numPos:指定每一级参与训练的正样本的数目(要小于正样本总数);

    -numNeg:指定每一级参与训练的负样本的数目(可以大于负样本图片的总数);

    -numStage:训练的级数;

    -w:正样本的宽;

    -h:正样本的高;

    -minHitRate:每一级需要达到的命中率(一般取值0.95-0.995);

    -maxFalseAlarmRate:每一级所允许的最大误检率;

    -mode:使用Haar-like特征时使用,可选BASIC、CORE或者ALL;

    另外,还可指定以下字段:

    -featureType:可选HAAR或LBP,默认为HAAR;

    其他字段将不再说明。



    总结:

    1数据准备。
    Python代码。图片要记得同一尺寸,放到sample_positive文件夹里。
    负样本数据要Python趴图片。


    主要生出二进制的vector文件,执行bat时候系统报错少了D:\opencv\opencv3-3\opencv\build\x64\vc14\bin 里面opencv_world330.dll文件。放到同级目录下就可以了。


    bat换行不能乱来
    大小写ALL错了


    -nstages 预先设定的分类器级数,但是如果你的负样本不给力的话,这句有跟没有一样,就是报这个参数不行,跑步起来。


    -npos  每级需要的正样本的数目,这个值一定不要超过你的真实正样本的值(比如50张正样本,你就         设为45),不然就会assert报错,具体原因并不清楚,有点莫名其妙!


    .样本选择的原则是:数量越多越好,尽量高于1000;样本间差异性越大越好


    3.正负样本比例为1:3最佳,尺寸为20x20最佳





    http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html

    这篇文章写的最详细,最易理解。


    本来打算讲一下用深度学习训练的方法,可是训练人脸识别的时候,把caffe搞崩了,所以后面懒得再按装了,所以就没继续搞了。很遗憾。但是我们导师要转到TensorFlow,有机会的话,可能会用tf来跑一下试试。



    参考资料:

    https://blog.csdn.net/guduruyu/article/details/70183372

    http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/gpu/doc/object_detection.html?highlight=cascadeclassifier
    http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html?highlight=cascadeclassifier
    http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/objdetect/doc/cascade_classification.html?highlight=opencv_traincascade
    http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html?highlight=opencv_haartraining

    展开全文
  • 此为国外的一个人脸识别应用例子,可以先存贮人脸库,接着进行人脸的训练,提高识别的精确度。已包含要用到的所有头文件和功能函数实现。
  • 当我们写人脸模型的训练程序的时候,我们需要读取人脸人脸对应的标签。所以我们用csv文件读取。这个at.txt就是我们需要的csv文件。生成之后它里面是这个样子的: opencv教程里面为我们提供了自动生成csv文件的...

    一、csv文件的生成

    当我们写人脸模型的训练程序的时候,我们需要读取人脸和人脸对应的标签。所以我们用csv文件读取。这个at.txt就是我们需要的csv文件。生成之后它里面是这个样子的:

    opencv教程里面为我们提供了自动生成csv文件的脚本(记得改路径):


    点击此处下载文档和源码

    转载于:https://my.oschina.net/u/4185264/blog/3087652

    展开全文
  • 人脸识别模型训练集处理前面已经实现将人脸拍摄下来存储在traindata文件夹内,但是这还不够,我们需要对测试图片进行大小调整,因为有些图片格式长短不一样,这样对于后面我们训练模型不方便处理,而且较大...
  • opencv人脸识别训练py

    2019-04-16 18:32:27
    opencv人脸识别训练py文件,包含人脸训练以及保存模型代码
  • OpenCV人脸识别训练

    2018-06-03 12:11:12
    OpenCV的人脸识别训练集,用于识别图像中人脸,省去了自己训练的麻烦
  • 萌新教材之人脸识别的人脸数据训练AA 首先声明一下我也是初学者,但是见CSDN对于萌新学人脸识别没有好的教程,我打算分享自己的学习历程。我之前已经做过了利用face_recognition库做人脸识别,但是用这个做人脸识别...
  • 基于matlab的人脸识别训练部分代码实现。训练部分代码
  • # 用于存储人脸数据 cl=[] # 用于存储标签 face_eneine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') # 获取人脸检测分类器 with open("D:/java_ceshi/python_wenjia
  • 人脸识别训练库_ORL

    2018-08-19 13:21:05
    人脸识别训练库_ORL,内含切割好人脸图以及训练模型
  • 利用opencv自带harr分类器训练的人脸识别分类器,准确率还不错。
  • Turing架构,设置fp16=True,对精度可能有影响 使用partial fc,设置config.sample_rate < 1 比如 0.5, 0.1之类 ...增加batch_size直到训练速度(# sample/secode)不再增加,gpu-util在90%左右 ...
  • Google提出开源人脸识别算法FaceNet训练模型,FaceNet官方训练模型,20180408-102900 NOTE: If you use any of the models, please do not forget to give proper credit to those providing the ...
  • Google提出开源人脸识别算法FaceNet训练模型,FaceNet官方训练模型,20180402-114759 NOTE: If you use any of the models, please do not forget to give proper credit to those providing the ...
  • Google提出开源人脸识别算法FaceNet训练模型,FaceNet官方训练模型,20170512-110547 NOTE: If you use any of the models, please do not forget to give proper credit to those providing the ...
  • Google提出开源人脸识别算法FaceNet训练模型,FaceNet官方训练模型,20170511-185253 NOTE: If you use any of the models, please do not forget to give proper credit to those providing the ...
  • CNN训练人脸识别

    2018-07-14 20:52:16
    利用深度学习CNN进行人脸识别,对Olivettiface公开数据库中人脸数据进行训练
  • OpenCV——人脸识别模型训练(2)

    千次阅读 2018-05-03 12:30:49
    在之前的博客OpenCV——人脸识别数据处理(1)之中,已经下载了ORL人脸数据库,并且为了识别自己的人脸...当我们写人脸模型的训练程序的时候,我们需要读取人脸和人脸对应的标签。直接在数据库中读取显然是低效的。...
  • 人脸识别训练集.rar

    2019-08-22 17:20:55
    人脸识别使用的训练集,里面包括了很多的正样本集合和负样本集合。
  • 获取人脸识别训练数据前面两篇已经实现打开摄像头并利用opencv内置分类器检测到了人脸,那么我们最终目标是实现一个特定人的人脸识别。参照:利用opencv打开摄像头/利用opencv内置分类器检测人脸本人当然是用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,823
精华内容 1,529
关键字:

人脸识别的训练