食物图片变菜谱:这篇CVPR论文让人人都可以学习新料理
根据 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论文让人人都可以学习新料理的更多相关文章
- CVPR 2020目标跟踪多篇开源论文(上)
CVPR 2020目标跟踪多篇开源论文(上) 1. SiamBAN:面向目标跟踪的Siamese Box自适应网络 作者团队:华侨大学&中科院&哈工大&鹏城实验室&厦门 ...
- CVPR 2020目标跟踪多篇开源论文(下)
CVPR 2020目标跟踪多篇开源论文(下) 6. Cooling-Shrinking Attack: Blinding the Tracker with Imperceptible Noises 作 ...
- CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析(附源代码)。
四年前第一次看到<100+ Times FasterWeighted Median Filter (WMF)>一文时,因为他附带了源代码,而且还是CVPR论文,因此,当时也对代码进行了一定 ...
- Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...
- 如何起草你的第一篇科研论文——应该做&避免做
如何起草你的第一篇科研论文——应该做&避免做 导语:1.本文是由Angel Borja博士所写.本文的原文链接在这里.感谢励德爱思唯尔科技的转载,和刘成林老师的转发.2.由于我第二次翻译,囿于 ...
- 如何把图片变得炫酷多彩,Python教你这样实现!
有趣的图片 如何能让图片变得好玩?首先需要让它动起来!可如果是多张图片,我们还可以将其拼接起来组成gif动图,可一张图怎么玩?记得之前写过一个小练习,把一张图片拆分成九宫格的分片图.那么,能否由此下手 ...
- CSS3实现鼠标移动到图片上图片变大
CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义 <!DOCTYPE html><html> <head&g ...
- CSS使图片变灰
为了悼念,各大网站都纷纷将自己的站点颜色调灰,就连图片也一样,到底如何实现的呢,请看下面的代码. 〈img src="http://hovertree.com/hvtimg/201512/f ...
- CSS实现图片变灰色及透明度
[图片变灰] 每当遇到哀悼日,很多网站快速变灰色,来看看实现方式吧: 方式一,仅支持ie) html{filter:progid:DXImageTransform.Microsoft.BasicIma ...
随机推荐
- C++走向远洋——56(项目二1、动物这样叫、虚函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information does not match signer information of other classes in the same package
最近在写个Http协议的压测挡板时,遇到以下错误. 2018-03-08 10:34:07.808:INFO:oejs.Server:jetty-8.1.9.v20130131 2018-03-08 ...
- 下一代网际协议IPv6
下一代网际协议IPv6 一.解决 IP 地址耗尽的措施 从计算机本身发展以及从因特网规模和网络传输速率来看,现在 IPv4 已很不适用. 最主要的问题就是 32 位的 IP 地址不够用. 在 2019 ...
- 读书笔记-《Mysql技术内幕》
MYSQL 技术内幕 Mysql体系 连接池组件 管理服务和工具 SQL接口 查询分析器 优化器 缓冲 插件式存储引擎 物理文件 存储引擎 InnoDB(默认引擎) 支持事务 行锁设计 多版本并发控制 ...
- MVC08
1. c# 索引器(indexer) using System; using System.IO; namespace IO { class Program { ]; static void Main ...
- JS基础入门篇(十八)—日期对象
1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...
- Java基础篇(02):特殊的String类,和相关扩展API
本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...
- spring boot Shiro JWT整合
一个api要支持H5, PC和APP三个前端,如果使用session的话对app不是很友好,而且session有跨域攻击的问题,所以选择了JWT 1.导入依赖包 <dependency> ...
- TCP断开连接(四次挥手)
四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...
- GoJS学习笔记 (转)
目录 基础概念 开始绘制图形 1. 通过代码构建图形 2. 通过 GraphObject.make 构建图形 3. 使用 Model 和 Templates 创建图形 获取图形数据 获取所有 Node ...