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

После первой статьи [Обнаружение и распознавание лиц], где я обсуждал идею, лежащую в основе обнаружения и распознавания лиц, и то, как я смог работать над решением, которое может выполнить эту работу, используя Dlib C ++ и openCV, теперь я хочу объяснить последнее решение, над которым я работал, для достижения распознавания лиц с использованием алгоритма машинного обучения, который является кластеризацией K-средних с Python.

Идея решения

Изучив некоторые основы машинного обучения, я был одержим желанием применить полученные знания в реальной проблеме, чтобы увидеть реальное влияние машинного обучения на то, как мы можем решать некоторые сложные проблемы.

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

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

Алгоритм без учителя: кластеризация K-средних

  • Неконтролируемое обучение

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

  • Алгоритм кластеризации K-средних

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

Распознавание лиц с использованием алгоритма K-средних

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

Чтобы обучить алгоритм, я сделал 75 снимков разных лиц 5 футболистов (Месси, М. Салах, К. Роналду, Суарес и Неймар), почти 15 лиц с разным положением для каждого игрока, и передал их в средство извлечения данных о лицах. чтобы извлечь данные и сохранить их в базе данных.

На картинке выше показаны данные лиц Роналду перед преобразованием в формат, пригодный для обучения алгоритма.

После преобразования упорядоченных данных лиц конечный результат представляет собой матрицу 75x128, а на рисунке выше показан первый столбец.

Теперь, когда у нас есть все данные, мы можем визуализировать их, чтобы увидеть, как это выглядит:

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

  • Обучение алгоритма

Самая важная вещь в кластеризации K-средних - это выбор числа кластеров «K», этот выбор, если он сделан неправильно, может плохо повлиять на результаты, поэтому существует метод, называемый «метод функции локтя». это может определить оптимальное количество кластеров, но в нашем случае количество кластеров, которое мы хотим, ясно, и это количество людей, которых мы хотим распознать, которое равно 5 (Месси, Суарес, К. Роналду, Неймар и М. Салах ).

Kmean = KMeans(n_clusters=5)
Kmean.fit(data)

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

centers=np.array(Kmean.cluster_centers_)

На картинке ниже представлены 5 наших центроидов:

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

labels=Kmean.labels_

После реорганизации результатов мы получили следующий фрейм данных:

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

  • Узнай новое лицо

Теперь, когда мы пометили все точки данных, мы можем распознать новое лицо на основе 5 найденных ранее кластеров.

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

labels = Kmean.predict(new_data)

new_data представляет лицо данных C.Ronaldo, и мы хотим увидеть, в какой кластер будет помещен, и, конечно же, new_data - это неизвестные данные для алгоритма, и сам по себе должен знать, где находится кластер, который содержит точки данных, аналогичные нашим новые_данные.

И, как мы видим, алгоритм поместил новую точку данных в кластер номер 3, который является кластером Роналду, так что теперь наш алгоритм почти способен распознавать лица 5 игроков.

Заключение

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

Github: