Введение:

Автоматическое извлечение атрибутов из изображения - эпохальная задача в компьютерном зрении, потому что необходимо точно предсказать не только объекты, но также их атрибуты и действия, участвующие в создании сцены. Это можно рассматривать как проблему классификации по нескольким меткам, поскольку она требует предсказания атрибутов данного изображения. В этой статье мы будем использовать сеть Hypotheses-CNN-Pooling (HCP), чтобы изучить атрибуты, которые производят оценку вероятности для каждого атрибута, который может содержать изображение, и возьмем самые популярные в качестве прогнозируемых атрибутов.

Мы будем использовать набор данных «Flickr8K» для простоты, чтобы построить «модель извлечения атрибутов для изображений», чтобы выявить атрибуты из изображения.

Давайте начнем!

Импорт пакетов:

Основные пакеты, используемые в этой статье, - это NLTK и Tensorflow 2.0 Keras. Помимо этого мы также используем Pandas, Numpy и Matplotlib для обработки и визуализации данных.

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

Вы можете загрузить набор данных Flickr8k отсюда https://machinelearningmaster.com/develop-a-deep-learning-caption-generation-model-in-python/.

После извлечения zip-файлов из загруженного набора данных вы найдете следующие папки.

  • Flickr8k_Dataset: он содержит в общей сложности 8092 изображения в формате JPEG различных форм и размеров. Из них 6000 используются для обучения, 1000 - для проверки и 1000 - для тестового набора данных.
  • Flickr8k_text: содержит текстовые файлы с описанием train_set, test_set и dev_set. Flickr8k.token.txt содержит 5 подписей для каждого изображения, то есть всего 40460 подписей.

Загрузка данных:

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

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

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

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

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

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

  • Лемматизация:

Лемматизация - это процесс приведения слова к его корневой форме, принадлежащей языку. Поскольку лемматизация возвращает реальное слово языка, оно используется там, где необходимо получить допустимые слова. Мы используем Wordnet Lemmatizer, который использует базу данных Wordnet для поиска лемм слов. Чтобы гарантировать правильность корневых слов, к которым оно принадлежит, а также фильтровать слова, содержащие только определенные pos-теги, такие как NOUN, ADJ, VERB и ADV. Затем мы передаем соответствующий pos-тег для слов вместе с текстом описания в функцию лемматизатора.

  • Стемминг:

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

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

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

  • image_name, которое представляет имя файла изображения с полным путем к файлу
  • caption представляет собой соответствующий текст описания (требуется только для справки)
  • caption_lem представляет атрибуты, полученные из описания.

Подготовьте токенизатор:

Поскольку размер словаря атрибутов для данного корпуса велик, мы используем только 1000 самых распространенных атрибутов в наборе обучающих данных. Мы используем функцию FreqDist () NLTK, чтобы получить первые 1000 наиболее распространенных атрибутов в наборе обучающих данных и инициализировать токенизатор с этими отфильтрованными атрибутами для кодирования текста и передачи его в модель.

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

Построение модели:

Мы будем использовать предварительно обученную модель Inception-V3 для обработки изображений, которая предоставляется в Tensorflow-Keras и классификации по нескольким меткам на основе Hypotheses-CNN- Объединение (HCP) сети для изучения атрибутов.

Inception-V3:

Inception-v3 - это широко используемая модель распознавания изображений, которая, как было показано, достигает точности более 78,1% в наборе данных ImageNet. Модель является кульминацией многих идей, разработанных несколькими исследователями на протяжении многих лет. Он основан на оригинальной статье: «Переосмысление начальной архитектуры компьютерного зрения Szegedy, et. al. Сама модель состоит из симметричных и асимметричных строительных блоков, включая свертки, среднее объединение, максимальное объединение, объединение, выпадение и полностью связанные слои. Batchnorm широко используется в модели и применяется к входам активации. Убыток рассчитывается с помощью Softmax ».

Схема высокого уровня модели показана ниже:

Гипотезы-CNN-Pooling (HCP)

