图像中文描述问题融合了计算机视觉与自然语言处理两个方向,对图片输出一句话的描述。
描述句子要求符合自然语言习惯,点明图像中的重要信息,涵盖主要人物、场景、动作等内容。
数据集
数据来自《2017 AI Challenger》
数据集对给定的每一张图片有五句话的中文描述。数据集包含 30 万张图片,150 万句中文描述。
- 训练集:210,000 张
- 验证集:30,000 张
- 测试集 A:30,000 张
- 测试集 B:30,000 张
数据集下载,将 data 解压到 Image-Caption-master/data 中
链接:https://pan.baidu.com/s/1WcXkRODPrV82CQ47ko4bZw
提取码:dw00
模型结构
模型的输入数据由两个元素的列表构成,一个是文本特征,一个是图像特征。
输入的文本数据是 40 维向量,经过 Embedding 词嵌入层,文本被映射到 128 维向量空间,Embedding 层的作用是将稀疏的One-hot 向量编码成维数较低的矩阵,经过 LSTM 层与 TimeDistributed 包装过的 Dense 层,结果为 (40, 128) 的向量。
输入的图像数据是 ResNet50 提取出的 2048 维特征向量,经过 Embedding 层和 RepeatVector 扩充维度都,得到 (1,128) 的向量。
将两种特征通过 Concatenate 函数融合成 (41, 128) 维特征,经过第一个 Dropout 层防止过拟合,第一层 LSTM 网络,第二个Dropout 层,第二个 LSTM 网络,第三个 Dropout 层,最后通过 1024*17628 的全连接层输出 17628 维数据,维数对应预处理数据集得到的词库大小。
训练过程
模型通过 backward.py 文件计算反向传播并训练
使用 Adam 优化器,学习率为 0.00005
adam = keras.optimizers.Adam(lr=5e-5)
损失函数为 categorical_crossentropy 多分类对数损失
new_model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
训练过程中使用 TensorBoard 可视化训练曲线
tensor_board = keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=True)
使用以下方法优化模型训练过程:
使用 ModelCheckpoint 保存一个轮次中效果表现最好的模型训练模型
model_checkpoint = ModelCheckpoint(model_names, monitor='val_loss', verbose=1, save_best_only=True)
使用 EarlyStopping 函数防止过拟合
early_stop = EarlyStopping('val_loss', patience=patience)
使用 ReduceLROnPlateau 函数调整学习率,当评价指标不在提升时,减少的学习率为 lr = lr*factor
reduce_lr = ReduceLROnPlateau('val_loss', factor=0.1, patience=int(patience / 5), verbose=1)
模型训练时喂入的数据通过 data_generator 文件按批次生成,输入的 x 是图像的 2048 位特征和经过向量化处理的句子,期望得到的标签 y 是这句话的下一个字,如下图
模型输出效果
Seq2Seq 模型
所有输出端,都以一个通用的标记开头,以标记结尾,这两个标记也视为一个词/字;将输入 decoder,然后得到隐藏层向量,将这个向量与 encoder 的输出混合,然后送入一个分类器,分类器的结果应当输出 P,将 P 输入 decoder,得到新的隐藏层向量,再次与 encoder 的输出混合,送入分类器,分类器应输出 Q,依此递归,直到分类器的结果输出。这就是一个基本的 seq2seq 模型的解码过程,在解码的过程中,将每步的解码结果送入到下一步中去,直到输出位置。
Beam Search
Beam Search(集束搜索)是一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。这样减少了空间消耗,并提高了时间效率,但缺点就是有可能存在潜在的最佳方案被丢弃。
评价指标
BLEU 是一种通过计算候选译文和参考译文中n 元词共同出现的程度,来衡量候选句子与参考句子相似度的机器翻译度量方法。
ROUGE 是用来评价文本摘要算法的自动评价标准集,本次图像中文描述比赛主要采用其中的 ROUGE_L 作为评价标准。ROUGEL 是基于 LCS(Longest Common Subsequence)的一种测量方法。LCS 是序列 X 和序列 Y 的最大长度公共子序列的统称。
METEOR 是用来评价机器翻译输出的标准。该方法将候选语句和参考语句的词进行逐一匹配,METEOR 需要预先给定一组类似于WordNet 的同义词库,通过最小化对应语句中连续有序的块来得出。METEOR 的计算为对应候选语句和参考语句之间的准确率和召回率的调和平均。
CIDEr 通过对每个 n 元组进行 Term Frequency Inverse Document Frequency (TF-IDF) 权重计算,来衡量图像描述的一致性。
Attention注意力机制
Reference Paper: Show, Attend and Tell: Neural Image Caption Generation with Visual Attention https://arxiv.org/pdf/1502.03044v3