Подпись к изображению – это процесс создания текстового описания изображения. Он использует как обработку естественного языка, так и компьютерное зрение для создания субтитров.
В этом проекте я реализовал функцию поиска изображений. Для функции поиска, во-первых, мы должны создать заголовок для изображений, присутствующих в нашей базе данных. Для создания титров мы рассмотрим учебник 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 было сложно.
- Понимание концепций нейронных сетей и глубокого обучения за короткий промежуток времени.
Использованная литература:
- https://hackernoon.com/begin-your-deep-learning-project-for-free-free-gpu-processing-free-storage-free-easy-upload-b4dba18abebc
- https://github.com/tensorflow/tensorflow/blob/r1.13/tensorflow/contrib/eager/python/examples/generative_examples/image_captioning_with_attention.ipynb
- https://www.tensorflow.org/tutorials/text/image_captioning
- https://towardsdatascience.com/image-captioning-in-deep-learning-9cd23fb4d8d2