Вопрос или проблема
Я создаю открытый фреймворк для обработки изображений. Одна из моих демонстрационных программ берет каталог фотографий, извлекает лица, группирует векторы лиц и создает HTML-галерею, показывающую каждого человека в куче.
У меня есть весь этот код, который работает. Я использую DBSCAN из Scikit-learn для кластеризации векторов лиц, и результаты меня не устраивают. Большинство лиц попадают в кластер -1 (не может быть кластеризовано) или кластер 0 (облако). Остальные кластеры лиц отличные.
Я пробовал различные диапазоны эпсилон, но результаты по-прежнему неудовлетворительные.
Я пробовал SpectralClustering, но это невероятно медленно. Я в основном перебираю разные значения n и смотрю, какие дают лучшие результаты.
ChatGPT говорит, что мне стоит использовать онлайн кластеризацию K-Means, также известную как “последовательная K-Means” (https://stackoverflow.com/questions/3698532/online-k-means-clustering).
Я ищу другие предложения, и у меня нет хорошей реализации последовательного K-Means. Учитывая, что у меня обычно 10 000 лиц, это может плохо масштабироваться.
MiniBatchKmeans
работает с большими наборами данных, итеративно обрабатывая мини-пакеты, а не весь набор данных.
Если вы сначала сможете сжать каждое изображение до меньшего представления, Birch
может хорошо подойти для вашего большого набора данных. Он был специально разработан для масштабируемости.
sklearn
имеет большую библиотеку примеров, включая это сравнение вышеупомянутых алгоритмов.
Есть вопрос, как установить количество кластеров. Вероятно, вам не нужно создавать кластер для каждого изображения, поэтому можно сказать, что в среднем может быть разумный кластер для каждых 50 похожих изображений. Таким образом, вы могли бы установить n_clusters
на n_training_samples // 50
и посмотреть, как это сработает.
Ответ или решение
Чтобы успешно кластеризовать векторы лиц по людям для неопределенного количества человек, необходимо рассмотреть несколько аспектов задачи и применить практические подходы к реализации алгоритма. В данной статье рассматриваются подходы к кластеризации, которые могут решить проблемы, с которыми вы столкнулись.
Проблема
Вы уже провели успешный опыт по извлечению лиц и созданию векторных представлений (embedding), однако нужная разбивка по кластеру не удаётся за счёт проблем с параметрами и алгоритмами. Алгоритмы, такие как DBSCAN, не выдают удовлетворительных результатов, а SpectralClustering требует слишком много ресурсов. Следовательно, необходимо исследовать альтернативные подходы к кластеризации.
Решение
-
MiniBatchKMeans
- Один из самых подходящих способов для кластеризации больших наборов данных — использование алгоритма
MiniBatchKMeans
из библиотеки Scikit-learn. Этот алгоритм оптимизирован для работы с большими наборами данных, поскольку использует мини-пакеты (mini-batches) для обновления центров кластеров, что значительно ускоряет процесс без значительной потери качества. - Рекомендуется предварительно определить количество кластеров. Например, при 10,000 лиц вы можете начать с вычисления
n_clusters = n_images // 50
, что даёт 200 кластеров.
from sklearn.cluster import MiniBatchKMeans kmeans = MiniBatchKMeans(n_clusters=200) labels = kmeans.fit_predict(face_embeddings)
- Один из самых подходящих способов для кластеризации больших наборов данных — использование алгоритма
-
Birch
Birch
(Balanced Iterative Reducing and Clustering using Hierarchies) может быть многим полезен для предварительной кластеризации больших наборов данных. Этот алгоритм создан для работы с масштабируемыми данными и может построить иерархическую структуру, которая помогает обнаруживать кластеры на разных уровнях.- Важно учитывать, что Birch требует исходных параметров, таких как
threshold
, который определяет, насколько близко должны располагаться точки, чтобы образовать кластеры.
from sklearn.cluster import Birch birch = Birch(threshold=0.5, n_clusters=None) labels = birch.fit_predict(face_embeddings)
-
Установка числа кластеров
- Как упоминалось ранее, попробуйте установить
n_clusters
равнымn_images // 50
, чтобы избежать ситуации, когда число кластеров очень высокое и приводит к каждодневному кластеру. - Экспериментируйте с диапазоном, увеличивая или уменьшая количество кластеров на основе визуальной оценки результатов.
- Как упоминалось ранее, попробуйте установить
-
Комбинированный подход
- Попробуйте скомбинировать методы, например, сначала примените
Birch
для предварительной классификации, а затем для более подробной кластеризации используйте тот жеMiniBatchKMeans
. Это может привести к более качественному разделению.
- Попробуйте скомбинировать методы, например, сначала примените
Визуализация и оценка результатов
Для проверки качества кластеризации создайте визуализацию, которая проиллюстрирует полученные кластеры с помощью методов, таких как t-SNE или PCA. Это поможет вам лучше оценить сегментацию лиц и скорректировать параметры, если это необходимо.
Заключение
При решении задачи кластеризации лиц обращайте внимание не только на выбор алгоритма, но и на настройку его параметров. Экспериментирование с MiniBatchKMeans
и Birch
, а также гибкое подход к определению числа кластеров помогут вам достичь наилучших результатов. Эти шаги, скорее всего, улучшат качество кластеризации лиц и значительно упростят создание вашей галереи.