给图像添加描述涉及根据给定图像(例如照片)生成人类可读的文本描述。
对于人类来说,这是一个简单的问题,但对于机器来说却极具挑战性,因为它需要理解图像的内容以及如何将这种理解转化为自然语言。
最近,深度学习方法已经取代了经典方法,并在自动为图像生成描述(称为“描述”)的问题上取得了最先进的成果。
在这篇文章中,您将了解如何使用深度神经网络模型自动为图像(例如照片)生成描述。
完成这篇文章后,您将了解:
- 关于为图像生成文本描述的挑战以及结合计算机视觉和自然语言处理突破的需求。
- 关于构成神经特征描述模型的元素,即特征提取器和语言模型。
- 如何将模型的元素排列成编码器-解码器,可能还使用注意力机制。
使用我的新书《深度学习自然语言处理》来启动您的项目,包括分步教程和所有示例的Python源代码文件。
让我们开始吧。
概述
这篇文章分为3个部分;它们是
- 用文本描述图像
- 神经描述模型
- 编码器-解码器架构
需要深度学习处理文本数据的帮助吗?
立即参加我的免费7天电子邮件速成课程(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
用文本描述图像
描述图像是指生成图像(例如物体或场景的照片)的人类可读文本描述的问题。
这个问题有时被称为“自动图像注释”或“图像标注”。
对于人类来说,这是一个简单的问题,但对于机器来说却极具挑战性。
人类只需快速瞥一眼图像,就能指出并描述视觉场景中的大量细节。然而,这种非凡的能力对我们的视觉识别模型来说却是一项难以实现的任务。
— 用于生成图像描述的深度视觉-语义对齐,2015。
解决方案既需要理解图像内容并将其转化为文字形式的意义,又需要将文字串联起来使其易于理解。它结合了计算机视觉和自然语言处理,是广义人工智能中一个真正具有挑战性的问题。
自动描述图像内容是人工智能中的一个基本问题,它连接着计算机视觉和自然语言处理。
— Show and Tell: 一个神经图像描述生成器,2015。
此外,问题的难度范围可能很大;让我们通过示例来看一下该问题的三种不同变体。
1. 图像分类
从数百或数千个已知类别中为图像分配一个类别标签。

将图像分类为已知类别的示例
摘自“Detecting avocados to zucchinis: what have we done, and where are we going?”, 2013。
2. 描述图像
生成图像内容的文本描述。

为照片生成的描述示例
摘自“用于视觉识别和描述的长期循环卷积网络”,2015。
3. 注释图像
为图像上的特定区域生成文本描述。

用描述注释图像区域的示例。
摘自“用于生成图像描述的深度视觉-语义对齐”,2015。
这个一般问题也可以扩展到描述视频中随时间变化的图像。
在这篇文章中,我们将重点关注描述图像,我们称之为“图像描述”。
神经描述模型
神经网络模型已在自动描述生成领域占据主导地位;这主要是因为这些方法正在展现出最先进的成果。
在端到端神经网络模型生成图像描述之前,两种主要的优势方法是基于模板的方法和基于最近邻的方法以及修改现有描述的方法。
在使用神经网络生成描述之前,主要有两种方法占据主导地位。第一种方法是生成描述模板,然后根据物体检测和属性发现的结果进行填充。第二种方法是首先从大型数据库中检索相似的带有描述的图像,然后修改这些检索到的描述以适应查询。[...]这两种方法现在都已被当前占主导地位的神经网络方法所取代。
— Show, Attend and Tell: 带有视觉注意力的神经图像描述生成,2015。
用于生成描述的神经网络模型包含两个主要元素:
- 特征提取。
- 语言模型。
特征提取模型
特征提取模型是一种神经网络,给定一张图像,它能够提取显著特征,通常以固定长度向量的形式。
提取的特征是图像的内部表示,而不是可以直接理解的东西。
深度卷积神经网络(CNN)用作特征提取子模型。该网络可以直接在图像描述数据集中的图像上进行训练。
另外,可以使用预训练模型(例如用于图像分类的最先进模型),或者某种混合模型,其中使用预训练模型并在问题上进行微调。
通常会使用在ImageNet数据集(为ILSVRC挑战开发)中表现最佳的模型,例如牛津视觉几何组模型(简称VGG)。
[...] 我们探索了几种处理过拟合的技术。最明显的不过拟合的方法是将我们系统中CNN组件的权重初始化为预训练模型(例如,在ImageNet上训练的模型)
— Show, Attend and Tell: 带有视觉注意力的神经图像描述生成,2015。

特征提取器
语言模型
通常,语言模型根据序列中已存在的词语预测序列中下一个词语的概率。
对于图像描述,语言模型是一个神经网络,它根据从网络中提取的特征,能够预测描述中的词语序列,并根据已经生成的词语构建描述。
通常使用循环神经网络,例如长短期记忆网络(LSTM),作为语言模型。每个输出时间步都会在序列中生成一个新词。
然后,生成的每个词都使用词嵌入(例如word2vec)进行编码,并作为输入传递给解码器,以生成后续的词。
模型的一个改进之处在于收集输出序列中词汇的概率分布,并对其进行搜索以生成多个可能的描述。这些描述可以根据可能性进行评分和排序。通常使用束搜索(Beam Search)进行此搜索。
语言模型可以使用从图像数据集中提取的预计算特征进行独立训练;它可以与特征提取网络联合训练,或者以某种组合方式进行训练。

语言模型
编码器-解码器架构
一种流行的子模型结构是使用编码器-解码器架构,其中两个模型同时进行训练。
[该模型]基于一个卷积神经网络,将图像编码成紧凑表示,然后是一个循环神经网络,生成相应的句子。该模型经过训练,旨在最大化给定图像的句子可能性。
— Show and Tell: 一个神经图像描述生成器,2015。
这是一种为机器翻译开发的架构,其中输入序列(例如法语)由编码器网络编码为固定长度向量。然后,独立的解码器网络读取编码并生成新语言(例如英语)的输出序列。
这种方法除了其令人印象深刻的技能外,还有一个优点是可以针对该问题训练一个单一的端到端模型。
当应用于图像描述时,编码器网络是深度卷积神经网络,解码器网络是多层LSTM。
[在机器翻译中]一个“编码器”RNN 读取源句子并将其转换为一个丰富的固定长度向量表示,该表示反过来用作生成目标句子的“解码器”RNN 的初始隐藏状态。在这里,我们建议遵循这个优雅的方案,用深度卷积神经网络(CNN)取代编码器 RNN。
— Show and Tell: 一个神经图像描述生成器,2015。

CNN和LSTM架构示例。
摘自“Show and Tell: 一个神经图像描述生成器”,2015。
带有注意力的描述模型
编码器-解码器架构的局限性在于,它使用单一固定长度的表示来保存提取的特征。
通过在更丰富的编码上开发注意力机制,在机器翻译中解决了这个问题,允许解码器在生成翻译中的每个单词时学习将注意力放在何处。
注意力方法也被用于提高图像描述的编码器-解码器架构的性能,它允许解码器在生成描述中的每个单词时学习将注意力放在图像的何处。
受描述生成方面最新进展的鼓舞,并受到机器翻译和物体识别中注意力机制应用的成功启发,我们研究了能够在生成描述时关注图像显著部分的模型。
— Show, Attend and Tell: 带有视觉注意力的神经图像描述生成,2015。
这种方法的一个好处是,可以在生成描述中的每个词时,准确地可视化注意力所在的位置。
我们还通过可视化展示了模型如何能够自动学习在生成输出序列中相应的词时,将其目光聚焦在显著的物体上。
— Show, Attend and Tell: 带有视觉注意力的神经图像描述生成,2015。
用一个例子最容易理解;请看下面。

带有注意力的图像描述示例
摘自“Show, Attend and Tell: 带有视觉注意力的神经图像描述生成”,2015。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
论文
- 展示与讲述:一个神经图像字幕生成器, 2015.
- 展示、关注和讲述:带视觉注意力的神经图像标题生成, 2015.
- 用于视觉识别和描述的长期循环卷积网络, 2015.
- 用于生成图像描述的深度视觉-语义对齐, 2015.
文章
- 维基百科上的自动图像注释
- Show and Tell: TensorFlow中开源的图像描述, 2016.
- 演示:使用卷积神经网络和循环神经网络进行自动图像描述,Andrej Karpathy 和 Fei-Fei Li (幻灯片)。
项目
- 项目:用于生成图像描述的深度视觉-语义对齐, 2015.
- NeuralTalk2: Torch中高效的图像描述代码,可在GPU上运行,Andrej Karpathy。
总结
在这篇文章中,您了解了如何使用深度神经网络模型自动为图像(例如照片)生成描述。
具体来说,你学到了:
- 关于为图像生成文本描述的挑战以及结合计算机视觉和自然语言处理突破的需求。
- 关于构成神经特征描述模型的元素,即特征提取器和语言模型。
- 如何将模型的元素排列成编码器-解码器,可能还使用注意力机制。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
太棒了。
谢谢!
对深度学习的发展以及围绕其产生的新机会和新想法感到兴奋。凭借对机器学习和sklearn工具的基本理解。开始探索深度学习的最佳方式是什么?
从这里开始
https://machinelearning.org.cn/start-here/#deeplearning
Jason,太棒了。虽然这些知识对于博士生来说确实太多了。我想这会帮助我们更快地学习。
谢谢,坚持下去!
嗨,Jason:有没有针对这个任务的基础运行代码:3. 注释图像,我能拿到吗?
是的,我的书里有一个完整的例子。
https://machinelearning.org.cn/deep-learning-for-nlp/
非常棒的材料,非常有用。谢谢Jason。
很高兴它有帮助。
嗨,Jason,有没有关于上面解释的注意力机制(show, attend, tell)实现的示例?
提前感谢,
Harathi
好问题,我在这里列出了一些可以搜索的地方
https://machinelearning.org.cn/faq/single-faq/where-can-i-get-code-on-__
谢谢 Jason,
我会去看看的
嗨,Jason。我们离生成视频的文本渲染还有多远?
分层帧及其时间上下文/相互关系的文本渲染似乎会呈指数级困难,但哇——那将是一个多么大的突破。可以想象机器描述将如何彻底改变一系列行业(新闻业、情报、政策、剧本创作等)。
好问题,我猜几年时间。现在我们已经有了小型案例。
http://www.cs.utexas.edu/users/ml/papers/venugopalan.naacl15.pdf
完美。感谢您的链接。
Jason,又是一篇不错的文章。我饶有兴致地阅读了您的文章。Jason,我能否在不购买整本书的情况下获得这篇文章的特定代码?或者您有没有一本专门包含“图像注释”实现代码的书。如果您有,我愿意购买整本书。因为我只对所提及的材料感兴趣。再次感谢您分享如此有用的材料。
也许这篇文章会有所帮助
https://machinelearning.org.cn/develop-a-deep-learning-caption-generation-model-in-python/
嗨,Jason,
我被告知深度学习算法需要大量的训练数据。是什么以及算法的哪一部分需要如此多的数据?
是的,深度学习算法如果可用的话,可以使用更多数据,并且性能可以持续提升。
嗨,Jason!你也要在Keras中实现这个吗?还是已经完成了?那也会是一篇好文章!
是的,就在这里。
https://machinelearning.org.cn/develop-a-deep-learning-caption-generation-model-in-python/
嗨,Jason,
我一直在想,如果我们使用不同的输入图像,而这些图像应该输出相同的图像描述,比如“一个男孩跳入游泳池”,那么模型将如何训练?难道这不会让模型感到困惑吗?我的意思是,模型应该根据不同的输入图像输出不同的描述,对吗?换句话说,我们是否必须向模型展示“一个男孩跳入游泳池”图像的各种版本的描述,以作为不同输入图像的标签,才能让模型更好地训练?
提前感谢您!
Kyu
很好的问题!
可能会。或者它可能像一种数据增强技术一样,对学习算法进行正则化(我猜)。
听起来是个有趣的问题,值得探索!
这可以用来为图表/表格生成描述吗?
哇,酷主意。
也许可以。
也许试试看。难点在于获取良好的数据集来训练模型。
希望这听起来不太疯狂。
我希望一个人能够查看图像并生成描述,然后将描述语音输入机器,然后让机器查看图像并“阅读”我的描述,学习如何分类我的描述,然后学习如何预测我正在看的东西。
我可以看到数据/图像中难以编码的关系。
所以,对我来说,仅仅口述我所看到的要容易得多,而不是强迫我进行编码。
让我简单地口述标签,然后让机器从我的标签中学习……而我无需编码并将代码加载到电子表格或数据库中。
不确定我是否解释清楚了,但我可以给您看一个例子。
我实际上正在考虑使用DataTable的图像...然后我描述我在DataTable图像中看到的内容。
所以,例如,我可以看一张显示学生智商结果的图表图像。然后我描述我在图表中看到的内容,并告诉机器哪些学生毕业了,哪些没有。
机器通过我向Alexa口述我在智商测试结果图表中看到的不同智商任务的特征,来学习预测谁将毕业。
这说得通吗?
也许可以尝试实现您的想法看看?
抱歉我没说清楚:我是在问这样做是否可能和可行。我不知道它是否可以构建,也不知道如何构建。我以为如果是可行的,您就能给我指明正确的方向。
我已经尽力回答了,例如,回答这类问题的唯一有效方法是探索一个原型模型。
你好 Jason,请问我需要使用深度学习自动生成照片文本描述的程序。
你好 Houssem……请就给定的教程和所提供的代码清单提出具体问题,以便我更好地协助您。
嗨 Jason,有没有可能自动描述图像的所有内容(完整场景)为文本?就是自动化地将完整图像生成文本。您有没有相关的书籍或著作……
你好 Sri...以下是一个很好的起点
https://tensorflowcn.cn/text/tutorials/text_generation