Бизнес-проблема: я хочу использовать свои мемы в качестве изображений реакции, которые превосходят обычные мемы сервисов встраивания GIF.

Решение: тегирование моих изображений на основе их содержания и создание базы данных метаданных мемов.

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

  1. Дедупликация изображений
  2. Обнаружение текста на изображениях
  3. Обнаружение объектов / классификация изображений
  4. Найдите лица и их эмоции

Каждый из этих шагов затрагивает сложные темы, например, насколько похожими могут быть два изображения, прежде чем они станут одинаковыми, как обнаружить белые символы на ярком фоне и МНОГОЕ ДРУГОЕ.

В этом посте я расскажу вам суть идеи.

Чтение/дедупликация

Изображения можно найти во многих форматах, но в Интернете доминируют jpeg и png. Тем не менее, расширение вводит в заблуждение, может ли изображение содержать альфа-канал или нет (RGBA, RGB) это все хорошо, пока вы не попытаетесь создать тензор из изображения и не вылетите, как Икар, с непонятным сообщением об ошибке. Итак, нулевой шаг преобразует все входящие изображения в RGB.

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

После чтения образа может начаться дедупликация. Чтобы найти только уникальные изображения, я использовал перцептивное хеширование из библиотеки ImageHash. Перцептивное хэширование означает: получение хеш-функции, которая может однозначно описать изображение с точки зрения характеристики. Изменение размера и простое преобразование — с помощью pHash можно обойти даже кадрирование, поскольку оно уменьшает изображение до более простой формы. Для более подробного ознакомления, пожалуйста, обратитесь к этой отличной статье.

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

текущие метаданные = { ‘image_pHash’: { ‘путь’: ‘путь/к/файлу’ } }

Чтение символов на изображении — OCR

После прочтения 3-канальных изображений я обнаружил, что для достижения наилучших результатов (на удивление большая часть OCR — оптического распознавания символов выполняется для книг с черными символами на белом фоне) изображения должны быть предварительно обработаны, чтобы алгоритмы были более точными. . Чтобы получить наилучшие результаты со средним мемом: белые символы и яркий фон, который может быть ярким и содержать много краев, которые могут сбить с толку OCR.

Есть также изображения, которые можно легко обработать, поэтому я добавил шаг, который выполняется без какой-либо предварительной обработки.

Шаги предварительной обработки для OCR

Чтобы получить максимальную отдачу от моего любимого OCR — tesseract, я выбрал четыре способа сделать изображение более читаемым. Весь процесс начинается с создания изображения в градациях серого с ядром 80 (изображение повторяется путем поиска локальных максимумов с адаптивным пороговым значением для более сглаженных градаций серого).

  1. Простая инверсия цвета
  2. Бинаризация по методу Оцу
  3. Адаптивный порог Гаусса + Otsu
  4. Преобразование ширины штриха

Остальная предварительная обработка будет предложена в части 2.