本文是Facebook AI Research发表在CVPR2019,是一篇很有意思的论文。
人们喜欢美食摄影是因为他们欣赏美食。每顿饭的背后都有一个复杂的食谱描述的故事,不幸的是,仅仅看一个食物的图片,我们无法了解它的制作过程,在本文中介绍了一个逆向烹饪系统,它可以重建给定食物图像的烹饪食谱。通过一种新颖的体系结构来预测食材的组合,在不引入任何顺序的情况下对其依赖关系进行建模,然后通过同时处理图像及其推断出的食材生成烹饪指令。论文在大型Recipe1M数据集上对整个系统进行了广泛的评估,结果表明:(1)改进了以前的成分预测基线;(2)通过图像和配料的杠杆时效,获得高品质的配方;(3)与基于检索的方法相比,系统能够根据人类的判断生成更多引人注目的菜谱。论文代码已开源。
整个系统的流程图如下:
该系统使用ResNet-50对美食照片进行图片特征
e
I
e_I
eI提取,即图中的以
θ
I
\theta_I
θI为参数的Image Encoder,然后通过Ingredient Decoder对食材图片特征向量进行食材预测,接着将预测出的食材通过简单的embedding层转化为定长的向量。烹饪流程模块(Instruction Decoder)由Transformer block组成,
Cooking Instruction Transformer
每个Transformer block由两层attention layer和一个linear layer组成,结构如图3(a),该结构和论文Attention is all you need中的结构类似,。但是为了综合图片和食材信息进行烹调流程生成,实现多模态的attention,对attention layer进行了改变:第一层attention layer对之前的输出进行self-attention,这和原始Transformer一致;第二层attention layer为了对第一层的self-attention进行细粒度提取,改变成有条件的attention,这一层的attention受两个约束:一是图片特征
e
I
∈
R
P
×
d
e
\mathbf{e}_{I} \in \mathbb{R}^{P \times d_{e}}
eI∈RP×de,二是食材嵌入(ingredients embeddings)
e
L
∈
R
K
×
d
e
\mathbf{e}_{L} \in \mathbb{R}^{K \times d_{e}}
eL∈RK×de,其中P和K分别表示图像数目和成分特征,
d
e
d_e
de为嵌入维数。为了同时进行多模态融合,文中尝试了三种融合结构,即图3(b),3©,3(d)。最终的实验发现Concatenated方式效果最好。
### Ingredient Decoder
对于如何表示食材(Ingredient),文中探索了集合(set)和列表(list)两种探索,其中集合中食材是无序的,列表中食材是有顺序的。产生食材也是使用Transformer。在集合方式中为了消除顺序,文章对不同时间步的输出进行max-pooling,见图四:
优化
两阶段方式训练该架构:在第一个阶段,对图像编码器和成分解码器进行预训练,如第3.2节所示。在第二阶段训练成分编码器和指令解码器后,通过最小化负对数似性和调整 θ R , θ E \theta_R,\theta_E θR,θE。在训练过程中,指令解码器将ground truth成分作为输入。除Set Transformer外,所有Transformer模型均由teacher forcing进行训练。
实验效果
文中给出的代码链接中有jupyter notebook的demo,我尝试了一下:
再来一个中餐的酱爆鱿鱼圈,完全不对了,哈哈
本文的亮点
- 文本生成完全摒弃了RNN,而改用该强大的Transformer
- 如何对attention进行改造,从而融合多模态信息
- 分阶段训练模型