Семантический поиск изображений для статей с использованием Amazon Rekognition, базовых моделей Amazon SageMaker и сервиса Amazon OpenSearch

Семантический поиск изображений с использованием Amazon Rekognition, SageMaker и OpenSearch

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

У издателей может быть хранилище, содержащее миллионы изображений, и для экономии денег им необходимо иметь возможность повторно использовать эти изображения в разных статьях. Поиск изображения, которое наилучшим образом соответствует статье в таком масштабном хранилище, может быть трудоемкой, повторяющейся, ручной задачей, которую можно автоматизировать. Кроме того, это также зависит от правильной маркировки изображений в хранилище, которую также можно автоматизировать (см. историю успеха клиента Aller Media с KeyCore и AWS).

В этом посте мы демонстрируем, как использовать Amazon Rekognition, Amazon SageMaker JumpStart и Amazon OpenSearch Service для решения этой бизнес-задачи. Amazon Rekognition позволяет легко добавить возможность анализа изображений в ваши приложения без необходимости в знаниях машинного обучения (ML) и поставляется с различными API для решения таких задач, как обнаружение объектов, модерация контента, обнаружение и анализ лиц, распознавание текста и знаменитостей, которые мы используем в этом примере. SageMaker JumpStart – это сервис с низким уровнем кодирования, поставляемый с готовыми решениями, примерами ноутбуков и множеством современных моделей, предварительно обученных на общедоступных источниках и простых в развертывании в вашей учетной записи AWS с помощью одного щелчка. Эти модели были упакованы для безопасного и простого развертывания через API Amazon SageMaker. Новый SageMaker JumpStart Foundation Hub позволяет легко развертывать большие языковые модели (LLM) и интегрировать их в ваши приложения. OpenSearch Service – это полностью управляемый сервис, который упрощает развертывание, масштабирование и эксплуатацию OpenSearch. OpenSearch Service позволяет хранить векторы и другие типы данных в индексе и предлагает обширные возможности для поиска документов с использованием векторов и измерения семантической близости, которые мы используем в этом посте.

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

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

Обзор решения

Решение разделено на две основные части. В первой части вы извлекаете метаданные меток и знаменитостей из изображений с помощью Amazon Rekognition. Затем вы генерируете вложение метаданных с помощью LLM. Вы сохраняете имена знаменитостей и вложение метаданных в OpenSearch Service. Во второй основной части у вас есть API для запроса индекса OpenSearch Service для изображений с использованием интеллектуальных возможностей поиска OpenSearch для нахождения изображений, семантически сходных с вашим текстом.

В этом решении мы используем наши службы, основанные на событиях, Amazon EventBridge, AWS Step Functions и AWS Lambda, для оркестрации процесса извлечения метаданных из изображений с помощью Amazon Rekognition. Amazon Rekognition будет выполнять два API-вызова для извлечения меток и известных знаменитостей из изображения.

API обнаружения знаменитостей Amazon Rekognition возвращает несколько элементов в ответе. В этом посте вы будете использовать следующее:

  • Имя, идентификатор и URL-адреса – имя знаменитости, уникальный идентификатор Amazon Rekognition и список URL-адресов, таких как ссылка на IMDb или Википедию знаменитости для получения дополнительной информации.
  • MatchConfidence – оценка уверенности совпадения, которую можно использовать для управления поведением API. Мы рекомендуем применить подходящий порог для этой оценки в вашем приложении, чтобы выбрать предпочтительную точку работы. Например, установив порог в 99%, вы можете исключить больше ложных срабатываний, но можете упустить некоторые потенциальные совпадения.

Во втором API-вызове API обнаружения меток Amazon Rekognition возвращает несколько элементов в ответе. Вы будете использовать следующее:

  • Имя – название обнаруженной метки
  • Confidence – уровень уверенности в присвоенной метке обнаруженного объекта

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

В SageMaker JumpStart доступно множество моделей для генерации вложений. В этом решении вы используете встраивание GPT-J 6B от Hugging Face. Оно создает качественные вложения и имеет одну из лучших метрик производительности согласно результатам оценки Hugging Face. Еще один вариант – это Amazon Bedrock, который находится в предварительной версии, где вы можете выбрать модель Amazon Titan Text Embeddings для генерации вложений.

