Иметь больше, имея меньше… Легко! Этот метод машинного обучения поможет вам хранить больше информации в меньших размерах, имея лишь некоторые основы линейной алгебры. Тем самым мы восстановим человеческие лица из некоторых беспорядков в форме призраков.

Вам, должно быть, говорили, что независимые векторы создают пространства абстрактными способами. А теперь представьте себе по-настоящему. Все пространства образованы векторами, как и вещи внутри этих пространств. Некоторые из этих векторов влияют на некоторые вещи больше, чем другие. Другие могут быть незначительными, кроме них, и, возможно, нам не нужно знать о них, потому что мы в основном не заботимся и не хотим носить их проблемы с собой. Это именно то, что я покажу вам в этом посте с собственными гранями.

Наша основная тема - СПС. Это широко используемый алгоритм в самых разных предметах. Использование его на лицах делает его более понятным для человека, поэтому это одно из самых популярных приложений. Eigenfaces - это метод, который полезен для распознавания и обнаружения лиц путем определения дисперсии лиц в коллекции изображений лиц и использования этих дисперсий для кодирования и декодирования лица методом машинного обучения без полной информации, что снижает вычислительную и пространственную сложность. Несмотря на то, что впервые он был использован Терк и Пентланд в 1991 году и имеет ограничения по сравнению с сегодняшними технологиями, его основы по-прежнему очень полезны для новых практик.

Прежде чем перейти к реализации, я хотел бы дать вам небольшое введение в упомянутые основные концепции. Кроме того, вы можете найти полный сценарий и набор данных (небольшую часть от LFW_cropped), которые я использовал здесь.

Собственные векторы и собственные значения

Все мы знаем, как в точности работают собственные векторы и собственные значения. Может быть, не совсем, но мы слышали о них много раз. Вот объяснение меньшинству вроде меня, которое все время забывает.

У нас есть квадратная матрица A. Почти все векторы меняют направление, когда они умножаются на A, как мы и ожидали. Однако есть определенные векторы x, которые имеют то же направление, что и Ax. Су ... Угадайте, что? Это наши собственные векторы. Специальные ... Даже если они направлены в одном направлении, Ax и x все равно могут быть двумя разными векторами по своей величине. Вот знакомое равенство. Ax = λ x. Что делает эти два равными, так это λ, наш скаляр эквалайзера величин, собственное значение. Это расскажет нам, как изменился наш собственный вектор после умножения

Сверху можно понять, почему они полезны на практике. Для более глубокого понимания и, вероятно, признательности перейдите в Главу о собственных значениях и векторах Массачусетского технологического института.

Анализ главных компонентов (PCA)

Основная цель PCA - уменьшение размерности. Он имеет множество приложений для визуализации, извлечения функций, сжатия данных и т. Д. Идея заключается в том, чтобы линейно проецировать исходные данные на подпространство меньшей размерности, предлагая главным компонентам (собственным векторам) максимальную дисперсию проецируемых данных и / или минимальную ошибку искажения от проекция. В конце концов, оба приводят к одному и тому же результату, который является лучшей формулой реконструкции. Кстати, это подпространство называется главным подпространством.

Для расчетов максимизации дисперсии и минимизации ошибки искажения вы можете перейти к Конспекту лекций ANU о PCA. Кроме того, еще одно видео на YouTube под названием Анализ основных компонентов - Технологии Грузии - Машинное обучение помогло мне лучше понять концепции.

Реализация

Ok! Все готовы к реализации. Сначала мы импортируем необходимые библиотеки. Я полагаю, вы все знаете, для чего они нужны. Я сосредоточусь на объяснительной части алгоритмов. Если у вас есть другие вопросы по коду, оставьте ответ ниже.

Затем нам нужна функция для визуализации изображений из нашего набора данных в красивом виде. Вот.

Поместим его в наш набор данных lfwcrop_grey.zip. Здесь я беру только первую 1000 лиц из-за вычислительной сложности, но это не имеет значения. Если вы хотите получить аншлаг, сделайте это. Я также преобразовал изображения в массив numpy (в форме 1000, 64, 64) для обработки.

Таблица справа - это та, которую я буду использовать. Я в основном визуализировал первые 16 изображений из набора данных из 1000. Тот, который слева, был набором данных, который я собрал из исходного, когда я понятия не имел, что делаю. Тем не менее, я заметил, что для более ясного объяснения концепций лучше иметь больше данных.

Далее, следующим шагом будет определение PCA. Его аргументами являются X - векторы изображений и n_pc - количество главных компонентов. Напоминаем, что главные компоненты определяют ортонормированный базис, который может извлекать максимальную дисперсию исходных данных. В нашем случае его форма (1000, 4096), поскольку нам нужно было преобразовать изображения в векторы для PCA. Затем мы находим среднее значение и вычитаем его из наших данных, чтобы центрировать его вокруг начала координат. После этого нам нужно выполнить разложение по сингулярным значениям на центрированных данных, чтобы найти те основные компоненты, которые называются собственными гранями.

(SVD сложно получить, и он намного сложнее этого. Чтобы получить полезную иллюстрацию, перейдите к Видео MIT OpenCourseWare.)

Кстати, вот наше среднее лицо из всех 1000 лиц в наборе данных. Мы пытаемся найти черты, которые отличают людей от других. Я надеюсь, что теперь вычитание среднего лица из всех и максимизация дисперсии имеет больше смысла. Посмотри на это. Осторожно! Немного страшно, правда?

Следующие шаги - манипулировать нашими изображениями, чтобы они стали векторами, вызывали функцию PCA и манипулировали нашими собственными лицами, чтобы они снова стали изображениями.

Первый параметр с именем n_components определяет, сколько собственных граней мы хотим создать. Это наши основные компоненты, из которых мы будем восстанавливать наши данные, являющиеся человеческим лицом. Его изменение не изменит эту таблицу, если оно не будет меньше 16. Однако я могу гарантировать, что мы можем доверять только 50 изображениям, а не 1000, как это было вначале. (eigenfaces.shape = (50, 64, 64))

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

Ух ты! Не очень хорошо! Но не забывайте, что мы перешли от 1000 x 64 x 64 к 50 x 64 x 64. Таким образом, мы получаем в 20 раз меньше данных, чем раньше. Тем не менее, я никого не обману. Этого недостаточно. Понятно, что у нас еще есть некоторые важные компоненты, которые мы вынули. Посмотрим, что мы можем сделать. Я попробую использовать первые 100 компонентов.

Становится лучше, но все еще недостаточно. 250…

Это меня полностью удовлетворило. Только с четвертью того, что у нас есть, мы восстановили полностью различимые лица. Это совершенно бессмысленно, но на самом деле вы можете использовать 1000 компонентов eigenface и получить точные исходные результаты. Чтобы показать вам это, я проведу некоторые вычисления и пространственную сложность.

Все еще бежит ... Постой ... Уже идет.

Пришли результаты. Довольно мило !!!

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

Еще раз надеюсь, вам понравился мой пост. Не стесняйтесь задавать вопросы или оставлять отзывы.

Ваше здоровье,

Нев

Подпишитесь на больше контента и поддержки!

Свяжитесь со мной в Twitter и LinkedIn