예제 #1
0
void PCAKNN::train(const list<Interval> &intervals, const bool console_output) {
    if (intervals.size() == 0) return;
    projections.clear(); n = 0;

    width = intervals.front().start->face.cols;
    height = intervals.front().start->face.rows;

    list<Interval>::const_iterator itr;
    vector<Face>::const_iterator start, end;
    //add the number of images from all intervals
    for (itr = intervals.cbegin(); itr != intervals.cend(); itr++) {
        n += itr->Length();
    }

    Mat pca_matrix(static_cast<int>(n), width*height, data_type);
    int c = 0;
    for (itr = intervals.cbegin(); itr != intervals.cend(); itr++) {
        //for each image in the current interval
        for (start = itr->start, end = itr->end; start != end; start++, ++c) {
            if (console_output) printf("Preparing samples %d/%d\n", c + 1, n);
            //insert current image into pca_matrix
            Mat image_row = start->face.clone().reshape(1, 1);
            Mat row_i = pca_matrix.row(c);
            image_row.convertTo(row_i, data_type);//CV_64FC1 ?
            Face f; f.name = start->name;
            projections.push_back(f);//save the names for later
        }
    }

    if (console_output) printf("TRAINING...\n");
    //Perfrom principal component analysis on pca_matrix
    PCA pca(pca_matrix, Mat(), CV_PCA_DATA_AS_ROW, pca_matrix.rows);

    //extract mean/eigenvalues
    mean = pca.mean.reshape(1, 1);
    ev = pca.eigenvalues.clone();
    transpose(pca.eigenvectors, w);

    //project each face into subspace and save them with the name above for recognition
    for (unsigned int i = 0; i<n; ++i) {
        if (console_output) printf("Projecting %d/%d\n", i + 1, n);//project so subspace
        projections[i].face = subspaceProject(w, mean, pca_matrix.row(i));
    }
}
static MATRIX *
align_pca(MRI *mri_in, MRI *mri_ref) {
  int    row, col, i ;
  float  dot ;
  MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ;
  float  in_evalues[3], ref_evalues[3] ;
  double  ref_means[3], in_means[3] ;
#if 0
  MRI     *mri_in_windowed, *mri_ref_windowed ;

  mri_in_windowed = MRIwindow(mri_in, NULL, WINDOW_HANNING,127,127,127,100.0f);
  mri_ref_windowed = MRIwindow(mri_ref,NULL,WINDOW_HANNING,127,127,127,100.0f);
  if (Gdiag & DIAG_WRITE) {
    MRIwriteImageViews(mri_in_windowed, "in_windowed", 400) ;
    MRIwriteImageViews(mri_ref_windowed, "ref_windowed", 400) ;
  }
#endif

  if (!m_ref_evectors)
    m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ;
  if (!m_in_evectors)
    m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ;

  MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues,
                         ref_means, thresh_low);
  MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means,thresh_low);

  /* check to make sure eigenvectors aren't reversed */
  for (col = 1 ; col <= 3 ; col++) {
#if 0
    float theta ;
#endif

    for (dot = 0.0f, row = 1 ; row <= 3 ; row++)
      dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ;

    if (dot < 0.0f) {
      printf("WARNING: mirror image detected in eigenvector #%d\n",
             col) ;
      dot *= -1.0f ;
      for (row = 1 ; row <= 3 ; row++)
        m_in_evectors->rptr[row][col] *= -1.0f ;
    }
#if 0
    theta = acos(dot) ;
    printf("angle[%d] = %2.1f\n", col, DEGREES(theta)) ;
#endif
  }
  printf("ref_evectors = \n") ;
  for (i = 1 ; i <= 3 ; i++)
    printf("\t\t%2.2f    %2.2f    %2.2f\n",
           m_ref_evectors->rptr[i][1],
           m_ref_evectors->rptr[i][2],
           m_ref_evectors->rptr[i][3]) ;

  printf("\nin_evectors = \n") ;
  for (i = 1 ; i <= 3 ; i++)
    printf("\t\t%2.2f    %2.2f    %2.2f\n",
           m_in_evectors->rptr[i][1],
           m_in_evectors->rptr[i][2],
           m_in_evectors->rptr[i][3]) ;

  return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ;
}
예제 #3
0
static MATRIX *
compute_pca(MRI *mri_in, MRI *mri_ref) {
  int    row, col, i ;
  float  dot ;
  MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ;
  float  in_evalues[3], ref_evalues[3] ;
  double  ref_means[3], in_means[3] ;

  if (!m_ref_evectors)
    m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ;
  if (!m_in_evectors)
    m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ;

  if (binarize) {
    MRIbinaryPrincipleComponents(mri_ref, m_ref_evectors, ref_evalues,
                                 ref_means, thresh_low);
    MRIbinaryPrincipleComponents(mri_in,m_in_evectors,in_evalues,in_means,
                                 thresh_low);
  } else {
    MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means,
                           thresh_low);
    MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means,
                           thresh_low);
  }

  order_eigenvectors(m_in_evectors, m_in_evectors) ;
  order_eigenvectors(m_ref_evectors, m_ref_evectors) ;

  /* check to make sure eigenvectors aren't reversed */
  for (col = 1 ; col <= 3 ; col++) {
#if 0
    float theta ;
#endif

    for (dot = 0.0f, row = 1 ; row <= 3 ; row++)
      dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ;

    if (dot < 0.0f) {
      fprintf(stderr, "WARNING: mirror image detected in eigenvector #%d\n",
              col) ;
      dot *= -1.0f ;
      for (row = 1 ; row <= 3 ; row++)
        m_in_evectors->rptr[row][col] *= -1.0f ;
    }
#if 0
    theta = acos(dot) ;
    fprintf(stderr, "angle[%d] = %2.1f\n", col, DEGREES(theta)) ;
#endif
  }
  fprintf(stderr, "ref_evectors = \n") ;
  for (i = 1 ; i <= 3 ; i++)
    fprintf(stderr, "\t\t%2.2f    %2.2f    %2.2f\n",
            m_ref_evectors->rptr[i][1],
            m_ref_evectors->rptr[i][2],
            m_ref_evectors->rptr[i][3]) ;

  fprintf(stderr, "\nin_evectors = \n") ;
  for (i = 1 ; i <= 3 ; i++)
    fprintf(stderr, "\t\t%2.2f    %2.2f    %2.2f\n",
            m_in_evectors->rptr[i][1],
            m_in_evectors->rptr[i][2],
            m_in_evectors->rptr[i][3]) ;

  return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ;
}