Мотивация

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

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

Стандартные API

Прежде всего, мне действительно нужно что-то создавать или я могу просто подключить существующий API? Возможно, неудивительно, что почти все стандартные API-интерфейсы корпоративного зрения не могут адекватно описать мем. Например, это автоматически сгенерированное описание API видения Azure для следующего мема:

"text": "Giorgio A. Tsoukalos with a blue headband",
"confidence": 0.3370714783668518

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

ML Image API от Google имеет несколько приятных компонентов, таких как определение черт лица и возможность автоматического извлечения текста за один вызов. Однако и в Google, и в AWS, похоже, отсутствует сервис для создания описаний изображений. Казалось, что в какой-то момент у Chrome была встроенная служба, которая в определенной степени делала это, но, насколько я могу судить, ее больше нет.

Итак, что было бы идеальным описанием этого мема? Я думал об этом в двух перекрывающихся категориях хорошо. 1. Как выглядит машиночитаемое (структурированные данные) представление мема:

"meme_format": "Ancient Aliens",
"meme_description": "a ufologist talking on the show ancient aliens",
"caption": "my sources? Aliens.",
"social_context": {
 "user": "jane",
 "platform": "twitter", 
 "contextual_topic": "Supreme court documents"
}

2. Как выглядит удобочитаемое (естественный язык) представление:

Мем «Древние пришельцы»: уфолог говорит о сериале «Древние пришельцы» с подписью «Мои источники? Инопланетяне." в связи с утечкой документов Верховного суда.

Создание API альтернативного текста мема с нуля

Разбираем проблему

Я разбил проблему на следующие куски

  1. Создание классификатора изображений специально для идентификации мемов
  2. Генерация титров
  3. Контекстуализация контента
  4. Объединяем все вместе в запрошенный сервис

1. Классификация мемов



Для моего классификатора изображений я изначально использовал этот набор данных, найденный на Kaggle, но он был относительно старым. Я также хотел что-то, что можно было бы запускать по расписанию для обновления модели. В итоге я использовал Imgflip’s API, документально подтвержденный, что он дает сотню или около того лучших мемов с сайта вместе с некоторой другой информацией, например количеством текстовых полей. Этот список довольно хорош, однако, если бы я производил его, я, вероятно, в конечном итоге занялся бы парсингом веб-страниц, поскольку API выглядит статично.

Получив этот список обратно, я использовал API поиска изображений Azure для сбора обучающих изображений, отформатировав условие поиска как memeTitle+'meme', что привело к довольно эффективному набору данных. Затем этот набор данных используется для обучения классификатора изображений resnet18.

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

2. Создание титров

Для оптического распознавания символов (OCR) я протестировал Tesseract (с этой оболочкой python) и EasyOCR. Оба довольно просты в использовании и могут более или менее использоваться в одном вызове функции. Однако после тестирования и сравнения я обнаружил, что Tesseract изо всех сил пытался извлечь что-либо последовательное из того, что я считал очень четкими изображениями. Похоже, что Tesseract в основном используется для сканирования документов и плохо справляется с визуально разнообразными изображениями. Есть некоторая предварительная обработка и настройка, которые вы можете использовать для получения более качественных результатов, но EasyOCR из коробки давал пригодные для использования результаты.

=== tesseract ===
mY t.
Af my
=== easyocr ===
Text: MY SOURCES? : Confidence: 0.9879976602333782
Text: ALIENS: : Confidence: 0.6021150088289337
Text: H : Confidence: 0.9971951867848396

К сожалению, мемы могут содержать много мусора. Для мема о древних инопланетянах у него есть водяной знак URL и логотип канала истории. Я протестировал использование некоторых инструментов от NLTK и spaCy, чтобы попытаться ограничить это. В целом, это очень сложно отфильтровать, так как в постах в социальных сетях очень мало правил грамматики/орфографии, которым нужно следовать. Вполне вероятно, что пользовательская модель сможет лучше фильтровать текст, но это не гарантия. Простой список стоп-слов можно использовать для фильтрации общих водяных знаков в качестве быстрого исправления.

Одна вещь, которая может улучшить вывод OCR, — это знание количества текстовых полей, которые обычно находятся в данном меме, которые включают данные API Imgflip. Другим может быть обучение пользовательской модели OCR на мемоподобном контенте, который на самом деле было бы довольно легко сгенерировать (обычно это просто текст, выделенный жирным шрифтом на изображении).

Попробуйте -› Нажмите, чтобы попробовать!

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

Код для демонстрации



Что дальше?

3. Создание лучшего описания через контекст поста

4. Объединение частей в полезный API