Как обучить масштабируемый классификатор с помощью FastAPI и SerpApi?

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

На этой неделе мы изучим объединенные возможности мощного API парсера результатов Google изображений SerpApi поверх быстрой веб-инфраструктуры FastAPI. Мы начнем с создания простого создателя базы данных изображений с методом синхронизации и начнем с него.

Что подразумевается под масштабируемым классификатором?

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

Минимальная структура папок FastAPI с пояснениями

  • datasets: В этой папке мы будем хранить изображения, которые будем загружать, хранить старую историю загрузок и разделять тестовую базу данных на базу данных поездов.
  • datasets -> test : Эта папка будет содержать внутри себя разные папки с именами запросов. Каждая папка с названием запроса будет содержать изображения, которые мы будем использовать.
  • datasets -> train : Не в рамках этой недели. Но по структуре это будет копия тестовой папки. Однако в каждой папке будет меньше изображений, чем в тестовой папке для учебных целей.
  • datasets -> previous_images.json : Этот файл будет содержать предыдущие ссылки, которые уже были загружены, чтобы избежать повторной загрузки одного и того же изображения.
  • add.py : Этот файл будет отвечать за сбор уникальных ссылок из SerpApi API-интерфейса Google Images Results Scraper, а затем загружать изображения в соответствующие места.
  • main.py : Основной файл для запуска сервера и определения маршрутов.
  • requirements.txt : Библиотеки, которые мы используем при запуске Serpapi. Вам нужно скачать их через pip.

Требования

Вот необходимые библиотеки, которые нам нужно добавить в файл requirements.txt.

Конфигурация приложения

FastApi, как следует из названия, позволяет ускорить процесс разработки с минимальными усилиями. Сейчас мы добавим два маршрута в main.py, один из которых приветствует пользователя, а другой принимает объект Query из конечной точки:

Query будет содержать объект базовой модели pydantic, который содержит параметры, используемые для получения различных результатов от SerpApi Google Images Scraper API. Класс Download будет контролировать весь процесс.

Что касается фонового процесса конечной точки add, давайте импортируем необходимые библиотеки в add.py:

from multiprocessing.dummy import Array : это автоматически добавляемая библиотека для многопроцессорных целей
from serpapi import GoogleSearch : это библиотека SerpApi для использования различных движков, поддерживаемых SerpApi. Вы можете найти больше информации на его Github Repo. Просто установите его с помощью команды pip install google-search-results.
from pydantic import BaseModel : Pydantic позволяет нам с легкостью создавать объектные модели.
import mimetypes : Mimetypes полезен для угадывания расширения загруженного элемента перед его записью в изображение. Это позволяет нам угадывать .jpg, .png и т. д. расширения файлов.
import requests : библиотека HTTP-запросов Python с самым крутым логотипом, когда-либо созданным для библиотеки.
import json : для чтения и записи JSON файлов. Это будет полезно для хранения старых ссылок изображений, которые мы уже скачали.
import os : Для записи изображений в локальное хранилище сервера или создания папок для различных запросов.

Давайте посмотрим, как содержать запросы, которые мы делаем к конечной точке add:

В этой модели Pydantic должны быть заданы параметры q и api_key. Однако, как я сказал в комментарии, вы можете жестко закодировать свой api_key с помощью данного метода, чтобы вам не приходилось вводить его при каждой попытке. Рассматриваемый api_key относится к ключу API SerpApi. Вы можете зарегистрировать бесплатную или платную учетную запись по нашей ссылке для регистрации здесь. Ваш уникальный ключ API можно найти на странице Управление ключом API.

SerpApi предоставляет кешированные результаты бесплатно. Это означает, что если поиск Apple закеширован, вы получите его бесплатно. Но если вы запросили Monkey, а его нет ни в нашем кеше, ни в созданном вами кеше, на него будет потрачен один кредит из вашей учетной записи.

google_domain : Какой домен Google Images будет очищен.
num : Количество результатов для данного запроса. По умолчанию это максимальное значение 100.
ijn : относится к номеру страницы. По умолчанию 0 Результаты будут начинаться с ijn x num и заканчиваться на (ijn x num) + num (Эти формулы предназначены для идеальных сценариев. Google может не предоставить столько данных для некоторых запросов.) Начальный индекс результата будет 0 по умолчанию, поскольку по умолчанию ijn равен 0.< br /> q : относится к запросу, который вы хотите сделать для расширения базы данных изображений.
api_key: относится к SerpApi ключу API.

Загрузка изображений

Объявим класс, в который мы будем загружать изображения:

