随着深度学习技术的不断发展,能够通过构建智能系统来自动生成图像的文本描述。这种技术被称为图像描述(Image Captioning),它涉及到从图像中识别对象和动作,并将其转化为自然语言描述。例如,给定一张图片,系统能够自动生成如“一个男人和小女孩坐在路边的蓝色包旁吃东西”这样的描述。
图像描述技术在现实生活中有着广泛的应用前景,比如通过描述来检索图片,或者帮助视觉障碍人士理解图片内容。本文将探讨如何使用深度学习技术来实现这一功能,并提供一个简单的实现示例。
在开始之前,假设读者已经具备深度学习的基础知识,并且熟悉使用卷积神经网络(CNN)处理图像问题。如果需要复习相关概念,可以参考以下文章:
《深度学习基础——从人工神经网络开始》、《卷积神经网络(CNN)架构解密》、《使用Keras优化神经网络教程(含图像识别案例研究)》、《深度学习精要——使用注意力机制的序列到序列建模(使用Python)》。
当看到一张图片时,大脑会迅速识别出画面中的对象、动作,并形成描述。对于计算机来说,自动完成这一任务是一个巨大的挑战,需要使用复杂的深度学习技术。
图像描述任务的核心是生成一个句子,描述图像中显示的内容——包括对象、属性、动作以及对象间的交互等。虽然任务听起来简单,但实现起来却非常复杂,需要依赖于深度学习中的高级技术。
图像描述任务可以分为两个逻辑模块:一个是基于图像的模型,用于提取图像的特征和细节;另一个是基于语言的模型,将图像模型提供的特征和对象转化为自然语言句子。
对于基于图像的模型(编码器),通常依赖于卷积神经网络模型。对于基于语言的模型(解码器),依赖于循环神经网络。下图总结了上述方法:
# 预训练的CNN用于从输入图像中提取特征
# 特征向量线性变换以匹配RNN/LSTM网络的输入维度
# 该网络作为语言模型在特征向量上进行训练
为了训练LSTM模型,需要预定义标签和目标文本。例如,如果描述是“一个男人和女孩坐在地上吃东西。”,标签和目标将如下所示:
# 标签 – [<start>, 一个男人, 和, 一个女孩, 坐, 在, 地上, 和, 吃, .]
# 目标 – [一个男人, 和, 一个女孩, 坐, 在, 地上, 和, 吃, ., <end>]
这样做是为了让模型理解标记序列的开始和结束。
让来看一个使用PyTorch实现的简单图像描述示例。将输入一张图片,并使用深度学习模型预测其描述。
这个示例的代码可以在GitHub上找到。原始代码是Yunjey Choi。向他提供的PyTorch优秀示例致敬!
在这个示例中,使用预训练的resnet-152模型作为编码器,解码器是一个LSTM网络。运行这个示例代码,需要安装一些先决条件。确保有一个工作正常的Python环境,最好安装了Anaconda。然后运行以下命令安装其他所需的库。
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI/
make
python setup.py build
python setup.py install
cd ../../
git clone https://github.com/yunjey/pytorch-tutorial.git
cd pytorch-tutorial/tutorials/03-advanced/image_captioning/
pip install -r requirements.txt
设置好系统后,需要下载训练模型所需的数据集。这里将使用MS-COCO数据集。要自动下载数据集,可以运行以下命令:
chmod +x download.sh
./download.sh
现在可以开始构建模型了。首先,需要处理输入:
# 搜索数据集中所有可能的单词,并构建词汇表列表
python build_vocab.py
# 调整所有图像的大小,使其变为224x224
python resize.py
现在可以通过运行以下命令开始训练模型:
python train.py --num_epochs 10 --learning_rate 0.01
如果想深入了解模型的定义,可以参考model.py文件中的代码。
现在可以使用以下命令测试模型:
python sample.py --image='png/example.png'
对于示例图片,模型给出了这样的输出:
<start> 一群长颈鹿站在草地上。 <end>
这就是如何构建一个用于图像描述的深度学习模型!
上面看到的模型只是冰山一角。在这个话题上已经有很多研究。目前,图像描述的最新模型是微软的CaptionBot。可以在他们的官方网站上查看系统的演示(链接:www.captionbot.ai)。
将列出一些可以用以构建更好图像描述模型的想法:
增加更多数据——当然,这是深度学习模型的常见趋势。提供给模型的数据越多,它的性能就越好。可以查看这个资源以获取其他图像描述数据集——http://www.cs.toronto.edu/~fidler/slides/2017/CSC2539/Kaustav_slides.pdf
使用注意力模型——正如在本文中看到的(深度学习精要——使用注意力机制的序列到序列建模),使用注意力模型有助于微调模型性能。