Подпись к изображению – это процесс создания текстового описания изображения. Он использует как обработку естественного языка, так и компьютерное зрение для создания субтитров.

В этом проекте я реализовал функцию поиска изображений. Для функции поиска, во-первых, мы должны создать заголовок для изображений, присутствующих в нашей базе данных. Для создания титров мы рассмотрим учебник TensorFlow. Затем мы применим индексацию TF-IDF к подписям и реализуем функцию поиска. Набор данных, используемый для модели подписей к изображениям, представляет собой набор данных MS-COCO, который представляет собой набор данных изображений, легко доступных для всех.

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

Набор данных Flickr 30K содержит 30 000 изображений. Я взял 2000 изображений из этих 30 000 изображений набора данных Flickr 30K. Эти 2000 изображений были загружены в этот репозиторий, служащий файловым сервером.

Шаги для обучения модели:

  • Загрузите и извлеките набор данных MS-COCO
  • Сохраните подписи и имена изображений в векторах и выберите из них первые 30 000 подписей вместе с соответствующими изображениями для обучения нашей модели.
  • Используйте предварительно обученный InceptionV3 (в Imagenet) для классификации каждого изображения и извлечения функций.
  • Инициализируйте InceptionV3 и загрузите предварительно обученные веса Imagenet. После этого создайте модель tf.keras, в которой выходной слой является последним сверточным слоем в архитектуре InceptionV3.
  • Для предварительной обработки разметьте подписи и предварительно обработайте каждое изображение с помощью InceptionV3 и кэшируйте результат на диск. Для кэширования вывода в ОЗУ потребуется больше места в памяти, но это будет быстрее, а требуемые числа с плавающей запятой на изображение будут 8 * 8 * 2048.
  • Токенизируя заголовки, мы получим словарь всех уникальных слов в данных.
  • После этого мы ограничим размер словаря до 5000, чтобы сэкономить память. Затем мы заменим все остальные слова неизвестным токеном «UNK». А затем создайте отображение слова в индекс и индекса в слово.
  • Так как мы уже извлекли признаки из нижнего сверточного слоя InceptionV3, что дало нам вектор формы (8, 8, 2048). Итак, мы сжимаем это до формы (64, 2048).
  • Затем этот вектор передается через кодировщик CNN. А затем ГРУ наблюдает за изображением, чтобы предсказать следующее слово.
  • Теперь используйте принуждение учителя, чтобы определить следующий ввод декодера, а затем, наконец, вычислите градиенты и примените их к оптимизатору и выполните обратное распространение.
  • Таким образом, после обучения модели был открыт файл CSV, и с помощью цикла for тестовая часть модели была запущена в течение количества итераций, равного количеству изображений, которые были обработаны. проверено.
  • Затем подпись вместе с URL-адресом изображения была записана в файл .csv, а подписи были токенизированы, после чего были рассчитаны оценки TF-IDF предсказанной подписи и отображены первые 10 результатов вместе с изображением.

Код для повторения каждого изображения и создания файла .csv для изображения и сгенерированного заголовка:

import csv

headers = [['id', 'url', 'caption']]
with open('caption_img.csv', 'w') as csvFile:
  writer = csv.writer(csvFile)
  writer.writerows(headers)
csvFile.close()
with open('caption_img.csv', 'a') as csvFile:
  writer = csv.writer(csvFile)
  for i in range(200,2151):
    image_url = 'https://raw.githubusercontent.com/yashdani/ImgCap/master/' + str(i) + '.jpg'
    image_extension = image_url[-4:]
    image_path = tf.keras.utils.get_file('new_' + str(i) + image_extension, origin=image_url)

    result, attention_plot = evaluate(image_path)
    caption = ' '.join(result)
    print(caption)
    writer.writerows([[str(i), image_url, caption]])
csvFile.close()
print('csv created')

Вклады:

  • Написал код для создания файла .csv, для приема большого количества изображений и сохранения созданных подписей в файле .csv.
  • Создал набор данных примерно из 2000 изображений из набора данных Flickr, а затем предсказал подписи к этим изображениям.
  • Изначально время поиска было очень большим, и каждый поиск занимал много времени из-за повторных вычислений, поэтому я использовал файл .pkl(pickle), чтобы сэкономить время поиска.
  • Обновлен код моего текстового поиска, чтобы он выполнял поиск подписей вместе с изображениями.
  • Загружены изображения в репозиторий GitHub, что значительно упростило доступ к URL-адресу изображения.

Эксперименты:

  • Использовал CSV-файл набора данных Flickr, в котором уже были очень точные подписи к изображениям, затем я обучил модель и запустил все изображения на модели для создания подписи, подписи, сгенерированные для одних и тех же изображений, сильно отличались от подписей в исходном CSV Набор данных Flickr.
  • Пытался хранить изображения на нескольких облачных платформах для извлечения и отображения во внешнем интерфейсе и, наконец, остановился на Github, чтобы хранить все мои изображения и извлекать их для получения желаемых результатов.

Проблемы, с которыми столкнулись:

  • Обучение модели заняло много времени, около 3–4 часов. Даже на блокноте Google Colab.
  • Использование Google Colab само по себе было сложной задачей для людей, использующих его впервые.
  • Тайм-аут соединений с сервером приводил к неполному обучению модели и его приходилось перезапускать с первого раза. Эта проблема была решена с помощью расширения в Chrome, которое заменяет щелчок мышью.
  • Сложность создания набора данных с использованием только изображений. Извлечь все изображения с подписью в файл .csv с помощью colab было сложно.
  • Понимание концепций нейронных сетей и глубокого обучения за короткий промежуток времени.

Использованная литература:

Ссылка на сайт:

http://yashdani.pythonanywhere.com/