Вы используете предварительно обученную модель GPT-J из SageMaker JumpStart для создания вложения метаданных изображения и сохраняете его в виде вектора k-NN в индексе OpenSearch Service, вместе с именем знаменитости в другом поле.

Вторая часть решения заключается в том, чтобы вернуть пользователю топ-10 изображений, которые семантически похожи на их текст, будь то статья или синопсис телешоу, включая любых знаменитостей, если они есть. При выборе изображения для сопровождения статьи вы хотите, чтобы изображение соответствовало ключевым моментам из статьи. SageMaker JumpStart содержит множество моделей суммаризации, которые могут взять длинный текст и сократить его до основных моментов из оригинала. В качестве модели суммаризации вы используете модель Summarize от AI21 Labs. Эта модель предоставляет качественные резюме новостных статей, и исходный текст может содержать примерно 10 000 слов, что позволяет пользователю суммировать всю статью за один раз.

Для определения, содержит ли текст какие-либо имена, потенциально известных знаменитостей, вы используете Amazon Comprehend, который может извлекать ключевые сущности из текстовой строки. Затем вы фильтруете по сущности “Человек”, которую используете в качестве параметра поиска.

Затем вы берете суммированную статью и генерируете вложение, чтобы использовать его в качестве еще одного параметра поиска. Важно отметить, что вы используете ту же модель, развернутую на той же инфраструктуре, чтобы сгенерировать вложение статьи, как и для изображений. Затем вы используете точный алгоритм k-NN с оценочным скриптом, чтобы можно было искать по двум полям: именам знаменитостей и вектору, который содержит семантическую информацию о статье. См. этот пост, объясняющий возможности векторной базы данных Amazon OpenSearch Service, по масштабируемости оценочного скрипта и тому, как этот подход при работе с большими индексами может привести к высоким задержкам.

Пошаговая инструкция

Следующая диаграмма иллюстрирует архитектуру решения.

Следуя по нумерованным меткам:

  1. Вы загружаете изображение в бакет Amazon S3
  2. Amazon EventBridge прослушивает это событие, а затем запускает выполнение AWS Step function
  3. Step Function принимает входные данные изображения, извлекает метаданные метки и знаменитости
  4. Функция AWS Lambda берет метаданные изображения и генерирует вложение
  5. Затем функция Lambda вставляет имя знаменитости (если оно есть) и вложение в виде вектора k-NN в индекс OpenSearch Service
  6. Amazon S3 размещает простой статический веб-сайт, обслуживаемый дистрибуцией Amazon CloudFront. Пользовательский интерфейс (UI) позволяет аутентифицироваться в приложении с помощью Amazon Cognito для поиска изображений
  7. Вы отправляете статью или текст через пользовательский интерфейс
  8. Еще одна функция Lambda вызывает Amazon Comprehend, чтобы обнаружить имена в тексте
  9. Функция затем суммирует текст, чтобы получить ключевые моменты статьи
  10. Функция генерирует вложение суммированной статьи
  11. Затем функция ищет в индексе изображений OpenSearch Service любое изображение, соответствующее имени знаменитости, и k ближайших соседей для вектора с использованием косинусного сходства
  12. Amazon CloudWatch и AWS X-Ray предоставляют возможность наблюдения за всем рабочим процессом, чтобы оповещать вас о любых проблемах.

Извлечение и сохранение ключевой метаданных изображения

API Amazon Rekognition DetectLabels и RecognizeCelebrities предоставляют метаданные изображений – текстовые метки, которые можно использовать для создания вложения. В статье вы получаете текстовый ввод, который можно использовать для создания вложения.

Генерация и сохранение вложений слов

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

Вы также создаете вложение этой ново написанной статьи, чтобы вы могли искать OpenSearch Service ближайшие изображения к статье в этом векторном пространстве. Используя алгоритм k-ближайших соседей (k-NN), вы определяете, сколько изображений вернуть в результатах.

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

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