self.query : Где мы храним запрос, сделанный в объекте класса
self.results : Где мы храним все ссылки на изображения, найденные в поиске картинок Google.
self.previous_results : Предыдущие загруженные или пропущенные ссылки на изображения избегайте повторной загрузки.
self.unique_results: уникальные ссылки, которые мы собрали из запроса, которые мы должны загрузить, чтобы расширить базу данных изображений.
self.new_results: сочетание предыдущих результатов и уникальных результатов, которые должны быть записаны в файл JSON.

Определим функцию, отвечающую за выполнение запросов к SerpApi:

Как видите, некоторые параметры, такие как engine и tbm, предопределены. Эти параметры отвечают за очистку SerpApi's Google Images Scraper API. Когда вы сделаете следующий запрос к SerpApi, он вернет JSON, содержащий различные части результата SERP:
https://serpapi.com/search?engine=google&google_domain=google.com&ijn=0&num=100&q=Apple
Это то, что, по сути, делает библиотека SerpApi Python. Результат будет примерно следующим:

Вот необработанный HTML-файл, который SerpApi может иметь смысл и использовать как JSON:

Вы также можете отправиться на игровую площадку SerpApi для большего визуального опыта и возможности настройки. Просто измените search? в ссылке на playground?:
https://serpapi.com/search?engine=google&google_domain=google.com&ijn=0&num=100&q=Apple

Нас интересуют original ключи images_results, так как они являются прямой ссылкой для скачивания изображений в оригинальном размере. Для получения дополнительной информации о движке вы можете перейти к Документации для SerpApi API Google Images Scraper и изучить дополнительные параметры.

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

Читаем файл previous_images.json и ищем в нем ключ previous. Затем последняя строка определяет уникальные результаты.

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

Но нам также нужно проверить, существует ли такой путь. Например, если наш запрос Apple, нам нужна такая папка, как datasets/test/apple. Если он не существует, мы создаем его.

Давайте посмотрим на выбор имени для загруженного изображения:

Мы дадим изображениям номера, чтобы имена оставались уникальными. Если файл еще не загружен, имя будет 0. Если есть, то имя будет представлять собой максимальное число, увеличенное на 1.

Давайте посмотрим на угадывание расширения и загрузку изображения по правильному пути:

Мы используем ссылку, чтобы получить изображение в виде байтов, а затем угадываем расширение изображения. Mimetype угадывает изображения `.webp` как `html`. Таким образом, мы защищаемся от этой ситуации и записываем образ, используя путь и расширение, которые мы сгенерировали ранее.

Теперь давайте посмотрим, как обновить файл JSON, который мы храним, для создания уникальных загрузок в будущем:

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

Мы помещаем туда небольшой блок try и exclude, чтобы убедиться в отсутствии непредвиденных ошибок в процессе запроса.

Запуск приложения с Uvicorn

FastApi можно развернуть на вашем локальном компьютере с помощью команды из пути вашего приложения:

uvicorn main:app --host 0.0.0.0 --port 8000

Вы увидите следующую подсказку:‌

INFO: Started server process [14880]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Это означает, что ваш сервер работает без проблем. Если вы отправитесь на localhost:8000 на своей локальной машине, вас встретит такая структура:

{"Hello":"World"}

Это главная страница приложения. Это будет отражено в следующих сообщениях в блоге.
Давайте перейдем к localhost:8000/docs:

FastApi позволяет автоматическую документацию и игровую площадку для приложения. Это полезно для нас, чтобы проверить наши конечные точки вручную. Это полезно для нас, чтобы вручную создать почтовый запрос к конечной точке add. Просто нажмите на кнопку с Create Query:

Далее нажмите на кнопку Try it out:

Измените параметр api_key на свой ключ API и измените q на запрос, с помощью которого вы хотите расширить базу данных.

Прежде чем мы нажмем «Выполнить», давайте взглянем на структуру папок:

Как видите папка datasets -> test пуста, и при выполнении она будет заполнена изображениями.

Нажимаем кнопку Execute в нашем браузере и видим изменения:

Вы автоматически увидите изменения в браузере и в терминале.

По завершении вы можете наблюдать ответ в своем браузере:

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

Полный код

main.py

add.py

requirements.txt

datasets/previous_images.json

Заключение

Приношу извинения читателям за опоздание с публикацией на один день и благодарю их за внимание. На этой неделе мы рассмотрели, как создать масштабируемую базу данных изображений с помощью SerpApi и FastApi и запустить приложение на Uvicorn. Две недели спустя мы рассмотрим, как добавить асинхронный процесс, внедрить Pytorch. Я благодарен замечательным людям SerpApi за этот шанс.

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