Использование FiftyOne и Qdrant для создания классификаций в вашем наборе данных с использованием встраивания моделей

Встраивания нейронных сетей представляют собой низкоразмерное представление входных данных, которое дает начало множеству приложений. У вложений есть некоторые интересные возможности, поскольку они способны фиксировать семантику точек данных. Это особенно полезно для неструктурированных данных, таких как изображения и видео, поэтому вы можете кодировать не только сходство пикселей, но и некоторые более сложные взаимосвязи.

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

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

Qdrant — это векторная база данных с открытым исходным кодом, предназначенная для выполнения приблизительного поиска ближайшего соседа (ANN) в плотных нейронных встраиваниях, что необходимо для любой готовой к производству системы, которая, как ожидается, будет масштабироваться до больших объемов данных.

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

В этой статье мы собираемся загрузить набор данных MNIST в FiftyOne и выполнить классификацию на основе ANN, поэтому точки данных будут классифицироваться путем выбора наиболее распространенной метки достоверности среди K ближайших точек из нашего обучающего набора данных. Другими словами, для каждого тестового примера мы выберем K его ближайших соседей, используя выбранную функцию расстояния, а затем просто выберем лучшую метку путем голосования. Весь этот поиск в векторном пространстве будет выполняться с помощью Qdrant, чтобы ускорить процесс. Затем мы оценим результаты этой классификации в FiftyOne.

Монтаж

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

docker run -p “6333:6333” -p “6334:6334” -d qdrant/qdrant

После выполнения команды у нас будет запущен сервер Qdrant с HTTP API, открытым через порт 6333, и интерфейсом gRPC через 6334.

Нам также потребуется установить несколько пакетов Python. Мы собираемся использовать FiftyOne для визуализации данных вместе с их метками истинности и метками, предсказанными нашей моделью подобия вложений. Вложения будут созданы с помощью MobileNet v2, доступной в torchvision. Конечно, нам также нужно каким-то образом взаимодействовать с сервером Qdrant, и, поскольку мы собираемся использовать Python, qdrant_client является предпочтительным способом сделать это.

pip install fiftyone
pip install torchvision
pip install qdrant_client

Конвейер обработки

  • Загрузка набора данных
  • Создание вложений
  • Загрузка вложений в Qdrant
  • Классификация ближайших соседей
  • Оценка в FiftyOne

Загрузка набора данных

Есть несколько шагов, которые нам нужно предпринять, чтобы все шло гладко. Прежде всего, нам нужно загрузить набор данных MNIST и извлечь из него примеры поездов, так как мы собираемся использовать их в наших поисковых операциях. Чтобы сделать все еще быстрее, мы не будем использовать все примеры, а только 2500 образцов. Мы можем использовать FiftyOne Dataset Zoo, чтобы загрузить подмножество MNIST, которое нам нужно, всего одной строкой кода.

Давайте начнем с просмотра набора данных в FiftyOne App.

Создание вложений

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

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

Загрузка вложений в Qdrant

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

После создания встраивания мы можем просто начать общение с сервером Qdrant. Тогда будет полезен экземпляр QdrantClient, так как он включает в себя все необходимые методы. Давайте подключим и создадим набор точек, просто назовем их “mnist”. Размер вектора зависит от выходных данных модели, поэтому, если мы хотим поэкспериментировать с другой моделью в другой день, нам просто нужно будет импортировать другую модель, но остальное останется прежним. В конце концов, убедившись, что коллекция существует, мы можем отправить все векторы вместе с их полезной нагрузкой, содержащей их истинные метки.

Классификация ближайших соседей

Теперь, чтобы выполнить вывод по набору данных. Мы можем создать вложения для нашего тестового набора данных, но просто проигнорируем основную истину и попытаемся найти ее с помощью ANN, а затем сравним, совпадают ли оба. Давайте сделаем один шаг за раз и начнем с создания вложений.

Время для магии. Давайте просто пройдемся по образцам тестового набора данных и их соответствующим вложениям и воспользуемся операцией поиска, чтобы найти 15 ближайших вложений из обучающего набора. Нам также нужно будет выбрать полезные нагрузки, так как они содержат метки истинности, необходимые для поиска наиболее распространенной метки в окрестности определенной точки. Класс Python Counter будет полезен, чтобы избежать шаблонного кода. Наиболее распространенная метка будет храниться как “ann_prediction” для каждого тестового образца в FiftyOne.

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

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

Оценка в FiftyOne

Настало время для некоторых результатов! Давайте начнем с визуализации того, как работает этот классификатор. Мы можем легко запустить FiftyOne App, чтобы просмотреть правду, прогнозы и сами изображения.

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

precision    recall  f1-score   support

    0 - zero       0.87      0.98      0.92       219
     1 - one       0.94      0.98      0.96       287
     2 - two       0.87      0.72      0.79       276
   3 - three       0.81      0.87      0.84       254
    4 - four       0.84      0.92      0.88       275
    5 - five       0.76      0.77      0.77       221
     6 - six       0.94      0.91      0.93       225
   7 - seven       0.83      0.81      0.82       257
   8 - eight       0.95      0.91      0.93       242
    9 - nine       0.94      0.87      0.90       244

    accuracy                           0.87      2500
   macro avg       0.88      0.87      0.87      2500
weighted avg       0.88      0.87      0.87      2500

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

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

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

Вот и все! Мы создали классификационную модель ИНС, используя FiftyOne с Qdrant в качестве бэкенда для встраивания, поэтому поиск сходства между векторами может перестать быть узким местом, как это было бы в случае традиционной k-NN.

Попробуй сам!

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

Краткое содержание

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

Эта запись в блоге была сделана в сотрудничестве между командами Qdrant и Voxel51, в соавторстве с Kacper Łukawski.