基于tensorflow 1.0的图像叙事功能测试(model/im2txt)

作为多模态数据处理的经典,图像自动打标签(图像叙事功能)一直是一项非常前沿的技术,涉及到机器视觉,自然语言处理等模块。

幸运的是,谷歌基于tensorflow将此项功能进行开源。https://github.com/tensorflow/models/tree/master/im2txt#generating-captions

该功能的英文介绍如下:

The Show and Tell model is a deep neural network that learns how to describe the content of images.

其架构英文介绍如下:

The Show and Tell model is an example of an encoder-decoder neural network. It works by first "encoding" an image into a fixed-length vector representation, and then "decoding" the representation into a natural language description.

The image encoder is a deep convolutional neural network. This type of network is widely used for image tasks and is currently state-of-the-art for object recognition and detection. Our particular choice of network is the Inception v3 image recognition model pretrained on the ILSVRC-2012-CLS image classification dataset.

The decoder is a long short-term memory (LSTM) network. This type of network is commonly used for sequence modeling tasks such as language modeling and machine translation. In the Show and Tell model, the LSTM network is trained as a language model conditioned on the image encoding.

Words in the captions are represented with an embedding model. Each word in the vocabulary is associated with a fixed-length vector representation that is learned during training.

The following diagram illustrates the model architecture.

即结合了inception v3 + LSTM模型来实现整个架构。将图像的表示后向量与图像标记的词向量传入到整个模型中。(具体的模型见GITHUB相关页面,比较经典的。)

二、实验测试

为了进行实验,找了提前训练好的模型,不过由于本文实验在tensorflow 1.0版本之上,需要填好几个坑:

(1) word_counts.txt文件的处理,需要将文件中的 b' str'  ==>  str,即把字符串的引号等全部去掉。

(2)修改预训练模型中的名称,由于预训练模型的名称不一致的问题,所以需要进行修改。

在具体代码修改中,添加一个函数来进行模型的修改和重新保存

# 由于版本不同,需要进行修改 def RenameCkpt():     vars_to_rename = {     "lstm/BasicLSTMCell/Linear/Matrix": "lstm/basic_lstm_cell/weights",     "lstm/BasicLSTMCell/Linear/Bias": "lstm/basic_lstm_cell/biases",     }     new_checkpoint_vars = {}     reader = tf.train.NewCheckpointReader(FLAGS.checkpoint_path)     for old_name in reader.get_variable_to_shape_map():       if old_name in vars_to_rename:         new_name = vars_to_rename[old_name]       else:         new_name = old_name       new_checkpoint_vars[new_name] = tf.Variable(reader.get_tensor(old_name))     init = tf.global_variables_initializer()     saver = tf.train.Saver(new_checkpoint_vars)     with tf.Session() as sess:       sess.run(init)       saver.save(sess, "/home/ndscbigdata/work/change/tf/gan/im2txt/ckpt/newmodel.ckpt-2000000")     print("checkpoint file rename successful... ")

具体实验:

(1)手动设置一些参数

FLAGS.checkpoint_path = "/home/ndscbigdata/work/change/tf/gan/im2txt/ckpt/newmodel.ckpt-2000000" FLAGS.vocab_file = "./data/volab.txt" FLAGS.input_files = "./data/COCO_val2014_000000224477.jpg,./data/ep271.jpg,./data/dog.jpg"

(2)实验图片

图像 COCO_val2014_000000224477.jpg 标题是:   0) a man riding a wave on top of a surfboard . (概率=0.035672)   1) a person riding a surf board on a wave (概率=0.016238)   2) a man on a surfboard riding a wave . (概率=0.010146)

图像 ep271.jpg 标题是:   0) a woman is standing next to a horse . (概率=0.000759)   1) a woman is standing next to a horse (概率=0.000647)   2) a woman is standing next to a brown horse . (概率=0.000384)

图像 dog.jpg 标题是:   0) a dog is eating a slice of pizza . (概率=0.000138)   1) a dog is eating a slice of pizza on a plate . (概率=0.000047)   2) a dog is sitting at a table with a pizza on it . (概率=0.000039)

注:最后这张图片,是谷歌经典的实验用图,可以看出其测试结果还是相当令人满意的。

可惜由于实验硬件太差,要不可以结合inception v4来训练,应该效果会更好。另外,还有中文标签的生成。

具体的修改源码将公布在本人的github上,欢迎大家前往下载。https://github.com/ndscigdata

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

使用Python完成你的第一个学习项目

你是否想使用python进行机器学习但却难以入门? 在这篇教程中,你将用Python完成你的第一个机器学习项目。 在以下的教程中,你将学到: 下载并安装P...

72511
来自专栏素质云笔记

图像增强︱window7+opencv3.2+keras/theano简单应用(函数解读)

在服务器上安装opencv遇到跟CUDA8.0不适配的问题,于是不得不看看其他机器是否可以预装并使用。 . 一、python+opencv3.2安装 ope...

40610
来自专栏深度学习入门与实践

【深度学习系列】PaddlePaddle可视化之VisualDL

  上篇文章我们讲了如何对模型进行可视化,用的keras手动绘图输出CNN训练的中途结果,本篇文章将讲述如何用PaddlePaddle新开源的VisualDL来...

4089
来自专栏程序员宝库

Python验证码识别:利用pytesser识别简单图形验证码

来源: j_hao104 my.oschina.net/jhao104/blog/647326 一、探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图...

59510
来自专栏AI黑科技工具箱

1.试水:可定制的数据预处理与如此简单的数据增强(下)

上一部分我们讲了MXNet中NDArray模块实际上有很多可以继续玩的地方,不限于卷积,包括循环神经网络RNN、线性上采样、池化操作等,都可以直接用NDArra...

4403
来自专栏机器学习算法与Python学习

Pytorch | BERT模型实现,提供转换脚本【横扫NLP】

《谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读》,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码。现在,PyTorch用户的...

1321
来自专栏AI研习社

Github 项目推荐 | 用 TensorFlow 实现的模型集合

该库包含了大量用 TensorFlow 实现的不同模型。 官方模型(official models) 文件里是使用 TensorFlow 高级 API 的示例模...

3916
来自专栏SnailTyan

非极大值抑制(Non-Maximum Suppression)

博客:noahsnail.com  |  CSDN  |  简书 |   云+社区

6900
来自专栏机器之心

资源 | 清华大学发布OpenNE:用于网络嵌入的开源工具包

3167
来自专栏FreeBuf

用机器学习玩转恶意URL检测

前段时间漏洞之王Struts2日常新爆了一批漏洞,安全厂商们忙着配合甲方公司做资产扫描,漏洞排查,规则大牛迅速的给出”专杀”规则强化自家产品的规则库。这种基于规...

8489

扫码关注云+社区