ну, вы могли бы сказать: Собака ловит фрисби. Кто-то другой может сказать: собака и ребенок играют с фрисби, вы абсолютно правы! Но представьте, что компьютер может произнести этот тип подписи для заданного входного изображения, так же легко, как человек? Это одна из самых интересных и сложных проблем в целом. Что ж, в этом блоге я собираюсь поделиться глубоким пониманием того, как мы можем очень легко решить эту проблему, используя достижения в области ИИ, которые у нас есть сегодня. Просто следуй за мной, пойдем.

Повестка дня:

  • Проблемы бизнеса
  • Бизнес-проблема к проблеме DL
  • Бизнес-ограничения/показатели
  • Показатели успеха
  • Сбор данных
  • Понимание данных
  • Очистка данных
  • Предварительная обработка данных — изображения, подписи
  • Подготовка данных
  • Необходимость в конвейере tf.data
  • Архитектура модели
  • Вывод с использованием Tensorflow Lite
  • Пришло время увидеть результаты
  • Модели Normal и Tensorflow Lite (сравнение после квантования)
  • Будущая работа и заключение
  • использованная литература

Бизнес-проблемы:

Во-первых, нам нужно понять, насколько важна эта проблема в реальных сценариях, давайте рассмотрим несколько приложений.

  • Беспилотные автомобили. Автоматическое вождение — одна из самых больших проблем, и если мы сможем правильно записать сцену вокруг автомобиля, это может дать импульс системе автономного вождения.
  • Помощь слепым — Мы можем создать продукт для слепых, который поможет им путешествовать по дорогам без чьей-либо поддержки. Мы можем сделать это, сначала преобразовав сцену в текст, а затем текст в голос. Оба теперь являются известными приложениями глубокого обучения. Обратитесь к этой ссылке, где показано, как исследования Nvidia пытаются создать такой продукт.
  • Камеры видеонаблюдения сегодня повсюду, но если мы сможем не только наблюдать за миром, но и создавать соответствующие подписи, то мы сможем поднимать тревогу, как только где-то происходит какая-то злонамеренная активность. Вероятно, это могло бы помочь снизить уровень преступности и/или несчастных случаев.
  • Автоматическое добавление субтитров может помочь сделать поиск изображений Google таким же хорошим, как поиск Google, поскольку тогда каждое изображение может быть сначала преобразовано в подпись, а затем поиск может выполняться на основе подписи.
  • В настоящее время существует множество приложений НЛП, которые извлекают информацию/резюме из заданных текстовых данных, эссе и т. д. Те же преимущества могут быть получены людьми, которые выиграют от автоматизированного анализа изображений.

От бизнес-проблемы к проблеме DL:

Данное изображение предсказывает описание изображения с использованием механизма CNN/Attention.

Бизнес-показатели:

BLEU расшифровывается как Bilingual Evaluation Understudy. Это алгоритм, который использовался для оценки качества машинно переведенного текста. Мы можем использовать BLEU для проверки качества сгенерированного заголовка.

  • BLEU не зависит от языка
  • Легко понять
  • Это легко вычислить.
  • Он лежит между [0,1]. Чем выше балл, тем выше качество подписи.
  • BLEU сообщает, насколько хороша наша предсказанная подпись по сравнению с предоставленными эталонными подписями.

Показатели успеха:

Мы должны сформулировать показатели успеха независимо от показателей оценки,

Итак, давайте подумаем с точки зрения пользователя: меня (пользователя) волнует только то, насколько осмысленным является описание и как быстро оно может вернуть описание после ввода изображения. Так что моя конечная цель перед производством — сохранить эти вещи.

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

Тут проблема с потреблением памяти и загрузкой процессора давайте подробнее

Возьмем одно изображение

Обратите внимание, что при моделировании мы просто передаем не только изображение, но и текст, давайте предположим, что у нас есть 6 слов для одного предложения, поэтому для одного изображения у нас есть 6 точек данных, чтобы получить окончательное сгенерированное описание изображения, и мы также знаем, что для одно изображение, у нас есть 5 предложений (см. набор данных), поэтому 6 * 5 = 30 предложений (одна точка данных изображения), например, вы можете предположить, сколько памяти потребляется для всего набора данных, чтобы загрузить в ОЗУ, даже если мы загрузим, система будет замедляться, поэтому, чтобы избежать этой проблемы, мы будем использовать концепцию tf.data, которую мы обсудим подробнее в более поздней части тематического исследования.

