bool EigenfaceRecognizer::train() { isTrained = false; if(!loadTrainingImages()) return false; //do principal component analysis doPCA(); // project the training images onto the PCA subspace projectedTrainImage = cvCreateMat( numTrainedImages, numEigenvalues, CV_32FC1 ); int offset = projectedTrainImage->step / sizeof(float); for(int i = 0; i < numTrainedImages; i++) { //int offset = i * nEigens; cvEigenDecomposite( images[i], numEigenvalues, eigenVectors, 0, 0, averageImage, //projectedTrainFaceMat->data.fl + i*nEigens); projectedTrainImage->data.fl + i*offset); } isTrained = true; return isTrained; }
void learn() { int i; // load training data nTrainFaces = loadFaceImgArray("train.txt"); if( nTrainFaces < 2 ) { fprintf(stderr, "Need 2 or more training faces\n" "Input file contains only %d\n", nTrainFaces); return; } // do PCA on the training faces doPCA(); printf("Starting Matrix creation.\n"); // project the training images onto the PCA subspace projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1); printf("Entering for loop.\n"); for(i=0; i<nTrainFaces; i++) { cvEigenDecomposite( faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, projectedTrainFaceMat->data.fl + i*nEigens); } // store the recognition data as an xml file storeTrainingData(); }
/** * 顔を学習する */ void EigenFace::learn(char* trainFileName) { int i, offset; // load training data nTrainFaces = loadFaceImgArray(trainFileName); if( nTrainFaces < 2 ) { LOGE("Need 2 or more training faces\n" "Input file contains only %d\n", nTrainFaces); return; } // do PCA on the training faces doPCA(); // project the training images onto the PCA subspace projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 ); offset = projectedTrainFaceMat->step / sizeof(float); for(i=0; i<nTrainFaces; i++) { //int offset = i * nEigens; cvEigenDecomposite( faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, //projectedTrainFaceMat->data.fl + i*nEigens); projectedTrainFaceMat->data.fl + i*offset); } // store the recognition data as an xml file storeTrainingData(); }
////////////////////////////////// // learn() // void faceRecognition::learn() { AfxMessageBox("训练人脸识别模型"); int i, offset; // load training data nTrainFaces = loadFaceImgArray(learnFileListPath); if( nTrainFaces < 2){ CString S; S.Format("Need 2 or more training faces\nInput file contains only %d\n", nTrainFaces);AfxMessageBox(S); return; return ; } // do PCA on the training faces doPCA(); // project the training images onto the PCA subspace projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 ); offset = projectedTrainFaceMat->step / sizeof(float); for(i=0; i<nTrainFaces; i++){ //int offset = i * nEigens; cvEigenDecomposite( faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, //projectedTrainFaceMat->data.fl + i*nEigens); projectedTrainFaceMat->data.fl + i*offset); } // store the recognition data as an xml file storeTrainingData(); }
/** * 頂点を、順番にcollapseしていく。 * ただし、当該頂点から出るエッジの長さが短いものから、優先的にcollapseしていく。 */ void MTT::collapse(RoadGraph* roads, float w1, float w2, float w3, std::vector<RoadGraph*>* sequence) { qDebug() << "collapse start."; PCA pca; doPCA(roads, pca); RoadVertexDesc bdry1_desc, bdry2_desc; findBoundaryVertices(roads, bdry1_desc, bdry2_desc); while (true) { int count = 0; sequence->push_back(GraphUtil::copyRoads(roads)); float min_metric = std::numeric_limits<float>::max(); RoadVertexDesc min_v_desc1; // to be collapsed to the other one RoadVertexDesc min_v_desc2; RoadEdgeIter ei, eend; for (boost::tie(ei, eend) = boost::edges(roads->graph); ei != eend; ++ei) { if (!roads->graph[*ei]->valid) continue; count++; RoadVertexDesc src = boost::source(*ei, roads->graph); RoadVertexDesc tgt = boost::target(*ei, roads->graph); if (bdry2_desc == src || bdry2_desc == tgt) { int k = 0; } float metric = getMetric(roads, src, tgt, w1, w2, w3, pca); if (metric < min_metric) { min_metric = metric; min_v_desc1 = src; min_v_desc2 = tgt; } metric = getMetric(roads, tgt, src, w1, w2, w3, pca); if (metric < min_metric) { min_metric = metric; min_v_desc1 = tgt; min_v_desc2 = src; } } if (count <= 1) break; // 頂点min_v_desc1を、min_v_desc2へcollapseする GraphUtil::collapseVertex(roads, min_v_desc1, min_v_desc2); } qDebug() << "collapse done."; }
// Train from the data in the given text file, and store the trained data into the file 'facedata.xml'. void learn(char szFileTrain[252]) { int i, offset; // load training data printf("Loading the training images in '%s'\n", szFileTrain); nTrainFaces = loadFaceImgArray(szFileTrain); printf("Got %d training images.\n", nTrainFaces); if( nTrainFaces < 2 ) { fprintf(stderr, "Need 2 or more training faces\n" "Input file contains only %d\n", nTrainFaces); return; } // do PCA on the training faces doPCA(); // project the training images onto the PCA subspace projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 ); offset = projectedTrainFaceMat->step / sizeof(float); for(i=0; i<nTrainFaces; i++) { //int offset = i * nEigens; cvEigenDecomposite( faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, //projectedTrainFaceMat->data.fl + i*nEigens); projectedTrainFaceMat->data.fl + i*offset); } // store the recognition data as an xml file storeTrainingData(); // Save all the eigenvectors as images, so that they can be checked. if (SAVE_EIGENFACE_IMAGES) { storeEigenfaceImages(); } }
void learn_eigenfaces() { int i, offset; nTrainFaces = loadFaceImgArray("train_eigen.txt"); if (nTrainFaces < 2) { fprintf(stderr, "Need more than 2 faces to train\n"); return; } doPCA(); projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1); offset = projectedTrainFaceMat->step / sizeof(float); for(i=0;i<nTrainFaces;i++) { cvEigenDecomposite(faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, projectedTrainFaceMat->data.fl + i*nEigens); } storeTrainingData_eigenfaces(); }
void learn() { int i, offset; numberOfTrainingFaces = loadfaceImageArray("/etc/pam_face_authentication/facemanager/face.key"); doPCA(); projectedTrainFaceMat = cvCreateMat( numberOfTrainingFaces, numberOfEigenVectors, CV_32FC1 ); offset = projectedTrainFaceMat->step / sizeof(float); for (i=0; i<numberOfTrainingFaces; i++) { //int offset = i * numberOfEigenVectors; cvEigenDecomposite( faceImageArray[i], numberOfEigenVectors, eigenVectorArray, 0, 0, averageTrainingImage, //projectedTrainFaceMat->data.fl + i*numberOfEigenVectors); projectedTrainFaceMat->data.fl + i*offset); } storeTrainingData(); }
void MTT::findBoundaryVertices(RoadGraph* roads, RoadVertexDesc &v1_desc, RoadVertexDesc &v2_desc) { PCA pca; doPCA(roads, pca); QVector2D evector; evector.setX(pca.evectors.at<double>(0, 0)); evector.setY(pca.evectors.at<double>(1, 0)); float min_score = std::numeric_limits<float>::max(); float max_score = -std::numeric_limits<float>::max(); int min_pt_id, max_pt_id; for (int i = 0; i < pca.score.rows; i++) { float score = pca.score.at<double>(i, 0); if (score < min_score) { min_score = score; min_pt_id = i; } if (score > max_score) { max_score = score; max_pt_id = i; } } int count = 0; RoadVertexIter vi, vend; for (boost::tie(vi, vend) = boost::vertices(roads->graph); vi != vend; ++vi) { if (!roads->graph[*vi]->valid) continue; if (count == min_pt_id) { v1_desc = *vi; } if (count == max_pt_id) { v2_desc = * vi; } count++; } }
//学习阶段代码 void learn() { int i, offset; //加载训练图像集 nTrainFaces = loadFaceImgArray("train.txt"); if( nTrainFaces < 2 ) { fprintf(stderr, "Need 2 or more training faces\n" "Input file contains only %d\n", nTrainFaces); return; } // 进行主成分分析 doPCA(); //将训练图集投影到子空间中 projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 ); offset = projectedTrainFaceMat->step / sizeof(float); for(i=0; i<nTrainFaces; i++) { //int offset = i * nEigens; cvEigenDecomposite( faceImgArr[i], nEigens, eigenVectArr, 0, 0, pAvgTrainImg, //projectedTrainFaceMat->data.fl + i*nEigens); projectedTrainFaceMat->data.fl + i*offset); } //将训练阶段得到的特征值,投影矩阵等数据存为.xml文件,以备测试时使用 storeTrainingData(); }