作者:看那个码农
公众号:看那个码农
1.项目简介
Image Caption 任务是一个需要综合计算机视觉和自然语言处理的任务,需要使用计算机建立某种映射方式,将处于视觉模态当中的数据映射到文本模态当中,即让视觉和文字二者之间产生某种对应关系。
让电脑识别图像里的内容,并将电脑自己对图像的描述生成出来。如下所示。
总的来说,这样的映射任务需要如下两个基本需求:
- 语法的正确性,映射的过程当中需要遵循自然语言的语法,使得结果具有可读性;
- 描述的丰富程度,生成的描述需要能够准确描述对应图片的细节,产生足够复杂的描述。
本篇文章的主要内容是针对2015年Google设计的Im2txt这一图像描述模型所做的项目
项目论文链接: arxiv.org/abs/1609.06…
2.项目用途
让电脑识别图像里的内容,并将电脑自己对图像的描述生成出来
3.项目配置
- Python 3.6
- tensorflow-1.12
4.项目原理
本项目是
基于深度学习的encoder-decoder算法模型进行
海量数据训练后得到的
- encoder是编码器,它是一个CNN模型,常用于图像识别,目标检测等领域。各种常见的卷积网络都可以,比如VGG,Inception,ResNet等等。
- decoder是译码器,它是一个LSTM模型,常用于语言模型或机器翻译等领域。我们把encoder中输出的固定长度的向量输入到decoder中,获得关于图像的描述。
5.项目流程
1.下载论文的代码,并进行代码配置,论文是采用Inceptionv3做为编码器,LSTM做为解码器
2.基于MSCOCO数据集的图像字幕数据集进行海量数据训练后得到训练后的算法模型
3.采用下面代码,进行模型测试,查看效果。
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import math
import os
import tensorflow as tf
from im2txt import configuration
from im2txt import inference_wrapper
from im2txt.inference_utils import caption_generator
from im2txt.inference_utils import vocabulary
# In[2]:
# 训练好的模型存放路径
checkpoint_path = "D:/Show-Tell/im2txt/model/model.ckpt-3000000"
# 词汇表
vocab_file = "D:/Show-Tell/im2txt/im2txt/data/word_counts.txt"
# 图片路径
input_files = "D:/Show-Tell/im2txt/images/"
# In[8]:
# 载入训练好的模型
g = tf.Graph()
with g.as_default():
model = inference_wrapper.InferenceWrapper()
restore_fn = model.build_graph_from_config(configuration.ModelConfig(), checkpoint_path)
# 载入词表
vocab = vocabulary.Vocabulary(vocab_file)
with tf.Session(graph=g) as sess:
# 载入训练好的模型
restore_fn(sess)
generator = caption_generator.CaptionGenerator(model, vocab)
# 循环文件夹
for root,dirs,files in os.walk(input_files):
for file in files:
# 打印图片路径及名称
image_path = os.path.join(root,file)
print(image_path)
# 载入图片
image = tf.gfile.FastGFile(os.path.join(root,file), 'rb').read()
# 获得图片描述
captions = generator.beam_search(sess, image)
# 打印多个标题
for i, caption in enumerate(captions):
sentence = [vocab.id_to_word(w) for w in caption.sentence[1:-1]]
sentence = " ".join(sentence)
if i == 0:
title = sentence
print(" %d) %s (p=%f)" % (i, sentence, math.exp(caption.logprob)))
4.查看检测效果。
6.项目思考
综上来看,该模型基本实现了让电脑进行看图说话的能力,但是在准确性和适用性上还尚有欠缺,有很多可以去修改和完善的空间。
因为是采用编码器-解码器的算法模型去训练数据集的,可以分别在编码器和解码器阶段进行创新,例如编码器换用Inceptionv4,或者在原有网络基础上,将部分网络的连接改为密集连接,增强特征融合效果。
但是从目前图像描述任务的发展来看,算法模型从GAN网络上进行突破不失为一个好方向,好点子。
希望能与看到此篇文章的你一起讨论下一步解决与学习方向。
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情