社会焦点

技术大咖教你用TensorFlow为图片添加字幕

字号+ 作者: 来源: 2017-05-13

技术大咖教你用TensorFlow为图片添加字幕,在学tensorflow之前要学python吗,tensorflow基于lstm实现对话生成,gpu lstm tensorflow keras,获取tensorflow的元素个数,用tensorflow训练自己的图片

  编者注:本文来自微信公众号“OReillyData”(ID:OReillyData),本文相应的Python代码和iPython notebook都在GitHub上,我们邀请你去访问。

  如何使用TensorFlow来构建和训练一个图片字幕生成器:

  图片字幕生成模型结合了近年来计算机视觉和机器翻译方面的进步,通过使用神经网络来生成现实图片的字幕。对于一个给定的输入图片,神经图像字幕模型被训练来最大化生成一个字幕的可能性。可以被用来产生新颖的图像描述。例如,下面是用MS COCO数据集训练的一个神经图像字幕生成器所产生的字幕。

  技术大咖教你用TensorFlow为图片添加字幕

  图1. 来源:Paul Puri。图片来自MS COCO数据集

  在这篇文章里,我们会介绍一个中级程度的教程,教大家如何使用谷歌的“Show and Tell”模型的一种变形和Flickr30k数据集来训练一个图片字幕生成器。我们使用TensorFlow的框架来构建、训练和测试我们的模型,因为它相对容易使用而且也有一个日益庞大的在线社区。

  为什么要生成字幕?

  近年来在计算机视觉和自然语言处理任务上应用深度神经网络的成功激励着AI研究人员去探索新的研究机会,交叉连接这些之前互相独立的领域。字幕生成模型就必须去对视觉线索和自然语言的理解进行平衡。

  这两个传统上无关的领域的交叉有可能在更大的范围内产生变革。这一技术现在已经有一些很直接的应用。比如,为YouTube视频自动生成摘要或是标注未标记的图片。而更多的有创造力的应用则会大幅度提高一个更广泛的人群的生活质量。与传统的计算机视觉试图去让计算机能更好地接触和理解这个世界一样,这一新技术具有进一步让这个世界对人类更加可达与可理解的潜力。它可以是一个导游,甚至可以成为日常生活的一个视觉帮助服务。比如意大利的AI公司Eyra所开发的Horus可穿戴设备所展示的这个场景。

  需要一些安装工作

  在我们正式开始前,需要先做一些整理工作。

  首先,你需要安装TensorFlow。如果这是你第一次使用TensorFlow,我们推荐你先看看这篇文章《你好,TensorFlow!从零开始构建和训练你的第一个TensorFlow图》。

  你需要安装pandas、OpenCV2和Jupyter库来保证相关的代码可以运行。不过为了简化安装的过程,我们强烈推荐你使用与本文关联的GitHub库里的这个Docker安装指南。

  你还需要下载Flickr30k图片文件和图片字幕数据集。我们的GitHub库里有也提供了下载链接。

  现在,让我们开始吧!

  图片字幕生成模型

  技术大咖教你用TensorFlow为图片添加字幕

  图2. 来源:Shannon Shih获取自加州大学伯克利分校机器学习组织。马的图片来自MS COCO

  概括来看,这就是我们将要训练的模型。每张图片都可以被一个深度卷积神经网络编码成一个4096维的向量表示。一个语言生成RNN(循环神经网络)将会对这个表示按顺序解码,并生成自然语言的描述。

  字幕生成是图像分类的一种扩展

  作为计算机视觉的一个任务,图片分类有着很长的历史,且有非常多好的模型。分类需要模型能把图像里与形状和物体相关的视觉信息拼接在一起,然后把这个图片分入一个类别。其他的计算机视觉的机器学习模型,诸如物体检查和图片分割等,则不仅对呈现的信息进行识别,还通过学习如何解读二维的空间,并把这两种理解融合起来,从而能判断出图片里分布的物体信息。对于字幕生成,有两个主要的问题:

  • 在获取图片里的重要信息时,我们如何基于图像分类模型的成功结果?

  • 我们的模型如何能学习去融合对于语言的理解和对于图片的理解?

  • 利用迁移学习

      我们可以利用已有的模型来帮助实现图片生成字幕。迁移学习让我们可以把从其他任务上训练出来的神经网络的数据变换应用到我们自己的数据上。在我们的这个场景里,VGG-16图片分类模型是把224 x224像素的图片作为输入,产生4096维度的特征向量表示,用于分类图片。

      我们可以利用这些VGG-16模型生成的表示(也叫做图向量)来训练我们的模型。限于本文的篇幅,我们省略了VGG-16的架构,而是直接用已经计算出来的4096维的特征来加快训练的过程。

      导入VGG图片特征和图片字幕是相当得简单直接:

      def get_data(annotation_path, feature_path):

      annotations = pd.read_table(annotation_path, sep=’\t’, header=None, names=[‘image’, ‘caption’])

      return np.load(feature_path,’r’), annotations[‘caption’].values

      理解字幕

      现在我们已经有了图片的表示了,还需要我们的模型能学会把这些表示解码成能被理解的字幕。因为文字天生的序列特性,我们会利用一个RNN/LSTM网络里的循环特点。这些网络被训练来预测在给定的一系列前置词汇和图片表示的情况下的下一个词。

      长短期记忆(LSTM)单元能让这个模型能更好地选择什么样的信息可以用于字幕词汇序列,什么需要记忆,什么信息需要忘掉。TensorFlow提供了一个封装的功能可以对于给定的输入和输出维度生成一个LSTM层。

      为了把词汇能变化成适合LSTM的固定长度表示的输入,我们使用一个向量层来把词汇映射成256维的特征(也叫词向量)。词向量帮助我们把词汇表示成向量,同时相似的词向量在语义上也相似。想了解更多关于词向量如何获取不同词汇之间的关系,请看这篇《用深度学习来获取文本语义》。

      在这个VGG-16图片分类器里,卷积层抽取出了4096维表示,然后送入最后的softmax层来做分类。因为LSTM单元需要的是256维的文本输入,我们需要把图片表示转化成目标字幕所需的这种表示。为了实现这个目标,我们需要加入另外一个向量层来学习把4096维的图片特征映射成256维的文本特征空间。

      构建和训练这个模型

      全合在一起,Show and Tell模型就大概像这个样子:

      技术大咖教你用TensorFlow为图片添加字幕

      图3. 来源《Show and Tell:2015 MSCOCO图片字幕大赛所获得的经验教训》

    转载请注明出处。


    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章