Ограничения для бизнеса/развертывания:

  • Требуется некоторая низкая задержка, потому что пользователи не могут долго ждать, чтобы увидеть результаты данного изображения.
  • Интерпретируемость очень важна, потому что почему слово генерируется из изображения?
  • Потребление памяти/процессора должно быть как можно меньше для лучшего поиска изображений или более быстрой обработки.
  • Сгенерированный текст должен быть семантически значимым для пользователя.
  • Мы не должны пропустить уникальные слова для данного изображения. если мы пропустим слово, богатство/значение изображения будет упущено.

Сбор данных:

Для этой задачи доступно множество наборов данных с открытым исходным кодом, таких как Flickr 8k (содержащий изображения 8k), Flickr 30k (содержащий изображения 30k), MS COCO (содержащий изображения 180k) и т. д.

Но для целей этого тематического исследования я использовал набор данных Flickr 8k, который вы можете загрузить, заполнив эту форму, предоставленную Университетом Иллинойса в Урбана-Шампейн. Кроме того, обучение модели с большим количеством изображений может оказаться невозможным в системе, которая не является высокопроизводительным ПК/ноутбуком.

Этот набор данных содержит 8000 изображений с 5 подписями к каждому (как мы уже видели в разделе «Введение», изображение может иметь несколько подписей, и все они актуальны одновременно).

Эти изображения раздвоены следующим образом:

  • Тренировочный набор — 6000 изображений
  • Набор для разработчиков — 1000 изображений
  • Набор тестов — 1000 изображений

Понимание данных:

Если вы скачали данные по ссылке, которую я предоставил, то вместе с изображениями вы также получите некоторые текстовые файлы, связанные с изображениями. Один из файлов — «Flickr8k.token.txt», который содержит название каждого изображения вместе с его 5 подписями.

Таким образом, каждая строка содержит ‹название изображения›#i ‹подпись›, где 0≤i≤4

то есть имя изображения, номер подписи (от 0 до 4) и фактическая подпись.

Изменил данные в этот формат для лучшего понимания

код для вышеуказанного формата

После этого я сохранил во фрейме данных данные под названием Data

удаление лишнего текста в данных подписи

Предварительная обработка данных — изображения:

Итак, у нас есть все изображения прямо сейчас,

Изображения — это не что иное, как ввод (X) в нашу модель. Как вы, возможно, уже знаете, любой ввод в модель должен быть задан в виде вектора.

Нам нужно преобразовать каждое изображение в вектор фиксированного размера, который затем можно передать в качестве входных данных для нейронной сети. Для этой цели мы выбираем переносное обучение с использованием модели InceptionV3 (Сверточная нейронная сеть), созданной Google Research.

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

Следовательно, мы просто удаляем последний слой softmax из модели и извлекаем вектор длины 2048 (узкие места) для каждого изображения следующим образом:

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

Предварительная обработка данных — Подписи:

Мы должны отметить, что подписи — это то, что мы хотим предсказать. Таким образом, в период обучения подписи будут целевыми переменными (Y), которые модель учится предсказывать.

Но предсказание всей подписи по изображению сразу не происходит. Мы предскажем заголовок слово за словом. Таким образом, нам нужно закодировать каждое слово в вектор фиксированного размера.

мы преобразуем подписи в числовую форму

Подготовка данных:

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

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

Теперь мы получим ответы на следующие вопросы: как сформулировать это как задачу контролируемого обучения? Как выглядит матрица данных? сколько точек данных у нас есть? и т. д.

Сначала нам нужно преобразовать оба изображения в соответствующий вектор признаков длиной 2048, как обсуждалось выше. Пусть «Изображение» будет векторами признаков.

Во-вторых, давайте создадим словарь, добавив два токена «startseq» и ​​«endseq» в оба из них: (Предположим, что мы уже выполнили основные шаги очистки)

Надпись: startseq дети в собачьем парке endseq

Дадим индекс каждому слову в словаре:

startseq-1, kids-2, at-3, dog-4, park-5, endseq-6

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

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

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

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

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

Необходимость конвейера tf.data:

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

Однако в нашем фактическом наборе данных для обучения у нас есть 6000 изображений, каждое из которых имеет 5 подписей. Всего получается 30000 изображений и подписей.

