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

Таблица содержания

  • Введение в cAInvas
  • Источник данных
  • Визуализация данных
  • Извлечение функций и предварительная обработка данных
  • Модельное обучение
  • Введение в DeepC
  • Компиляция с DeepC

Введение в cAInvas

CAInvas - интегрированная платформа разработки для создания интеллектуальных периферийных устройств. Мы не только можем обучить нашу модель глубокого обучения с помощью Tensorflow, Keras или Pytorch, мы также можем скомпилировать нашу модель с его пограничным компилятором под названием DeepC для развертывания нашей рабочей модели на периферийных устройствах для производства. Модель Auto Image Captioning также разработана на cAInvas, и все зависимости, которые вам понадобятся для этого проекта, также предустановлены.

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

Источник данных

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

Визуализация данных

Для визуализации данных воспользуемся модулем Image библиотеки PIL. На этом этапе мы построим изображение и напечатаем заголовок, чтобы увидеть, совпадают ли подписи с изображением, а также получить интуитивное представление о том, с какими данными мы имеем дело. Вот изображение с подписью.

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

"1000268201_693b08cb0e" : startseq child in pink dress is climbing up set of stairs in an entry way endseq

Извлечение функций и предварительная обработка данных

Следующим шагом в конвейере является извлечение функций из изображения, которые мы передадим в нашу модель с автоматическими субтитрами. Мы не будем передавать массив numpy изображения, мы воспользуемся ResNet 50 для извлечения функций из изображений, а затем передадим его в нашу модель субтитров. Затем мы будем токенизировать наши подписи и заполнить текст подписи, и как только это будет сделано, мы создадим набор поездов и набор тестов.

Модельное обучение

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

Model: "functional_7"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
embedding_input (InputLayer)    [(None, 30)]         0                                            
__________________________________________________________________________________________________
dense_input (InputLayer)        [(None, 2048)]       0                                            
__________________________________________________________________________________________________
embedding (Embedding)           (None, 30, 128)      574336      embedding_input[0][0]            
__________________________________________________________________________________________________
dense (Dense)                   (None, 128)          262272      dense_input[0][0]                
__________________________________________________________________________________________________
lstm (LSTM)                     (None, 30, 256)      394240      embedding[0][0]                  
__________________________________________________________________________________________________
dropout (Dropout)               (None, 128)          0           dense[0][0]                      
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 30, 256)      0           lstm[0][0]                       
__________________________________________________________________________________________________
repeat_vector (RepeatVector)    (None, 30, 128)      0           dropout[0][0]                    
__________________________________________________________________________________________________
time_distributed (TimeDistribut (None, 30, 128)      32896       dropout_1[0][0]                  
__________________________________________________________________________________________________
concatenate_3 (Concatenate)     (None, 30, 256)      0           repeat_vector[0][0]              
                                                                 time_distributed[0][0]           
__________________________________________________________________________________________________
lstm_7 (LSTM)                   (None, 30, 128)      197120      concatenate_3[0][0]              
__________________________________________________________________________________________________
lstm_8 (LSTM)                   (None, 512)          1312768     lstm_7[0][0]                     
__________________________________________________________________________________________________
dense_5 (Dense)                 (None, 4487)         2301831     lstm_8[0][0]                     
__________________________________________________________________________________________________
activation_3 (Activation)       (None, 4487)         0           dense_5[0][0]                    
==================================================================================================
Total params: 5,075,463
Trainable params: 5,075,463
Non-trainable params: 0
____________________________________________________________________

Используемая функция потерь - это «категориальная кроссентропия», а оптимизатор - «Адам». Для обучения модели мы использовали Keras API с тензорным потоком на бэкэнде. Вот обучающий график для модели:

Введение в DeepC

Компилятор DeepC и структура логического вывода предназначены для включения и выполнения нейронных сетей с глубоким обучением путем сосредоточения внимания на функциях устройств малого форм-фактора, таких как микроконтроллеры, eFPGA, процессоры и другие встроенные устройства, такие как raspberry-pi, odroid, arduino, SparkFun Edge, risc -V, мобильные телефоны, ноутбуки x86 и arm, среди прочего.

DeepC также предлагает заранее подготовленный компилятор, создающий оптимизированный исполняемый файл на основе цепочки инструментов компилятора LLVM, специализированной для глубоких нейронных сетей с ONNX в качестве интерфейса.

Компиляция с DeepC

После обучения модель была сохранена в формате H5 с помощью Keras, поскольку она легко сохраняет веса и конфигурацию модели в одном файле.

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

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

Ссылка на блокнот cAInvas: https://cainvas.ai-tech.systems/use-cases/auto-image-captioning-app/

Кредит: Ашиш Арья