Гипотезы-CNN-Pooling - это гибкая глубокая инфраструктура CNN, в которой в качестве входных данных берется произвольное количество гипотез объектных сегментов, затем с каждой гипотезой связывается общий CNN, и, наконец, выходные данные CNN из разных гипотез агрегируются с макс. объединение для получения окончательных прогнозов по нескольким меткам. Для получения дополнительных сведений см. Исходный документ: HCP: гибкая структура CNN для классификации изображений с несколькими метками »автора Wei, et. al.

Теперь мы рассмотрим этапы построения модели.

Мы можем модифицировать модель Inception-V3 в соответствии с нашими потребностями. Мы удалим слой softmax и прикрепим следующие слои.

  • Выпадающие слои с 0,5 процента
  • Пакетная нормализация
  • Сигмовидный активационный слой с единицами размера словаря атрибутов

Важно отметить, что для задачи классификации с несколькими метками мы используем «Сигмоид» в качестве функции активации для выходного слоя вместо функции «Softmax», чтобы вероятности каждого класса не зависели от вероятностей других классов, чтобы используйте пороговое значение (0,5) для получения нескольких меток в качестве результата и используйте «binary_crossentropy» в качестве функции потерь для оценки потерь модели. С другой стороны, для задачи классификации по нескольким классам мы используем «Softmax» в качестве функции активации для выходного слоя и «категориальную_кросцентропию» в качестве функции потерь модели.

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

Подготовьте генератор данных:

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

Сначала мы получаем вектор закодированных атрибутов из списка атрибутов. Ниже определяется функция get_attribute_vector_from_caption (), которая считывает атрибуты (caption_lem) и возвращает вектор закодированных атрибутов с помощью функции text_to_matrix () токенизатора.

Затем мы используем функцию from_tensor_slices () tf.data.Dataset, чтобы подготовить генератор данных для набора данных для обучения и проверки. Ниже определяется функция load_image_attribute (), которая использует функции модуля изображения TensorFlow для загрузки и декодирования изображения и изменения размера изображения с целевым размером (299, 299, 3). Затем с помощью функции preprocess_input в TensorFlow Keras inception_v3 обработайте и подготовьте тензор изображения для загрузки его в предварительно обученную модель Inception-V3.

Обучение модели:

Теперь давайте обучим модель с помощью набора данных обучения и проверки для 10 эпох с размером пакета 100. Для обучения модели мы используем обратный вызов контрольной точки модели, чтобы автоматически сохранять веса модели лучшей модели. Затем мы используем обратный вызов ранней остановки, чтобы остановить обучение модели, когда нет улучшения в потерях проверки для 5 непрерывных эпох, и обратный вызов ReduceLROnPlateau для автоматического снижения скорости обучения, когда нет улучшения потери проверки для 2 непрерывных эпох.

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

Прогнозы модели:

Теперь, когда модель обучена, мы сделаем некоторые прогнозы и оценим результаты. Сначала мы предварительно обрабатываем и получаем тензор изображения для данного файла изображения с помощью функций load_image (). Затем мы прогнозируем атрибуты с учетом тензора изображения. На основе прогнозов мы рассматриваем атрибуты с вероятностью 10 лучших и распечатываем результаты.

Давайте посмотрим на прогнозируемые результаты и оценим их с помощью основных атрибутов истинности.

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

Резюме:

В этой статье мы раскрыли этапы извлечения атрибутов из изображений и то, как мы можем использовать набор данных подписи к изображениям для построения модели классификации с несколькими метками на основе метода Hypotheses-CNN-Pooling. В частности, мы лемматизировали и ограничивали текст описания изображения для получения атрибутов. Затем мы настроили предварительно обученную модель Inception-V3 и обучили модель обнаруживать атрибуты для данных изображений. Наконец, мы увидели, как предсказать атрибуты изображения, и оценили результаты.

На этом мы подошли к концу статьи.

Для получения полного кода вы можете скачать блокнот ipython здесь.

Ваше здоровье!!!