Подписи к изображениям с помощью Jupyter | Кодементор

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

Разница между классификацией изображений и подписями к изображениям

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

Вот результат, который мы получаем, используя классификацию изображений:
1.PNG

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

Вот результат, который мы получаем, используя подписи к изображениям:
2.PNG

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

Рекуррентные нейронные сети с длинной кратковременной памятью

Какими бы мощными ни были сверточные нейронные сети (CNN), они не так хорошо обрабатывают последовательные данные; однако они отлично подходят для непоследовательных задач, таких как классификация изображений.

Как работают CNN, показано на следующей диаграмме:
3.PNG

Рекуррентные нейронные сети (RNN), которые действительно являются современными, могут обрабатывать последовательные задачи. RNN состоит из CNN, где данные принимаются в последовательности.

Как работают RNN, показано на следующей диаграмме:
4.PNG

Данные, поступающие в последовательности (xi), проходят через нейронную сеть, и мы получаем результат (yi). Затем выходные данные передаются на другую итерацию и образуют цикл. Это помогает нам помнить данные, поступающие ранее, и полезно для последовательных задач данных, таких как распознавание аудио и речи, языковой перевод, идентификация видео и генерация текста.

Еще одна концепция, которая существует уже некоторое время и очень полезна, — это долговременная кратковременная память (LSTM) с RNN. Это способ обработки долговременной памяти и избежание простой передачи данных от одной итерации к другой. Он надежно обрабатывает данные итераций и позволяет нам эффективно обучать RNN.

Модель субтитров Google Brain im2txt

Google Brain im2txt использовался Google в документе MSCOCO Image Captioning Challenge 2015 года и станет основой кода для подписей к изображениям, который мы реализуем в этой статье.
Страницу Google GitHubTensorFlow можно найти по адресу

В исследовательском каталоге мы найдем файл im2txt, который использовался Google в документе MSCOCO Image Captioning Challenge 2015, который доступен бесплатно по адресу. Он подробно описывает RNN, LSTM и фундаментальные алгоритмы.

Мы можем проверить, как CNN используются для классификации изображений, а также узнать, как использовать LSTM RNN для фактического создания последовательных выходных заголовков.

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

В код были внесены некоторые изменения, которые упростят его запуск на Jupyter Notebook или включение в ваши собственные проекты. Предварительно обученная модель очень быстро обучается, используя только ЦП. На изучение того же кода без предварительно обученной модели могут уйти недели, даже на хорошем графическом процессоре.

Запуск кода субтитров на Jupyter

