Магия распознавания лиц по-прежнему удивляет нас каждый раз, когда мы смотрим научно-фантастический фильм об искусственном интеллекте, поэтому погружение в эту тему, работа над ней и писательство о ней преследовали цель раскрыть секрет этой завораживающей технологии.
После первой статьи [Обнаружение и распознавание лиц], где я обсуждал идею, лежащую в основе обнаружения и распознавания лиц, и то, как я смог работать над решением, которое может выполнить эту работу, используя 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:
- K-означает распознавание лиц: https://github.com/yasser1dev/Kmeans_FaceRecognition
- Средство извлечения лиц данных: https://github.com/yasser1dev/FaceRecognition