1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Фильтрация картинок по их содержимому

Использование Google Vision для поиска картинок с определенным содержимым

  1. Support
    Начиная с версии 1.2.752 в A-Parser появилась полноценная поддержка Node.js. Это позволяет использовать очень большое количество различных модулей, значительно увеличивая возможности парсера. Множество различных сервисов предоставляют уже готовые модули, полностью реализующие их API. И об одном из таких сервисов пойдет речь в этой статье.

    Google Vision - это целый набор различных инструментов, которые основаны на "компьютерном зрении". В основе этой технологии лежит искусственный интеллект и машинное обучение. Более детально узнать о сервисе можно тут.

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

    А в конечном итоге мы получим список ссылок на картинки, где изображен космос или космические объекты:
    [​IMG]


    1. Получение доступа к Google Vision API
    Чтобы иметь возможность пользоваться данным сервисом, нужно предварительно пройти процедуру включения API. Подробная инструкция со скриншотами - под спойлером.
    • Открываем Консоль Google, авторизуемся и при необходимости создаем новый проект
      [​IMG]

    • В боковом меню выбираем API и сервисы - Библиотека и на открывшейся странице ищем Google Vision API
      [​IMG]

    • Нажимаем кнопку Включить и на открывшейся странице кликаем Создать учетные данные
      [​IMG]

      [​IMG]

    • Следуя инструкциям, создаем сервисный аккаунт, отмечаем все пункты, как на скриншотах ниже
      [​IMG]

      [​IMG]

    • В результате будет создан и загружен файл в JSON формате. Переименовываем его в credentials.json и сохраняем в каталог aparser/files/
    • Т.к. Vision API - это платный сервис (цены), то обязательно необходимо настроить платежный аккаунт. Для этого переходим в пункт Оплата и настраиваем платежный аккаунт для нашего проекта.
      [​IMG]

    • На этом получение доступа к API закончено.

    2. Создание JS парсера
    • Устанавливаем модуль в aparser/files/:
      Код:
      npm install --save @google-cloud/vision
    • Запускаем А-Парсер с параметром -newnode
    • Пишем JS парсер. Практически полностью готовый пример есть в документации по Google Vision, его нужно немного адаптировать для использования в А-Парсере. Например, добавить повторные попытки при определенных ошибках. В целом код парсера довольно простой:
      Код:
      const vision = require('@google-cloud/vision');
      let client;
      
      class Parser {
          constructor() {
              this.defaultConf = {
                  version: '0.1.3',
                  results: {
                      arrays: {
                          labels: ['Labels list', [
                              ['label', 'Label'],
                              ['score', 'Score']
                          ]]
                      }
                  },
                  results_format: "$labels.format('$label\\n')",
              };
          }
      
          init() {
              client = new vision.ImageAnnotatorClient({credentials: require('./files/credentials.json')});
          }
      
          async *parse(set, results) {
              results.labels = [];
              for(let a = 1; a <= this.conf.proxyretries; a++) {
                  let [result] = await client.labelDetection(set.query);
                  if(result.error) {
                      if(/We can not access the URL currently/.test(result.error.message)) continue;
                      this.logger.put(result.error.message);
                      results.success = 0;
                  } else {
                      const labels = result.labelAnnotations;
                      labels.forEach((label) => {
                          results.labels.push(
                              label.description,
                              label.score
                          )
                      });
                      this.logger.put(`Total found ${results.labels.length / 2} labels`);
                      results.success = 1;
                  }
                  break;
              }
      
              return results;
          }
      }
      • в init() инициализируем клиент, указав путь к ранее сохраненному файлу с учетными данными
      • в parse() делаем запросы, повторяя попытку в том случае, если сервис вернул ошибку загрузки картинки
      • в результат выводим массив меток
    • Пример результата работы для картинки:
      [​IMG]

      [​IMG]

    • Таким образом у нас получился полноценный JS парсер, который позволяет определять содержимое картинок с использованием Google Vision.
    3. Практическое применение
    Теперь перейдем к решению задачи, которую мы сформулировали в начале статьи.

    Сначала нужно вручную выбрать 1-2 картинки, подходящие под условия задачи и получить список их меток с помощью парсера, который мы создали ранее. Не обязательно из нашего набора картинок, можно просто найти в интернете нужную картинку. Это необходимо для того, чтобы определить, по каким меткам фильтровать все остальные картинки.
    Например, мы подобрали нужный нам список меток:
    Сформируем из него простое регулярное выражение и используем его для фильтрации картинок. Для этого создадим пресет с двумя фильтрами:
    [​IMG]
    • в первом фильтре массив меток фильтруется по необходимым нам меткам
    • во втором фильтре проверяется размер массива после первого фильтра, и если там больше 0 элементов, то выводится в результат начальный запрос, т.е. ссылка на картинку
    • готовый пресет доступен в каталоге: https://a-parser.com/resources/379/
    На выходе мы получим список ссылок, изображения по которым соответствуют условию задачи.

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

    Кроме получения меток, инструменты Google Vision предоставляют еще много возможностей, подробнее о которых можно почитать тут. Одной из самых интересных функций является распознавание текста, которое можно применять для разгадывания каптч или различной текстовой информации из картинок. Например, телефоны на Авито ;)
    aquatell и relay нравится это.