根据 Facebook 的统计,Instgram 上的美食图片数量已经超过 3 亿张。然而,获取食物烹饪方法的途径依然有限,例如,通过烹饪网站或相关教程。怎样能够挖掘丰富食物图片背后的烹饪方法,让每个人都可以在家方便地学习新菜式呢?

Facebook 研究团队最近在 CVPR 2019 发表论文,提出了一种新思路。用户可以输入食物图片,并获得对应的食材和制作方法。在用户实验上的结果说明,用这种方法烹饪食物的成功率,比传统检索方法成功率更高。

看美食图片就能知道食谱?这个 AI 比美食家还灵么?

喜欢研究吃的人经常会在看到美味食物甚至食物图片时垂涎不已,甚至千方百计想弄明白怎么才能做出这道美食。

最近,Facebook 提出了一种 AI 方法,能够根据美食图片直接生成食谱!天啊,简直满足了天下爱吃且爱做饭的人的心愿啊~

这张图片中左侧为原图;右侧显示了食物名称、原料,甚至还有操作说明。有了这个 AI,只需要有美食图,就可以准备做饭,不用再费力查找食谱啦~

目前,Facebook 已经把这个项目开源了:

GitHub 地址:https://github.com/facebookresearch/inversecooking

reddit 用户 JonathanFly 将该项目做成了一个 Colab demo,参见:

https://gist.github.com/JonathanFly/33946a08080041e90e8360b25e263a4e#file-facebook-cooking-demo-ipynb

还用非食物的图片进行了尝试,结果令人捧腹。

比如,如果你使用皮卡丘的图片,这个系统会告诉你「皮卡丘的食谱」:

「皮卡丘」竟然被认成了万圣节幽灵饼干!原来皮卡丘是烤制而成的~

从图像到食谱,如何实现?

从图片中生成食谱需要同时理解组成食材和制作的过程(如切片、和其他材料搅拌等)。传统方法将这个问题视为检索任务,基于输入图片和数据集图片的相似度计算,将食谱从一个固定的数据集中检索出来。很明显,传统方法在数据集缺少某种食物制作方法的情况下就会失败。

有一种方法可以克服这一数据局限,即将图片到菜谱的问题视为一个条件生成任务。研究人员认为,与其直接从图片中获取菜谱,不如首先预测食物的材料,然后基于图像和食材生成食物制作方法。这样可以利用图片和食材的中间过程获取一些额外信息。

模型

模型主要由两部分构成,首先研究人员预训练一个图片编码器和一个食材解码器(ingredients decoder),提取输入图像的视觉特征来预测食材。然后训练一个食材编码器(ingredient encoder)和烹饪流程解码器(instruction decoder),根据输入图片的图像特征和已经预测到的食材,生成食物的名称和烹饪流程。

模型架构如下图所示:

图 2:模型的结构。模型的输入是食物图片,输出的是烹饪方法序列,而中间一步是基于图像生成食材清单。

具体来讲,烹饪流程解码器使用了三种不同的注意力策略:

图 3:烹饪流程解码器使用的注意力策略。Transformer 模型(a)中的注意力模块被替换成了三种不同的注意力模块(b-d),用于多种条件下的烹饪说明。

效果如何?

研究人员使用 Recipe1M [45] 数据集来训练和评估模型。该数据集包括从烹饪网站上爬取的 1,029,720 个食谱。在实验中,研究者仅使用了包含图片的食谱,并移除了使用少于两种食材或两道流程的食物。最终,实验使用了 252,547 个训练样本、54,255 个验证样本和 54,506 个测试样本。

研究人员对比了传统的检索方法和该研究提出的新方法,结果如下:

表 3:基线方法和论文方法的对比。左图为 IoU 和 F1 分数,右图为食材在烹饪指南上的精确率和召回率。

研究人员还进行了用户测试。他们从测试集中随机选择了 15 张图片,让用户根据提供的图片选择 20 种食材,并写下可能图片对应的菜谱。为了减少人类任务的复杂度,研究人员提高食材使用频率的阈值,减少了食材的选择数量。

表 4:用户测试。左图为基线方法、人类和论文方法判断食材的 IoU 和 F1 分数,右图为根据人类判断,这三种方法生成食谱的成功率。

实验结果说明,使用 AI 生成的食谱比检索方法生成的食谱效果更好。

这样的研究只是造福吃货吗?

这项研究通过对食物图片的研究,可以进一步猜测其食材和加工方式。这可以进一步方便人们学习新的食物制作、协助计算食物中每种成分的卡路里、创造新的菜谱。同时,该研究采用的方法可以进一步启发「根据图片预测长文本」的研究。

更何况,再也不用看着社交媒体上的美食流口水了。扫图出菜谱,人人都可以学着做~

参考链接:https://ai.facebook.com/blog/inverse-cooking/

https://www.reddit.com/r/MachineLearning/comments/c1tb5m/p_using_ai_to_generate_recipes_from_food_images/

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

食物图片变菜谱:这篇CVPR论文让人人都可以学习新料理的更多相关文章

  1. CVPR 2020目标跟踪多篇开源论文(上)

    CVPR 2020目标跟踪多篇开源论文(上) 1. SiamBAN:面向目标跟踪的Siamese Box自适应网络 作者团队:华侨大学&中科院&哈工大&鹏城实验室&厦门 ...

  2. CVPR 2020目标跟踪多篇开源论文(下)

    CVPR 2020目标跟踪多篇开源论文(下) 6. Cooling-Shrinking Attack: Blinding the Tracker with Imperceptible Noises 作 ...

  3. CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析(附源代码)。

    四年前第一次看到<100+ Times FasterWeighted Median Filter (WMF)>一文时,因为他附带了源代码,而且还是CVPR论文,因此,当时也对代码进行了一定 ...

  4. Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

    前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...

  5. 如何起草你的第一篇科研论文——应该做&避免做

    如何起草你的第一篇科研论文——应该做&避免做 导语:1.本文是由Angel Borja博士所写.本文的原文链接在这里.感谢励德爱思唯尔科技的转载,和刘成林老师的转发.2.由于我第二次翻译,囿于 ...

  6. 如何把图片变得炫酷多彩,Python教你这样实现!

    有趣的图片 如何能让图片变得好玩?首先需要让它动起来!可如果是多张图片,我们还可以将其拼接起来组成gif动图,可一张图怎么玩?记得之前写过一个小练习,把一张图片拆分成九宫格的分片图.那么,能否由此下手 ...

  7. CSS3实现鼠标移动到图片上图片变大

    CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义 <!DOCTYPE html><html> <head&g ...

  8. CSS使图片变灰

    为了悼念,各大网站都纷纷将自己的站点颜色调灰,就连图片也一样,到底如何实现的呢,请看下面的代码. 〈img src="http://hovertree.com/hvtimg/201512/f ...

  9. CSS实现图片变灰色及透明度

    [图片变灰] 每当遇到哀悼日,很多网站快速变灰色,来看看实现方式吧: 方式一,仅支持ie) html{filter:progid:DXImageTransform.Microsoft.BasicIma ...

随机推荐

  1. ArrayList集合不能使用foreach增加、删除、修改元素的原因

    大家先看两段代码 第一段代码: List<String> arrayList1 = new ArrayList<String>(); arrayList1.add(" ...

  2. webpack里的externals

    最近在用webpack做一些是sdk相关的东西,有几个概念总结一下: 1.library要做sdk,一定要做的一个配置,用于说明最终的SDK暴露给调用者的一个名称例如:library: 'HelloJ ...

  3. JS 获取一段时间内的工作时长小时数

    本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...

  4. almost最好的Vue + Typescript系列02 项目结构篇

    基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 p ...

  5. 关于javascript 的reduce方法

    作为一个前端菜鸟,觉得资料比较好,特地分享一下~~ reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. 你一定也和我一样看的有点 ...

  6. python笔记28(TCP,UDP,socket协议)

    今日内容 1.TCP协议 协议的特点:三次握手,四次挥手: 2.UDP协议 3.OSI七层模型:每层的物理设备,每一层协议. 4.代码部分: ①介绍socket: ②使用socket完成tcp协议的w ...

  7. for循环结合range使用方法

    range概念:表示一个数据范围 基本的语法格式:range(开始数据,结束数据(不包括结束数据),步长) 记住一个公式:下一个数据=开始数据+步长 步长:表示的是数据前后的间隔 OK,基本的概念和语 ...

  8. docker学习之路

    环境 : ubuntu 16.4 下载docker 首先使用命令行下载 docker wget -qO- https://get.docker.com/ | sh 启动 下载完成之后进行一个启动,但是 ...

  9. django 从零开始 9 自定义密码验证加密

    先上想法,想对数据库账号的密码进行一个加密,但是django文档中的加密方法set_password貌似是只针对他们默认的user模型 或者继承 AbstractBaseUser的模型有效 from ...

  10. Java集合02——三分钟了解你必须掌握的两个Set

    上一篇文章我们说到了 List ,本章开始,我们将继续讲解Set相关的知识.关注公众号「Java面典」了解更多 Java 知识点. Set 是一个无重复对象的集合类.值的重复与否是根据对象的 hash ...