Давайте теперь запустим нашу собственную версию кода на Jupyter Notebook. Мы можем запустить собственный Jupyter Notebook и загрузить файл Section_1-Tensorflow_Image_Captioning.ipynb из репозитория GitHub (

Как только мы загрузим файл в блокнот Jupyter, он будет выглядеть примерно так:
5.PNG

В первой части мы собираемся загрузить некоторые важные библиотеки, включая math, os и tensorflow. Мы также будем использовать нашу удобную служебную функцию %pylab inline, чтобы легко читать и отображать изображения в блокноте.

Выберите первый блок кода:

# load essential libraries
import math
importos

importtensorflow as tf

%pylab inline

Когда мы нажмем Ctrl + Enter, чтобы выполнить код в ячейке, мы получим следующий вывод:
6.PNG

Теперь нам нужно загрузить базовый код TensorFlow/Google Brain, который мы можем получить из

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

# load Tensorflow/Google Brain base code
# 

from im2txt import configuration
from im2txt import inference_wrapper
from im2txt.inference_utils import caption_generator
from im2txt.inference_utils import vocabulary

Нам нужно сообщить нашей функции, где найти обученную модель и словарь:

# tell our function where to find the trained model and vocabulary
checkpoint_path="./model"
vocab_file="./model/word_counts.txt"

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

Папка содержит контрольную точку, word_counts.txt и предварительно обученную модель. Нам нужно убедиться, что мы используем эти файлы, и избегать использования других устаревших файлов, которые могут быть несовместимы с последней версией TensorFlow. Файл word_counts.txt содержит список словарей с количеством отсчетов из нашей обученной модели, которые понадобятся нашему генератору подписей к изображениям.

После того, как эти шаги будут выполнены, мы можем посмотреть на нашу основную функцию, которая будет генерировать для нас подписи. Функция может принимать входные данные в виде строки входных файлов (разделенных запятыми) или может быть просто одним файлом, который мы хотим обработать. Уровень детализации установлен на tf.logging.FATAL из различных доступных уровней ведения журнала, так как он сообщит нам, действительно ли что-то пошло не так:
7.PNG

В начальной части основного кода выполняем следующие шаги:

  1. Установите уровень детализации на tf.logging.FATAL.
  2. Загрузите нашу предварительно обученную модель.
  3. Загрузите оболочку вывода из нашего служебного файла, предоставленного Google.
  4. Загрузите нашу предварительно обученную модель из пути контрольной точки, который мы установили в предыдущей ячейке.
  5. Запустите функцию финализации:
# this is the function we'll call to produce our captions 
# given input file name(s) -- separate file names by a,
# if more than one

defgen_caption(input_files):
    # only print serious log messages
tf.logging.set_verbosity(tf.logging.FATAL)
    # load our pretrained model
    g = tf.Graph()
withg.as_default():
model = inference_wrapper.InferenceWrapper()
restore_fn = model.build_graph_from_config(configuration.ModelConfig(),
checkpoint_path)
g.finalize()

  1. Снова загрузите файл словаря из ячейки, которую мы ранее запускали:
    # Create the vocabulary.
vocab = vocabulary.Vocabulary(vocab_file)

  1. Предварительно обработайте имена файлов:
filenames = []
forfile_pattern in input_files.split(","):
  1. Выполните действие Glob:
filenames.extend(tf.gfile.Glob(file_pattern))
  1. Создайте список имен файлов, чтобы вы могли знать, над каким файлом работает генератор подписей к изображениям:
tf.logging.info("Running caption generation on %d files matching %s",
len(filenames), input_files)
  1. Создайте сеанс. Нам нужно использовать функцию восстановления, так как мы используем «`
    предварительно обученная модель:
withtf.Session(graph=g) as sess:
        # Load the model from checkpoint.
restore_fn(sess)

Код для этих шагов включен здесь:

#this is the function we'll call to produce our captions 
#given input file name(s) -- separate file names by a,
#if more than one

defgen_caption(input_files):
    # only print serious log messages
tf.logging.set_verbosity(tf.logging.FATAL)
    # load our pretrained model
    g = tf.Graph()
withg.as_default():
model = inference_wrapper.InferenceWrapper()
restore_fn = model.build_graph_from_config(configuration.ModelConfig(),
checkpoint_path)
g.finalize()

    # Create the vocabulary.
vocab = vocabulary.Vocabulary(vocab_file)

filenames = []
forfile_pattern in input_files.split(","):
filenames.extend(tf.gfile.Glob(file_pattern))
tf.logging.info("Running caption generation on %d files matching %s",
len(filenames), input_files)

withtf.Session(graph=g) as sess:
        # Load the model from checkpoint.
restore_fn(sess)

Теперь мы переходим ко второй половине основного кода. После восстановления сеанса выполняем следующие шаги:

  1. Загрузите caption_generator из нашей модели и словарь, хранящийся в объекте с именем генератор:
generator = caption_generator.CaptionGenerator(model, vocab)
  1. Составьте список подписей:
captionlist = []
  1. Переберите файлы и загрузите их в генератор с именем beam_search для анализа изображения:
for filename in filenames:
withtf.gfile.GFile(filename, "rb") as f:
image = f.read()
captions = generator.beam_search(sess, image)
  1. Распечатайте подписи:
print("Captions for image %s:" % os.path.basename(filename))
  1. Повторите, чтобы создать несколько надписей с уже установленной итерацией для модели:
for i, caption in enumerate(captions):
                # Ignore begin and end words.
sentence = [vocab.id_to_word(w) for w in caption.sentence[1:-1]]
sentence = " ".join(sentence)
print(" %d) %s (p=%f)" % (i, sentence, math.exp(caption.logprob)))
captionlist.append(sentence)
  1. Возврат субтитров:
returncaptionlist

Запустите код для создания функции.
См. следующий блок кода для полного кода:

    # Prepare the caption generator. Here we are implicitly using the default
    # beam search parameters. See caption_generator.py for a description of the
    # available beam search parameters.
generator = caption_generator.CaptionGenerator(model, vocab)

captionlist = []

for filename in filenames:
withtf.gfile.GFile(filename, "rb") as f:
image = f.read()
captions = generator.beam_search(sess, image)
print("Captions for image %s:" % os.path.basename(filename))
for i, caption in enumerate(captions):
                # Ignore begin and end words.
sentence = [vocab.id_to_word(w) for w in caption.sentence[1:-1]]
sentence = " ".join(sentence)
print(" %d) %s (p=%f)" % (i, sentence, math.exp(caption.logprob)))
captionlist.append(sentence)
returncaptionlist

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

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

testfile="test_images/dog.jpeg"

figure()
imshow(imread(testfile))

capts = gen_caption(testfile)

Когда мы запускаем наше первое тестовое изображение, dog.jpeg, мы получаем следующий вывод:
8.PNG

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

Анализ подписей к результатам

Давайте возьмем несколько примеров, чтобы проверить нашу модель. Когда мы запускаем football.jpeg, мы получаем следующий вывод:
9.PNG

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

Давайте попробуем еще один пример, giraffes.jpeg:
10.ПНГ

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

Давайте рассмотрим еще один пример, наушники.jpeg:
11.PNG

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

Возьмем последний пример, ballons.jpeg. Когда мы запускаем образ, мы получаем следующий вывод:
12.PNG

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

Запуск кода субтитров на Jupyter для нескольких изображений

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

Ниже приведен пример нескольких входных файлов:

input_files="test_images/ballons.jpeg,test_images/bike.jpeg,test_images/dog.jpeg,test_images/fireworks.jpeg,test_images/football.jpeg,test_images/giraffes.jpeg,test_images/headphones.jpeg,test_images/laughing.jpeg,test_images/objects.jpeg,test_images/snowboard.jpeg,test_images/surfing.jpeg"

capts = gen_caption(input_files)

Мы не будем отображать изображения, поэтому вывод будет включать только результаты. Мы видим, что некоторые результаты лучше, чем другие:

13.PNG

Это завершает запуск предварительно обученной модели подписи к изображению.

Надеюсь, вам понравилось читать эту статью и вы нашли ее полезной. Если вы хотите узнать больше о компьютерном зрении, Проекты компьютерного зрения с OpenCV и Python 3 настоятельно рекомендуется. Благодаря детальному проектному подходу, Проекты компьютерного зрения с OpenCV и Python 3 демонстрирует методы использования возможностей Python, OpenCV и TensorFlow для решения проблем в области компьютерного зрения, а также показывает, как создать приложение, которое может оценивать позы человека на изображениях.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *