В работе использовались следующие инструменты:
- keras
- scikit-learn
- numpy
- openCV
Для решения задачи было решено использовать нейросетевой подход вместе с традиционными методами кластеризации.
Таким образом, кластеризация изображений проходила в два этапа:
- Из изображений, переданных на вход алгоритма, с помощью нейронной сети извлекались признаки.
- К полученным признакам применялся алгоритм кластериации.
Для использования в качестве нейронной сети для извлечения признаков из изображений, были протестированы нейронные сети VGG16
, VGG19
, InceptionV3
и ResNet152
.
Лучшие результаты показали сети InceptionV3
и ResNet152
. При этом, при использовании ResNet152
качество кластеризации было незначительно выше, чем при использовании InceptionV3
, но при использовании сети InceptionV3
скорость работы алгоритма была значительно выше.
Таким образом, для выделения признаков из изображений была выбрана нейронная сеть InceptionV3
. Сеть использовалась без последнего полносвязного слоя, для того, чтобы извлекать признаки из изображения, но не проводить никаких классификаций.
Для кластеризации изображений применялся алгоритм MiniBatchKMeans
из пакета scikit-learn
. Он незначительно выигрывает в точности у стандартной версии KMeans
и работает значительно быстрее.
Для тестирования алгоритма использовалась выборка изображений кошек и собак, состоящая из 3999 объектов (2000 изображений собак, и 1999 изображений кошек).
Все вычисления, связанные с нейронными сетями, проводились на GPU.
Сводная таблица по наборам параметров (Нейронная сеть + кластеризатор):
Параметры | Выделение признаков, время | Кластеризация, время | Точность алгоритма |
---|---|---|---|
InceptionV3 + MiniBatchKMeans | 205.6c | 1.37c | 0.9675 |
InceptionV3 + KMeans | 204.5c | 27.3c | 0.9590 |
ResNet152 + MiniBatchKMeans | 251.47c | 3.95c | 0.9750 |
ResNet152 + KMeans | 247.43c | 57.7c | 0.9750 |
VGG19 + MiniBatchKMeans | 188.16c | 1.21c | 0.9602 |
VGG19 + KMeans | 187.94c | 14.98c | 0.9477 |
VGG16 + MiniBatchKMeans | 179.40c | 1.90c | 0.9610 |
VGG16 + KMeans | 180.02c | 15.49c | 0.9442 |
При работе с InceptionV3
и MiniBatchKMeans
алгоритм кластеризации допустил 130 ошибок.
Таким образом, точность алгоритма составила 0.9675.
Из 130 ошибок, 126 кошек были ошибочно отнесены в кластер к собакам, и 4 собаки были отнесены в кластер к кошкам.
Для того, чтобы запустить и проверить алгоритм на своей машине, клонируйте репозиторий командой:
git clone https://github.com/IHappyPlant/Images_Clustering.git
Перейдите в новую директорию командой:
cd images_clustering
Затем, установите требуемые пакеты для python командой:
pip3 install -r requirements.txt
Загрузите выборку для тестирования по ссылке:
https://drive.google.com/file/d/1YUqETBbxdMm4dM70h0xc5S-3hcPlmdCh/view?usp=sharing
Распакуйте скачанный архив в текущую папку.
Запустите алгоритм кластеризации командой:
python3 main.py --images ./data --clusters 2 --destination ./
В процессе работы алгоритм создаст папки в количестве, равном указанному числу кластеров. Названия папок будут соответствовать кластерам (например, 0 и 1). В созданные папки алгоритм запишет кластеризованные изображения.