Даже если мы предположим, что каждая подпись в среднем состоит всего из 7 слов, это приведет к 30 000*7, т. е. 210 000 точек данных.

Размер матрицы данных = n*m

Где n-> количество точек данных (предполагается, что 210000)

И m-› длина каждой точки данных

Ясно, что m = длина вектора изображения (2048) + длина частичного заголовка (x).

m = 2048 + x

Но каково значение х?

Ну, вы можете подумать, что это 34, но нет, подождите, это неправильно.

Каждое слово (или индекс) будет отображено (встроено) в многомерное пространство с помощью одного из методов встраивания слов.

Позже, на этапе построения модели, мы увидим, что каждое слово/индекс сопоставляется с вектором длиной 200 с использованием слоя внедрения.

Теперь каждая последовательность содержит 34 индекса, где каждый индекс представляет собой вектор длины 200. Следовательно, x = 34*200 = 6800.

Следовательно, m = 2048 + 6800 = 8848.

Наконец, размер матрицы данных = 210000 * 8848 = 1858080000 блоков.

Вот даже если предположить, что один блок занимает 2 байта, то для хранения этой матрицы данных нам потребуется более 3 ГБ основной памяти.

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

чтобы избежать этого, у нас есть API, называемый преобразованием tf.data.Dataset.prefetch, который можно использовать для отделения времени, когда данные создаются, от времени, когда данные потребляются. В частности, преобразование использует фоновый поток и внутренний буфер для предварительной выборки элементов из входного набора данных до того, как они будут запрошены. Количество элементов для предварительной выборки должно быть равно (или, возможно, больше) количеству пакетов, потребляемых одним этапом обучения. Вы можете либо настроить это значение вручную, либо установить его

Так как же использование tf.data решает эту проблему?

Если вы знакомы с основами глубокого обучения, то должны знать, что для обучения модели на определенном наборе данных мы используем какую-то версию стохастического градиентного спуска (SGD), например Adam, Rmsprop, Adagrad и т. д.

При использовании SGD мы не рассчитываем потери для всего набора данных для обновления градиентов. Вместо этого на каждой итерации мы вычисляем потери для партии точек данных (обычно 64, 128, 256 и т. д.) для обновления градиентов.

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

Чтобы узнать больше о tf.data, пожалуйста, прочитайте здесь

Архитектура модели:

Это архитектура, основанная на внимании, здесь у нас есть кодировщик и декодер с вниманием, когда мы передаем изображение кодировщику, он возвращает векторы характеристик, позже на основе весов внимания он вычисляет вектор контекста, а затем на основе «startseq». + вектор контекста, декодер выведет первое слово, и на следующей итерации мы передадим сгенерированный вывод первого слова с вектором контекста, теперь он выведет второе слово, как это, мы будем продолжать предсказывать следующие слова до «endseq»

Вывод с использованием модели Tensorflow Lite:

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

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

Итак, до сих пор мы видели, как подготовить данные и построить модель. На последнем этапе этой серии мы поймем, как мы тестируем (делаем вывод) нашу модель, передавая новые изображения, то есть как мы можем создать подпись для нового тестового изображения.

как вычисляется вывод с помощью Beam Search:

давайте предположим, что размер словарного запаса: 1000

Итерация 1: сначала мы отправляем вектор признаков изображения и «startseq» в модель, она возвращает 3 верхних предсказанных слова (индекс луча = 3) с вероятностью, т.е. это означает, что было вычислено 30000 вероятностей, из которых, он предсказал топ3

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

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

подробнее о поиске луча смотрите в этом видео

это простая архитектура модели, для понимания цели

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

Реализация кода поиска луча:

Пришло время увидеть результаты:

Берем некоторые изображения из тестового набора

предполагаемая подпись: ребенок в розовом платье поднимается по лестнице в подъезде

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

предполагаемая подпись: мужчина лежит на скамейке, а его собака сидит рядом с ним

Модели Normal и Tensorflow lite (сравнение после квантования):

Будущие работы и заключение:

  • Работа с большими наборами данных.
  • Делаем гиперпараметр и меняем архитектуру модели.
  • Реализация механизма локального внимания.

Полный код для этого блога, пожалуйста, обратитесь к моей учетной записи GitHub

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



Ссылки: