ImageCaption算法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21275321/article/details/77187640

综述:

最近在看ImageCaption的相关内容,ImageCaption简单来说就是看图说话,输入时一张图片,输出是一句话,主要看了知乎上杜克的两篇文章,看了Google的两篇关于NIC模型的论文,配置了neutraltalk,neutraltalk2,tensorflow/im2txt(NIC)的环境,跑了neutraltalk和neutraltalk2的inference,和im2txt的训练。

参考资料:

总结论文+开源项目:
Image / Video Captioning

知乎专栏上杜克的综述:
《看图说话的AI小朋友——图像标注趣谈(上)》
《看图说话的AI小朋友——图像标注趣谈(下)》

参考文献:
[1]《Deep Visual-Semantic Alignments for Generating Image Descriptions》
[2]《Show and Tell: A Neural Image Caption Generator》
[3]《Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge》

开源项目:
1.neutraltalk 是参考文献[1][2]的复现,使用python+numpy实现
2.neutraltalk2 是neutraltalk在torch(lua)上面的改进版,大幅提高了速度和准确率
3.im2txt 是参考文献[2][3]的复现,其中[2]是最初版本,[3]是Google参加2015 MSCOCO Image Captioning Challenge时对于初始项目的改进版,im2txt在[3]的基础上又做了些改进,已加入tensorflow/models豪华套餐

算法描述:

ImageCaption算法总体来说就是CNN+RNN。用CNN提取图像特征,用RNN来训练语言模型,所以对于ImageCaption算法来说,可以改进的地方主要有三个方面:

1.CNN的选择
2.RNN的选择
3.CNN接入RNN的方式

1.CNN的选择:目前很多算法直接使用在ImageNet上训练好的预训练模型,提取其最后一层全连接层的输出作为图像特征输入到RNN中,在训练过程中是不对CNN进行训练的,只将CNN看成是一个特征提取器,只用RNN训练语言模型。

2.RNN的选择:RNN可以选择传统RNN,LSTM,B-LSTM,显然LSTM的效果优于传统RNN,现在很多算法都使用LSTM。

3.CNN接入RNN的方式可以选择只在第一个时刻输入图像特征或在每个时刻都输入图像特征。

项目描述:
对于开源项目,我配置了neutraltalk,neutraltalk2,tensorflow/im2txt(NIC)的环境,跑了neutraltalk和neutraltalk2的inference,和im2txt的训练。
数据集主要使用的是MSCOCO2014。
1)neutraltalk
neutraltalk是用Python+numpy实现的,可想而知训练速度极慢,所以我没有跑train,只跑了inferensce,跑inference的步骤如下:
(1)下载VGG-16在ImageNet上预训练的caffemodel
(2)下载作者已经训练好的*.p格式的语言预训练模型
(3)用VGG-16的预训练模型提取想要预测的图片的最后一层全连接层的特征(VGG-16为4096维度),存储为*.mat格式的文件
(4)将(2)和(3)的文件同时输入给inference代码
可以看出neutraltalk的CNN和RNN是完全分开的,使用更好的CNN模型来提取特征可以得到更好的结果,但是我认为对于ImageCaption来说起到主要作用的还是RNN部分,CNN只是作为一个特征提取器,用VGG提取特征已经足够了。
用neutraltalk跑训练的一个好处是,AK大神已经把各个数据集的图像的最后一层全连接层的结果保存成了*.mat文件,同时对存储了caption的json文件做了预处理,这样使得大家不用下载巨大的数据集就可以进行训练了~
2)neutraltalk2
neutraltalk2是在torch7(lua)上面跑的,亲爱的AK大神告诉了我们详细的配置过程(我爱大神~),由于我的机器没有GPU,所以我只配置了前半部分,没有弄cuda,cudnn什么鬼的。
neutralk2我没有跑train,但是跑inference的时候只需要输入一个*.t7格式的文件(神奇的是用cpu和用gpu训练出来的模型居然不一样,用cpu inference的时候就用cpu训练出来的模型吧?cpu模型和gpu模型可以相互转换哒~我的mac没有gpu所以我用的是cpu模型),这是因为AK大神说
“It’s large because it contains the weights of a finetuned VGGNet”
人家把CNN模型融合到最后的模型中啦,所以不需要我们再手动提取图像的特征了~!
当然在训练的时候还是要用到VGG-16的预训练模型,这里也可以改成其他的,比如ResNet,这样最终的模型maybe more smaller~(反正训练过程中把CNN参数fix住了,所以我们不需要因为ResNet训练时间过长而头疼,哈哈哈)
neutraltalk2因为是在更加优秀的框架中实现的,所以它的速度和效果都比neutralk好~
3)im2txt
im2txt 是用tensorflow1.0实现的,为了防止出现兼容问题,还是推荐把tensorflow调到1.0版本。
AK大神的neutraltalk其实相当于是对GoogleNIC模型的复现,但是后来Google自己把它开源了,而且AK大神说,Google开源的im2txt基于tensorflow框架,和他的neutraltalk大同小异,但是效果相对更好一点,所以说目前最好的模型就是NIC模型,它的最好的复现就是im2txt了,已加入tensorflow/models大餐!
im2txt的readme写得特别好,配置环境的步骤也讲得很详细,照着流程训练就好。但是不太方便的一点就是它用了bazel什么鬼的,这是Google自己出的类似于cmake的东西,我觉得在控制台运行程序非常不方便,所以稍微改了改源码的输入就可以在pycharm里面运行了。
唯一的缺憾是im2txt没有提供官方训练好的模型,但是有很多人试了这个项目,也有几个大牛提供了自己训练的模型,没什么大问题的话可以直接使用(如果不能是用就是tensorflow版本不匹配哦~)
-训练
训练的时候还是要用预训练好的CNN模型,im2txt用的是inception v3的tensorflow模型,将他的参数作为模型CNN部分参数的初始化值,训练的时候分为两个阶段,第一个阶段固定住CNN部分的参数,只训练RNN部分,训练速度是0.3s/step,训练1M次之后(用了一周啊啊啊啊啊啊)然后允许微调CNN的模型,在训练1M次(0.6s/step啊啊啊啊),现在还在跑,还要跑一周将近两周啊啊啊啊啊啊啊,不写了呜呜呜呜呜

猜你喜欢

转载自blog.csdn.net/qq_21275321/article/details/77187640