Попытка сделать алгоритм распознавания лиц всегда дает неправильный ответ - PullRequest
0 голосов
/ 03 апреля 2019

В течение некоторого времени я пытался сделать алгоритм распознавания лиц, чтобы попытаться заставить его отобразить, является ли что-то человеческим лицом, если что-то является человеческим лицом, и это известное человеческое лицо, и какое из известных человеческих лиц является илиесли это не человеческое лицо, я пытаюсь сделать это, используя собственные значения матрицы, сформированной из матриц изображения в качестве вектора, отображаемого в виде первой строки, затем второй строки и т. д., получая среднее значение для каждой строки и вычитая ее из сделанной матрицыдля базы данных, а затем построение матрицы, нахождение ее собственных значений, а затем построение некоторых проекционных изображений.

Я попытался сделать это, используя 2 функции: eigenface_core, которая создает всю базу данных, и распознавание лиц, которое вычисляет расстояния.

Первая функция:

function [m A eigenfaces pr_img] = eigenface_core(database_path)
  files = dir(fullfile(database_path, '*.jpg'));
  T = [];
  m = [];
  for i = 1 : numel(files)
    image_matrix = double(rgb2gray(imread(fullfile(database_path, files(i).name))));
    image_matrix = image_matrix';

    SIZE = size(image_matrix);
    v = image_matrix(:);
    T(:, i) = v;
  endfor
  for i = 1 : size(T)
    m(i) = mean(T(i, :));
  endfor
  m = m';
  A = T - m;
  [V S] = eig(A'*A);
  lambda = diag(S);
  %[lambda, order] = sort(lambda, 'descend');
  %V = V(:, order);
  for i = 1 : size(lambda)
    if(lambda(i) < 1)
      V(:, i) = [];
    endif
  endfor
  eigenfaces = A*V;
  pr_img = eigenfaces'*A;
end

И вторая функция:

function [min_dist output_img_index] = face_recognition(image_path, m, A, eigenfaces, pr_img)
  image_matrix = double(rgb2gray(imread(image_path)));
  T = [];
  image_matrix = image_matrix';
  T = image_matrix(:);
  miu = mean(T);
  B = T - miu;
  %SIZE = size(image_matrix);
  %figure, imshow(reshape(B, SIZE));
  prtest_img = eigenfaces'*B;
  %disp(prtest_img);
  %imshow(prtest_img);
  min_dist = 9999999999999;
  for i = 1 : size(pr_img, 2)
    if (norm(pr_img(:, i) - prtest_img) < min_dist)
       min_dist = norm(pr_img(:, i) - prtest_img);
       output_img_index = i;
    endif
  endfor
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...