Создание базы данных помеченных изображений N1QL с использованием Couchbase, FastAPI и SerpApi

Это часть серии сообщений в блогах, посвященных внедрению искусственного интеллекта. Если вас интересует предыстория этой истории или ее развитие:

На предыдущих неделях мы изучали, как автоматически создать свой собственный набор данных изображений с помощью SerpApi's Google Images Scraper API и использовали эти изображения для автоматического обучения сети с помощью простого объекта команды, который будет передан в FastAPI. На этой неделе мы улучшим метод создания базы данных, используя Couchbase в качестве сервера хранения, и покажем, как получить случайный элемент из заданного подмножества.

Конфигурация Couchbase

Для этого проекта нам понадобится сервер сообщества Couchbase и Python SDK для Couchbase. Вы можете найти актуальную информацию на Couchbase Docs.

В этом руководстве мы будем использовать CouchBase версии 7.1.0 для Debian 11:

Вы можете получить к нему доступ по этой ссылке

После того, как вы установите его, определите имя пользователя и пароль на сервере назначения (в моем случае http://kagermanov:8091), вас встретит такая панель управления:

Это означает, что вы успешно развернули сервер.
Те из вас, кто хочет остановить фоновый процесс в Linux, могут ввести sudo systemctl stop couchbase-server, чтобы остановить сервер по своему желанию.

Перейдите к Buckets в меню слева и добавьте новое ведро под названием images с помощью кнопки ADD BUCKET:

Обязательно выберите объем оперативной памяти, который не приведет вашу локальную систему в бешенство. я

Теперь вам нужно добавить область и коллекцию в это ведро с помощью кнопки Scopes & Collections:

Добавьте область с именем image и внутри нее коллекцию с именем labelled_image:

Затем перейдите на площадку, где вы можете выполнить запрос вручную, и выполните следующее:

Наконец, убедитесь, что вы установили Couchbase Python SDK через pip, и все настроено для нашего сервера.

Автоматический сборщик изображений

Давайте создадим отдельный файл в нашем проекте с именем add_couchbase.py. Это будет переработанная версия add.py, которая автоматически собирала изображения по определенному запросу.
Вот требования к ней:

Чтобы разбить их для их конкретного варианта использования:

Давайте определим базовую модель pydantic для изображения, которое будет загружено на сервер хранения Couchbase:

id будет уникальным uuid изображения для изображения, которое будет вызываться вручную в будущем.
classification — это запрос, переданный движку SerpApi.
base64 будет строковым представлением изображения для воссоздания во время сеанса обучения.
uri будет представлять собой URL-адрес, с которого мы извлекаем изображение.

Давайте инициализируем нашу базу данных Storage в классе:

Вот функция для вставки изображения на сервер хранения с уникальным идентификатором:

doc в этом контексте представляет объект Document, внутри которого мы храним изображение для загрузки на сервер Couchbase.

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

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

Эта функция принимает link, являющуюся ссылкой на изображение, и cs, являющуюся классификатором изображения. Если изображение с такой же ссылкой еще не существует в нашем хранилище, оно возвращает None. Причина, по которой мы не запрашиваем уникальность всей базы данных, проста. Во-первых, это не будет эффективно в долгосрочной перспективе. Во-вторых, одни и те же изображения могут иметь разную классификацию. Представьте логотип Apple, the company. Это также Apple, the fruit. Если мы классифицируем между Apple Logo и Blackberry Logo, и если изображение находится только в классификации Apple, есть шанс, что модель не сможет интерпретировать. Такой подход может создать незаметные дубликаты изображений с разными классификациями, но в долгосрочной перспективе он окажется полезным.
Вот пример следующего ручного запроса, который, как мы знаем, уже существует на сервере Couchbase:

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

Вот еще один пример запроса размера изображений Orange на сервере хранения:

Теперь давайте определим функцию, которая случайным образом выбирает для нас число. Для этого мы определим случайное целое число вне области запроса, который мы будем подавать. Но мы определим это случайное число с помощью предыдущей созданной нами функции:

Вот пример запроса со случайным числом 37, которое находится в диапазоне от 0 до 103 (из 104 изображений апельсина):

У нас есть все, что нам нужно на эту неделю и запись в блоге на следующую неделю. Давайте переопределим то, что мы уже определили. Пидантическая модель для объекта Query, которую мы передаем в конечную точку:

Опять же, ключ API, упомянутый здесь, является вашим уникальным ключом API для SerpApi. Доступ к нему можно получить через Api Key page.

Вот новое определение класса Download. Мы можем опустить некоторые части, чтобы сохранить уникальность, и добавить новые, такие как объект базы данных.

В функции реализации SerpApi’s Google Images API изменений нет. Однако позвольте мне еще раз повторить один удивительный факт. Если запрос, который вы ищете, кэширован, вы можете получить его бесплатно.

Давайте определим еще одну функцию для загрузки и изображения и возврата его в виде объекта Document:

Затем мы определяем функцию для вставки объектов Document, которые мы получили из предыдущей функции. Проверяем на уникальность ссылки для уменьшения дубликатов и в этой функции:

Здесь мы можем перебрать все ссылки, собранные из SerpApi’s Google Images Scraper API, и загрузить их на наш сервер хранения Couchbase:

Теперь, когда у нас все готово, давайте определим функцию add_couchbase.py в нашем main.py:

Сбор изображений и их хранение с классификациями

Давайте применим все, что мы сделали, на практике. Запустите сервер с помощью следующей команды:

а затем перейдите к localhost:8000/docs, чтобы попробовать конечную точку /add_to_db/ со следующим телом запроса:

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

Если мы запросим базу данных еще до ее завершения, мы увидим, что записи с классификационной меткой Mango обновляются. Вот команда для него:

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

Заключение

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

Я благодарен пользователю за внимание и всяческую поддержку Блестящих людей SerpApi. В ближайшие недели мы изучим использование асинхронной обработки и сопрограмм, чтобы сократить время отклика действий. Если вас интересуют подобные уроки, не стесняйтесь подписаться на Блог SerpApi или следите за нами на том носителе, где вы нас нашли. Ваша поддержка является основным фактором в создании таких руководств.

Первоначально опубликовано на https://serpapi.com 15 июня 2022 г.