Quesion и код в конце Надеюсь, что этот вопрос будет рассмотрен здесь, а не стек TCS. Я пытаюсь выполнить алгоритмы в Turk и Pentland "Собственные функции для распознавания" .
На стр. 74 можно прочитать (последний абзац левой колонки):
Пусть обучение (...) Средняя грань множества определяется [*]
Где [*] - это уравнение, говорящее, что среднее лицо равно сумме изображений, деленных на него. Для использования этого equantion я создал python script с помощью OpenCV и numpy.
На стр. 75 показана диаграмма 1., которая должна представлять собой среднюю грань на рисунке 1. (стр. 74), и этого я пытаюсь достичь.
Как набор лиц, я использую все грани из Faces94. Когда я вычисляю традиционное среднее значение (1/M * sum), результат выглядит следующим образом:
который находится далеко от ожидаемого, в основном из-за этих странных "пятен". Однако, когда я вычисляю среднее значение, как было больше лиц, чем на самом деле (например, 1/(2 * M) * сумма), результат выглядит более точным:
Я думаю, что есть некоторая проблема в преобразовании int8 ↔ int, но я не могу это доказать. Если кто-нибудь может обнаружить какие-либо проблемы с кодом, пожалуйста, дайте мне знать, даже если это не решение.
Вопрос: что я делаю неправильно/что делать, чтобы получить лучшие результаты. Вот код:
import numpy as np
import glob
import cv2
from cv2 import imread
dir = "../images/faces94/**/**.jpg"
files = list(glob.iglob(dir, recursive=True))
img = np.zeros(imread(files[0],0).shape)
img = img.astype('int')
for i in range(len(files)):
img += imread(files[i],0).astype('int')
img = np.divide(img,len(files)*2) # HERE you can change it to np.divide(img,len(files)) in order to see bad result
img = np.mod(img,128)
img = img.astype(np.int8)
cv2.imshow("image", img)
cv2.waitKey(0)