Обнаружение имен в статье

Вы используете Amazon Comprehend, сервис обработки естественного языка (NLP) на основе искусственного интеллекта, чтобы извлечь ключевые сущности из статьи. В этом примере вы используете Amazon Comprehend для извлечения сущностей и фильтрации по сущности “Person”, которая возвращает любые имена, которые может найти Amazon Comprehend в истории журналиста, всего за несколько строк кода:

def get_celebrities(payload):
    response = comprehend_client.detect_entities(
        Text=' '.join(payload["text_inputs"]),
        LanguageCode="en",
    )
    celebrities = ""
    for entity in response["Entities"]:
        if entity["Type"] == "PERSON":
            celebrities += entity["Text"] + " "
    return celebrities

В этом примере вы загружаете изображение в Amazon Simple Storage Service (Amazon S3), что запускает рабочий процесс, в котором вы извлекаете метаданные изображения, включая метки и любые знаменитости. Затем вы преобразуете извлеченные метаданные во вложение и сохраняете все эти данные в OpenSearch Service.

Резюмирование статьи и создание вложения

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

Модель Summarize от AI21 Labs очень проста в использовании без какого-либо запроса и всего нескольких строк кода:

def summarise_article(payload):
    sagemaker_endpoint_summarise = os.environ["SAGEMAKER_ENDPOINT_SUMMARIZE"]
    response = ai21.Summarize.execute(
        source=payload,
        sourceType="TEXT",
        destination=ai21.SageMakerDestination(sagemaker_endpoint_summarise)
    )
    response_summary = response.summary 
    return response_summary

Затем вы используете модель GPT-J для создания вложения

def get_vector(payload_summary):
    sagemaker_endpoint = os.environ["SAGEMAKER_ENDPOINT_VECTOR"]
    response = sm_runtime_client.invoke_endpoint(
        EndpointName=sagemaker_endpoint,
        ContentType="application/json",
        Body=json.dumps(payload_summary).encode("utf-8"),
    )
    response_body = json.loads((response["Body"].read()))
    return response_body["embedding"][0]

Затем вы ищете свои изображения в OpenSearch Service

Ниже приведен пример фрагмента этого запроса:

def search_document_celeb_context(person_names, vector):
    results = wr.opensearch.search(
        client=os_client,
        index="images",
        search_body={
            "size": 10,
            "query": {
                "script_score": {
                    "query": {
                        "match": {"celebrities": person_names }
                    },
                    "script": {
                        "lang": "knn",
                        "source": "knn_score",
                        "params": {
                            "field": "image_vector",
                            "query_value": vector,
                            "space_type": "cosinesimil"
                        }
                    }
                }
            }
        },
    )
    return results.drop(columns=["image_vector"]).to_dict()

Архитектура содержит простое веб-приложение для представления системы управления контентом (CMS).

Для примера статьи мы использовали следующий ввод:

“Вернер Фогельс любил путешествовать по всему миру на своей Тойоте. Мы видим, что его Тойота появляется во многих сценах, когда он едет и встречается с различными клиентами в их родных городах.”

Ни одно из изображений не имеет метаданных со словом “Тойота”, но семантика слова “Тойота” синонимична автомобилям и вождению. Поэтому с помощью этого примера мы можем продемонстрировать, как мы можем выйти за рамки поиска по ключевым словам и возвращать изображения, которые семантически похожи. На приведенном выше скриншоте пользовательского интерфейса под изображением показаны извлеченные метаданные Amazon Rekognition.

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

Заключение

В этой статье мы показали, как вы можете использовать Amazon Rekognition, Amazon Comprehend, SageMaker и OpenSearch Service для извлечения метаданных из ваших изображений, а затем использовать техники машинного обучения для их автоматического обнаружения с помощью поиска по знаменитостям и семантического поиска. Это особенно важно в издательской индустрии, где важна скорость получения свежего контента и публикации на нескольких платформах.

Для получения дополнительной информации о работе с медиа-ресурсами обратитесь к статье “Media intelligence just got smarter with Media2Cloud 3.0”.