图像标注问题其本质是视觉到语言(Visual-to-Language,即V2L)的问题,解释起来很简单,就是四个字:看图说话。就像老师要求小朋友们在看图说话作业中完成的任务一样,我们也希望算法能够根据图像给出能够描述图像内容的自然语言语句。然而这种对于人类实在是小事一桩的小儿科级任务,在计算机视觉领域却不能不说是一个挑战:因为图像标注问题需要在两种不同形式的信息(图像信息到文本信息)之间进行“翻译”。
项目来源
https://github.com/yunjey/show-attend-and-tell
目标
输入一张图片,输出一句对图片进行描述的文本
基本思路
先通过预训练的图像分类模型,从某一个卷积层得到原始图片的表示,或者称为上下文contexts,拾取出图像的特征后,根据contexts使用LSTM逐步生成单词,即可产生原始图片对应的描述文本,在生成每一个单词时,应该对196个块有不同的偏重,即attention机制,就像我们人一样,考虑下一个词时,对图片的不同区域会有不同的关注度,相关性更强的区域会获得更多的注意力即更高的权重,根据注意力权重对196个512维的特征进行加权求和,即可得到基于注意力机制的上下文context,图像标题生成便属于Seq2Seq Learning中one to many的情况
训练数据集
使用COCO2014数据,该训练集包括8W多张图片,验证集包括4W多张图片,并且提供了每张图片对应的标题,每张图片的标题不止一个,平均一张图片五个标题。训练集一共411593个标题,而验证集一共201489个标题
图片数据:图片文件名与图片标题数据中image_id字段对应
图片标题数据:
对图片标题生成有关的部分:annotation[‘annotations’]
{'image_id': 116100,
'id': 67,
'caption': 'A panoramic view of a kitchen and all of its appliances.'},
{'image_id': 318556,
'id': 126,
'caption': 'A blue and white bathroom with butterfly themed wall tiles.'},
{'image_id': 116100,
'id': 148,
'caption': 'A panoramic photo of a kitchen and dining room'},
{'image_id': 379340,
'id': 173,
'caption': 'A graffiti-ed stop sign across the street from a red car '},
{'image_id': 379340,
'id': 188,
'caption': 'A vandalized stop sign and a red beetle on the road'},
{'image_id': 318556,
'id': 219,
'caption': 'A bathroom with a border of butterflies and blue paint on the walls above it.'},
{'image_id': 318556,
'id': 255,
'caption': 'An angled view of a beautifully decorated bathroom.'}
数据预处理
图像预处理
- 将图像长宽像素压缩到制定尺寸(这里选择的是224),并将黑白图像色彩通道从1增加到3
- 加载训练好的VGG19模型,从VGG19的conv5_3拿到原始图片的表示,shape为 14*14*512 ,即512张 14*14的小图,这样一来,可以理解为将原始图片分成 14*14共196个小块,每个小块对应一个512维的特征。
标题预处理
- 统计所有标题中的单词, 去重排序后,得到单词序列表
- 对上一步的词汇表,添加{”: 0, ”: 1, ”: 2},其中,pad表示标题单词小于最大单词长度,补0,start表示每个title的开始,end表示每个title的结束
- 根据单词在标题中出现的次数排序,得到单词的序列,使用生成的序列,将每一个图像标题中单词对应成序列
模型
验证部分的大多数代码和训练部分相同,大致过程也是VGG19抽取图像特征,后续基于attention构建模型,使用训练好的模型输出title。
集束/柱搜索Beam search
在生成每一个词的时候,可以选择概率最大的词,即贪婪的做法,但不一定最优,因为当前概率最大的词并不能保证之后产生的序列整体概率最大。
也不能像中文分词中那样使用viterbi算法:
- viterbi算法要求整个序列的概率分布已知,才能使用动态规划找到最大概率路径,但本文介绍的方法生成标题的时候,是根据上一个词生成下一个词,
- 本文对于词选择的类别等于词典的大小,远远超出中文分词序列标注中的四分类,因此不可能穷尽所有可能的序列
一种折中的做法是使用beam search,涉及一个参数beam size,举个例子,当beam size等于3时
- 生成第一个词时,保留概率最大的三个词
- 生成第二个词时,在以上三个词的基础上,进一步生成九个词,保留九个序列中概率最大的三个
- 生成第n个词时,基于上一步保留下来的三个序列,进一步生成九个词,保留新的九个序列中概率最大的三个
- 就好比一棵树,每一次所有的树枝都会进一步长出三个子树枝,然后对于所有树枝,保留最好的三个,其他全部砍掉
- 重复以上过程,直到生成了结束词,或者生成的序列达到了最大长度
算法评价标准
- BLEU
- Perplexity
- ROUGE
- METEOR
- CIDEr
- SPICE
评价机器学习系统是的指标同样适用于图像或者视频描述领域。BELU、Meteor、ROUGE、CIDEr和SPICE。前两个是评测机器翻译的,第三个是评测自动摘要的,最后两个应该是为caption定制的。以上评价标准,都是越高越好。
算法评价标准参考链接:https://www.jianshu.com/p/d0b212f5d720
人类主观评价
而在谷歌2015年的论文《Show and Tell: A Neural Image Caption Generator》中我们可以看到:在表1中,实验使用了微软的COCO数据集,3中评价标准的得分,谷歌NIC模型的得分和人类(Human)得分是不相仲伯的。在表2中,基于不同数据集统一计算BLEU-1得分,NIC的得分和人类得分也比较接近。是不是很牛了?
然而难能可贵的是人家马上就自己打自己的脸!在装了逼后,作者们马上开始说实话。补充了一个基于人类判断的实验,邀请人类对于自己生成的标准语句进行评级,一共分成4个等级:
如上图所示,分成“描述没有错误”、“描述中有点小错误”、“多少还是和图像相关”和“和图像无关”4个等级,分别得分从4到1。那么,真实的对比就来了:
上图中,x坐标是BLEU得分,y坐标是表示积累分布(也就是说,输出的描述语句集合中,有百分只多少的得分大于当前的x)。其中:
- Flickr-8k:NIC表示的是使用NIC模型在Flick8k测试集上跑的结果的得分曲线;
- Pascal:NIC表示的是是使用NIC模型在Pascal测试集上跑的结果的得分曲线;
- COCO-1k:NIC表示的是是使用NIC模型在COCO-1k测试集上跑的结果的得分曲线;
- Flickr-8k:ref表示的是另一篇论文的结果的得分曲线,这里作为一个基准;
- Flickr-8k:GT表示的是对Flickr-8k图像的人工标注语句同样进行人工分等级评价的结果。
由此可见:虽然自动裁判员BLEU-4认为NIC模型的得分超出了人类得分,但是如果让人类来当裁判员,NIC还差得远哪!
效果展示
一些惨不忍睹的错误(来自网络)
论文中官方提供的效果
效果实测
感想
- CNN强大!效提取图片中的feature map,将图片向量化
- attention用在图片识别过程中,不仅能完成seq2seq的任务,还能针对每一个单词给出热力图,提高了模型可解释性
- 算力与数据集非常重要!
- CV与NLP的基础思想是一致的
展望
- 更好的自动评价标准。这里个更好,是指的能够和人类评价相关性更高
- 更大的数据集。图像更多,图像对应标注句子更多
- 在图像分析部分,语言生成部分,或者两个部分的连接方式上出现新的模型或思路
- 图像分析部分进行优化,比如:使用更加优秀的图像数据集,物体/场景/情感…..识别方法,提取出更为丰富的特征
- 优化文本生成方法,使用提取到的关键词,合成整句
- 文本生成语法问题
发表回复