image caption学习笔记

近日笔者对image caption颇有兴趣,做了一些学习与应用,本文将通过原理、源码、发展以及自身实践向大家简略介绍一下。

何为image caption

首先,image caption,语义描述,可能一开始有人会认为和图像分类十分相似,给它多少张图片多少个分类训练,然后给它一张图片,告诉你这是什么。的确,两者不能说一点相似性都没有,但是image caption要比图像分类要高级,图像分类,提取特征,寻找一个最大几率的标签,然后给出结果,但是image caption,要对图像提取多个特征,然后再将特征进行筛选整合,最后得到一个结果。试想,如果让人类去分辨一个物体,这不是什么难事,但是要让人将一张图片中的故事讲清楚,相比之下,难度就上升了。

image caption 项目

neural talk & neural talk2

首先,笔者是通过李飞飞neural talk项目了解到的,这是李飞飞以及其研究生做的一个项目。这个项目一共有两个版本,第一个是用python+numpy完成的,链接在下,不过很不幸,已经被弃用了。原因是与neural talk2项目相比,速度相差比较大,你懂得~
https://github.com/karpathy/neuraltalk
第二个是neural talk2,通过torch完成,使用了一门lua脚本语言。恕笔者学术浅薄,在之前,从来没有听说过lua,以致于对这个项目有了深深的敬畏感,但是后来通过cs231n的学习,lua是一门高级脚本语言,c++,和javascript有点类似,与python相比最大的优势在于for循环不会造成运行速度的迟缓。
https://github.com/karpathy/neuraltalk2
如果有人对这两个项目比较感兴趣或者对计算机视觉方面的课程(通过深度学习网络)比较感兴趣,建议大家去看一看斯坦福大学的cs231n课程,虽然都说是李飞飞授课,其实她只讲了第一节课,后面两个小哥是她的研究生,不过说话也十分风趣,简单介绍一下,主要流程是knn+svm等图像分类,随后重点讲了反向传播以及梯度概念,后面会讲到CNN和RNN,然后会有迁移学习以及一些训练时的要点,最后作业里会让大家完成image caption一个项目,整个课程是通过python+numpy完成的,课程网上都有,这里就不放链接了。

show and tell

这是2014年的一篇论文提出的一个模型,整个的流程如下图:
image caption学习笔记_第1张图片

这张图已经是show and tell 的代表图。
image caption学习笔记_第2张图片
便于大家更直观的理解,笔者画了一张简单的流程图。
整个过程可以分为Encode 和Decode两个过程,通过CNN将图片的特征提取出来,这一步是Encode,然后送给LSTM进行Decode,得出结果。
这个过程有两点需要注意:
1、在进行train的时候使用了数据增强,这在cs231n课程中也涉及到了,含义就是通过对图片进行镜像翻转、随机旋转、改变饱和度、改变对比度来提高模型的泛化能力。
2、对应每一句描述,会加上一个start和一个end标记。
这个模型综合了CNN和RNN的各自的强大之处来进行image caption,但是在一些方面还存在问题。在训练时,每一步输入的label 是正确的,但是预测是没有正确的label,只能把前一步的预测的词作为输入,因此,若中间有一个词错误,后面这个错误会被无限放大。

show,attend and tell

在2015年,就有一篇论文在show and tell基础上引入了attend机制,形成了show,attend and tell,而这个机制,很大程度上提高了image caption的正确率,同时,这也是笔者找到的比较方便运行的一个版本。
image caption学习笔记_第3张图片
上图是加了attention机制后的系统流程。
与show and tell的区别:show and tell模型中进行预测时,没有考虑图片的响应位置,接收的收入只是上一步预测的词和隐藏层输出,但是引入attendtion机制后,attention会在预测单词时加入这一单词在图片中位置的信息。
attention机制可以分为soft attention和hard attention。当前使用较多的还是soft attention,因为其可以直接求导,进行梯度反向传播,而且hard attention相比较还是要复杂得多。
简单介绍一下soft attention,在之前show and tell中,LSTM是直接使用softmax前一层的输出作为输入,而在show and tell中,使用CNN最后一层卷积层输出的feature map,选用其中的向量ai来生成zt,每一层预测时为a中的每个向量设置一个权重,然后再加权求和,这样需要被重点关注的区域权重较高。

实战

笔者通过查找各种资料,很多模型都是跑不成功,最后参考一篇博客得以实现。
https://blog.csdn.net/qq_36735489/article/details/81096856
项目的地址:
https://github.com/coldmanck/show-attend-and-tell
最后,笔者跑出来的结果如下:

注意事项

1、大多数image caption系统使用的CNN模型都是预训练好的模型,常见为vgg16和resnet,这些模型一般不需要自己去训练,而且一般自己的机器也带不动,当然,如果是大佬就另当别论了。
2、在下载好预训练好的CNN模型后,一般单独对RNN进行训练,然后对参数进行一些微调(想在自己机器上跑起来且不花费很久很久。。。)
3、对C++比较熟悉的或者对lua了解的建议还是跑一下neural talk2,据说这个系统速度会快很多,而且很多国外的研究院和公司都在用torch。

注:笔者只是一名学生,如果博客有些地方不正确或者对某些人造成困扰,可以联系我,如果对深度学习或者计算机视觉方面有兴趣的,可以私信我,我们可以一起学习,一起进步~,如果有想找笔者聊天聊地聊人生的,也欢迎私信我。
笔者邮箱[email protected]
参考博客:
https://blog.csdn.net/lhanchao/article/details/82863476
https://blog.csdn.net/shenxiaolu1984/article/details/51493673
https://blog.csdn.net/luoyang224/article/details/76599736
https://www.e-learn.cn/content/qita/1218346

你可能感兴趣的:(image,caption,计算机视觉)