使用神经网络为图像生成标题

我们都知道,神经网络可以在执行某些任务时复制人脑的功能 。神经网络在计算机视觉和自然语言生成方面的应用已经非常引人注目 。
本文将介绍神经网络的一个这样的应用,并让读者了解如何使用CNNs和RNNs (LSTM)的混合网络实际为图像生成标题(描述) 。我们在这个任务中使用的数据集是流行的flickr 8k图像数据集,它是这个任务的基准数据
注意:我们将把数据集分割为7k用于训练,1k用于测试 。
我们将首先讨论在我们的混合神经网络中不同的组件(层)和它们的功能 。与此同时,我们还将研究使用Tensorflow、Keras和Python开发混合神经网络的实际实现 。
神经网络的总体结构让我们来看看我们将用于生成字幕的神经网络的总体架构 。

使用神经网络为图像生成标题

文章插图
 
简单地说,上述神经网络有3个主要组成部分(子网络),每个子网络都有一个特定的任务,即卷积网络(用于从图像中提取特征)、rstm(用于生成文本)和解码器(用于合并两种网络) 。
现在让我们详细讨论每个组件并了解它们的工作原理 。
图像特征提取器为了从图像中生成特征,我们将使用卷积神经网络,只需稍加修改 。让我们来看看一个用于图像识别的卷积神经网络 。
使用神经网络为图像生成标题

文章插图
 
一般的CNN分类模型有两个子网络
Feature Learning Network—负责从图像中生成Feature map的网络(多卷积和池化层的网络) 。
分类网络——负责图像分类的全连通深度神经网络(多稠密层、单输出层网络) 。
由于我们只对从图像中提取特征感兴趣,而对其分类不感兴趣,所以我们只对CNN的Feature Learning部分进行处理,这就是我们从图像中提取特征的方法 。
下面的代码可以用来从任何一组图像提取特征:
import tensorflow as tffrom keras.preprocessing import imageimport numpy as np# function to extract features from imagedef extract_image_features():model = tf.keras.models.Sequential()# adding first layers of convolution and pooling layers to networkmodel.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), input_shape=(90,90,3), padding="VALID", activation="relu"))model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu"))model.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))# adding second layers of convolution and pooling layers to networkmodel.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), padding="VALID", activation="relu"))model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation="relu"))model.add(tf.keras.layers.AveragePooling2D(pool_size=2, strides=1))# flattening the output using flatten layer, since the input to neural net has to be flatmodel.add(tf.keras.layers.Flatten())# model summarymodel.summary()return modelfor file in os.listdir(image_path):path = image_path + "//" + fileimg = image.load_img(path, target_size=(90, 90))img_data = https://www.isolves.com/sh/kj/2020-07-29/image.img_to_array(img)img_data = np.expand_dims(img_data, axis=0)img_data = preprocess_input(img_data)feature = extract_image_features.predict(img_data)feature = np.reshape(feature, feature.shape[1])任何人都可以使用上述代码构建自己的图像特征提取器,但有一个问题…
上面的模型太过简单,无法从我们的一组图像中提取出每一个重要的细节,因此会影响整个模型的性能 。此外,由于高性能gpu和系统的不可用性,使得模型过于复杂(具有大量神经元的多层密集层)也具有挑战性 。
为了解决这个问题,我们在Tensorflow中有非常流行的预训练CNN模型(VGG-16, ResNet50等,由不同大学和组织的科学家开发),可以用于从图像中提取特征 。记住,在使用输出层进行特征提取之前,要将它从模型中移除 。
下面的代码将让您了解如何使用Tensorflow中这些预先训练好的模型从图像中提取特征 。
import tensorflow as tffrom keras.preprocessing import imagefrom keras.Applications.resnet50 import ResNet50from keras.applications.resnet50 import preprocess_inputfrom keras.models import Model# load the ResNet50 Modelfeature_extractor = ResNet50(weights='imagenet', include_top=False)feature_extractor_new = Model(feature_extractor.input, feature_extractor.layers[-2].output)feature_extractor_new.summary()for file in os.listdir(image_path):path = image_path + "//" + fileimg = image.load_img(path, target_size=(90, 90))img_data = https://www.isolves.com/sh/kj/2020-07-29/image.img_to_array(img)img_data = np.expand_dims(img_data, axis=0)img_data = preprocess_input(img_data)feature = feature_extractor_new.predict(img_data)feature_reshaped = np.array(feature).flatten()


推荐阅读