FoodAI:基于深度学习的食品图像识别与记录系统
Posted FoodAI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FoodAI:基于深度学习的食品图像识别与记录系统相关的知识,希望对你有一定的参考价值。
作者 | 梁瑞
今天给大家介绍一篇由新加坡管理大学信息系统学院生活分析研究中心(LARC) 和Salesforce亚洲研究院合作,于前段时间在ACM SIGKDD知识发现和数据挖掘会议上汇报的一篇会议文章。文章中作者提出了一种智能食物记录系统:FoodAI,使食物记录变得便捷,帮助人们实现智能消费和健康的生活方式。
1 介绍
食物消费对我们的影响是多方面的,包括健康、文化、行为、偏好和许多其他方面。特别注意的是,饮食习惯是导致社会上普遍存在几种与健康有关的疾病的主要原因之一。因此,跟踪食物的消费行为,不仅帮助个人预防疾病,而且使患有这些疾病的人更好地管理自己的健康。在新加坡,已经开展了FoodAI项目,将糖尿病确定为需要解决的主要问题,并朝着这一目标采取了若干措施。我们知道,已经有许多方法可以管理糖尿病(例如定期健康检查,坚持接受药物治疗等),其中一个主要组成部分就是有效地监控饮食。此外,有效地监控饮食可以很好地预防与饮食有关的疾病,也可以帮助健身爱好者实现他们的体重目标。
控制饮食的传统方法是写一份食物记录,这样的方法很乏味,需要用户大量的手工工作。这样的工作效率也非常低,不仅从日志记录的角度来看是这样,从数据分析的角度来看也是这样。因此,以这种方式获取可操作性变得非常困难。另一个主要问题是,个人对其所消费的食品要有充分的了解。因为用户需要努力识别他们所消费的不熟悉的食品的信息,包括其营养成分。当物品名称是用不同的语言写的或描述性很差时,这就特别困难了。
随着对智能和自我跟踪设备的日益依赖,对减轻个人跟踪行为的创新技术的需求也越来越大。一个最普遍的例子是使用智能手机和健身手环来监测身体活动(步数、行进距离、运动等)。顺应这一趋势,作者提出利用智能手机的便捷性,并通过基于深度学习的食物图像识别系统FoodAI为其赋予功能,以构建智能食物记录系统。该方法克服了传统记录技术的局限性,并允许进行非常有效的记录。整个系统架构作为API服务进行部署,前端具有移动应用程序或网络界面。在后端,将训练好的深度神经网络模型存储在存储在推理引擎中。还有一个用于存储服务用户捕获的图像以及在网络数据抓取过程中收集到的公共食品图像数据库。在离线阶段,收集并注释了一个大规模数据集,并使用最新的图像识别深度学习模型对该数据集训练了一个预测模型。用户通过API访问食品图像识别服务。作者的主要合作伙伴新加坡健康促进委员会开发了“健康365 ”应用程序帮助用户保持健康的生活方式。该应用程序的主要组成部分是饮食日志,供用户跟踪其食物消耗。该饮食日志由后端的FoodAI提供支持。进餐时,用户可以拍摄进餐的图像并将其记录下来。图1显示了此应用程序的工作原理的屏幕截图示例。随着时间的推移,用户可以监控自己的饮食习惯,热量摄入和消耗等。在建设智能国家的时代,FoodAI为社会提供了解决智能消费和健康生活方式的方案。
FoodAI可以识别756种不同种类的食物,包括主菜、饮料和小吃。从公共网络搜索结果中抓取了包含近40万幅图像的食品图像数据集,并对其进行人工标注,以构建训练语料库。从756个类别中收集了100个类别,重点关注新加坡常见食品(每个类别500张图片)。作者做了大量的工作来管理这个数据集,并且还开发了一些方法来有效地将新的食物类引入到系统中(或者移除或合并现有的类)。使用在ImageNet上预先训练并在数据集上进行微调的模型。基于训练验证分割,该方法达到了83%的前1精度和95%的前5精度。该模型被部署为API服务,每天定期接收来自100多个本地和国际组织、大学和初创企业的多个API请求。作者经常监视这些请求并研究模型的性能。对使用模式进行了广泛的定性和定量分析,并据此不断努力提出可操作的见解,以持续改进系统。
2 相关工作
食品计算近年来已经发展成为一个热门的研究课题。智能手机和社交媒体的普及,大量与食物相关的信息经常被分享到网上,导致作者可以访问丰富的异构信息来完成一些重要任务。尤其是,这使团队有机会对食品相关主题进行广泛的分析。
其中最重要的任务之一是利用深度学习进行食物图像识别。其中许多技术依赖于最近在视觉识别方面的深度学习的成功,并使用这些最先进的模型来训练一个可以识别各种食物的深度卷积网络。利用它们的特征提取能力,研究人员将预先训练好的ImageNet模型应用到他们自己的食物数据集中。最近的一些例子包括。在建立食物图像识别模型的各种努力中,FoodAI在最大的食物数据集上进行了识别任务训练,其中包含近40万张图像。
除FoodAI之外,还有几种现有的商业和学术食品图像识别系统可用于减轻传统移动食品日志记录的负担。其中包括CalorieMama,AVA,Salesforce Research's Food Image Model,Google Vision API,Amazon Rekognition等。据作者所知,FoodAI是最全面的食物图像识别解决方案,能够识别超过756种不同的视觉食物类别(超过1,166种食物),特别是涵盖了广泛的东南亚美食和一般亚洲美食。
3 FOOD-AI
3.1 构建食物图像集
在早期,主要目标是建立包含多个食物图像的强大数据集。特别注意了新加坡通常消费的食品。首先定义了152种代表食品和饮料通用类型的“超级类别”。其中一些超级类别是:啤酒、炒饭、烤鸡、冰淇淋等等。对于每个超级类别,确定了几个可能属于该类别的食物。例如,水果超级类将菠萝、菠萝蜜和荔枝作为食物。理想情况下,这是类的总数。然而,事实证明,很多东西是无法从视觉上区分的。因此,引入了视觉食物的概念,以进一步根据视觉相似性将食物分类。通过对图像进行视觉检查并咨询领域专家,将1166种不同的食品合并为756种视觉食品类别。还为非食品项目添加了一个类别,为此从ImageNet数据集中随机抽取了大约10,000张不同的图像。预测模型将被训练来对这些视觉食物类别进行预测。在需要应用程序级别进行更细粒度预测的情况下(例如,在食物记录期间),用户可以选择从所做的预测中手动选择一个子项目。例如,给定咖啡饮料的图像,该模型将预测咖啡加牛奶,用户可以进一步选择加糖还是不加糖。由于作者的目标市场主要是新加坡,所以特别关注新加坡的大众消费食品。在152个类别和756个视觉食品类别中,有8个类别(如印度、中国、马来等)和100种视觉食品是为此目的而定制的。在数据集收集过程中,确保这100种视觉食物中的每一种至少有500张图像(总计65,855张图像)。
每种食物类别图像Google,Bing,Instagram,Flickr,Facebook和其他社交媒体上抓取收集的。手动审核了这些图像,以确认每个抓取的图像是否属于要搜索的食物类别。基于利益相关者的要求和不断改进美食的努力,作者会继续更新数据集,包括新的图像和视觉美食类。目前,有756种视觉食物,总共包含约40万幅图像。每个视觉食物至少有174张图片,最多有2312张图片。然后将数据集分割成训练数据、验证数据和测试数据,用于训练和评估模型。数据集(即FoodAI-756)概述在图2中。
3.1.1食品标注管理系统(FAMS)
原来的图像抓取过程是劳动密集型的,效率很低,需要用户手动查询一个搜索项,并选择适当的图像来下载一个给定的食品类别。为了缓解这些问题并简化过程,开发了一个基于网络的自动抓取和标注食物图片的工具——食物注释管理系统(FAMS)。注释者将通过FAMS定义并提交关键字列表(例如,食品)。然后,后端爬虫程序将检索几个缩略图,并将它们以FAMS的形式呈现给注释者。检索到的图像数量基于用户提供的输入。然后,注释者能够查看一些缩略图,并能够为给定的关键字快速识别相关图像。之后,注释者确认标签,全尺寸图像自动下载并保存到数据库中。图3显示了一个为橙汁收集图像的示例。在FAMS中有两个重要的角色:管理者和注释者。管理者管理注释过程,并将注释任务分配给一个或多个注释器。注释者完成管理者分配的任务。在管理者确认了注释结果后,FAMS启动从各种源到后端下载全分辨率图像的程序。最后,新的带注释的图像与现有的数据合并,形成一个新的训练集。
3.2 训练模型
随着深度学习在视觉识别方面的成功,使用深度卷积网络作为识别食物图像的模型。
3.2.1 特征迁移用于图像识别
近年来,人们发现与从头开始训练新模型相比,使用在ImageNet数据集上预先训练的网络并将其迁移到其他数据集对性能有显著提升。这是由于深度卷积网络能够学习适用于几种计算机视觉任务的一般特征。在成功之后,使用预先训练好的ImageNet模型,并在食物数据集上对它们进行微调。在该项目的过程中,作者尝试了几种模型,并随着新的最先进的模型的更新而进行了更新。在FoodAI上的早期迭代中,尝试了更老的模型,如AlexNet,VGG, GoogLeNet。在本文中,将注意力集中在更近期的模型上,并报告了它们的性能:ResNet、ResNeXt和SENet 。作者也考虑了DenseNet,但发现其性能与ResNet模型相当。在培训过程中,采用了标准的数据增强方法,如旋转、随机裁剪、随机对比等。
3.2.2 数据集中的分类不平衡
FoodAI数据集中面临的一个具体问题是数据极其不平衡,即每个类的实例数量有巨大的差异(参见图2中的实例分布直方图)。这种不平衡会导致模型偏向于那些有更多数据的类别,即使这些食物相对容易分类。为了解决这个问题,在训练阶段将传统的交叉熵损失修改为焦点损失。这种损失将动态地改变实例损失的规模,以便在训练期间将注意力更多地集中在困难的实例上。具体来说,相反通过使用交叉熵,将损失修改为:
F L(pt) = −αt(1−pt)γlog(pt)
α是平衡来自不同类别的样本的权重的因素,γ>0是聚焦参数,其基于样本分类的容易程度来调节样本的重要性。如果样本易于分类,其重要性就会降低。
3.3系统构建与运用
在后端训练了模型之后,将FoodAI模型运用到生产中。
3.3.1 系统构建
FoodAI已经被部署为一个可以通过HTTP/HTTPS协议访问的RESTful web服务。在前端,客户端是独立于平台和语言的。根据客户的业务需求,它可以是移动应用程序、web应用程序或桌面应用程序。在后端,Apache nginx web服务器负责接收用户请求,并重定向到UWSGI web应用网络服务器。UWSGI调用Caffe推理引擎来获取食物预测分数,并将其返回给Nginx web服务器,后者将响应返回给用户。FoodAI 网络服务使用的是具有Flask框架的Python编写的。
FoodAI网络服务主要提供分类和反馈两个界面。分类接口接收HTTP/HTTPS请求,包括URL的图像或图像数据,并将数据和图像保存到数据库中,返回分类结果。反馈接口接收用户对分类结果的反馈并保存到数据库中。在FoodAI中,使用MongoDB作为数据库。分类接口同时支持GET和POST方法。反馈只支持GET方法。为了进行食物图像分类,UWSGI将图像数据发送到Caffe推理引擎。Caffe推理引擎是用c++编写的,托管在web服务器上。web服务器在启动时加载FoodAI模型,并在GPU模式下进行推断。为了促进API服务和推理引擎之间的跨语言通信,使用Apache Thrift框架。Apache Thrift框架是一个可伸缩的跨语言服务解决方案,它在各种语言(如Java、Python、c++等)之间高效、无缝地工作。整个部署体系结构的概述如图4所示。
图4:FoodAI的系统架构。FoodAI作为API服务的端到端框架。
3.3.2 API服务的用户体验
使用FoodAI服务,用户必须在FoodAI网站(www.foodai.org)上登记自己的兴趣爱好。在请求获得批准后,将为它们分配一个API密钥。API密钥用于使用FoodAI服务时验证用户的身份。用户可以将FoodAI网络服务集成到自己的应用程序或独立于平台的系统中。API文档可以在FoodAI站上找到。将Json格式的响应返回给用户。Json对象包含如下属性:
食物结果:根据分类分数排列的前10个视觉食物名称列表
按类别排序的食物结果:按分类分数排序的前10个超级类别列表
非食物:显示图像是否为食物的指示器
查询ID:请求的查询id
状态码:响应状态的指示器
状态消息:基于状态代码的描述性消息
耗时:用于推断预测的时间
3.3.3 健康365 App的用户体验
新加坡健康促进委员会(HPB)是“FoodAI”项目的主要合作伙伴之一,他们将FoodAI的网络服务整合到他们的移动应用“健康365”上,在ios和android平台上都可以使用。HPB是一个致力于促进新加坡健康生活的政府组织,“健康365”使用者能够跟踪他们每天的热量摄入和消耗情况。当用户想要更新自己的饮食日志时,他们会给自己的饮食拍张照片,通过FoodAI系统进行识别。在进行必要的计算之后,FoodAI将返回一个按分类分数排序的视觉食物类别列表。然后,用户可以选择哪个视觉食物类别最能描述他们的膳食,并根据所选择的视觉食物决定进一步的变化(例如,加糖或不加糖的咖啡)。当然,如果正确的项目不在最佳的预测结果中,则用户可以自由输入自己选择的食物。记录用户的反馈,目的是监视FoodAI在现实世界中的性能,并帮助改善模型的性能。
4 实验与案例分析
4.1开发过程中对模型进行评估
这里给出了FoodAI在训练阶段的结果,在训练阶段评估了原始数据集测试数据的性能。
4.1.1预训练的ImageNet模型的微调性能
在FoodAI开发过程中,探索了几种模型,在本文中,给出了ResNet50、ResNet-101(50层和101层ResNet)、ResNeXT-50(50层)和使用ResNeXT-50训练的SENet的性能。在表1中给出了基本模型的结果。在所有模型中,SENet与ResNeXt-50组合得到的最佳的前1准确率为80.86%,最佳的前5准确率为95.61%。ResNet-101做得不是很好(可能是由于收敛的挑战)。还考察了模型的推理速度,发现可以以每秒80-120幅图像的速度对50层模型进行预测,或者在0.01秒内生成1幅图像。这相当快,因此返回给用户的端到端推理结果取决于将映像传输到服务器和返回结果的往返延迟。对于50层模型,模型占用了接近100MB的空间。由于此模型将仅存储在服务器上,因此该模型不会造成内存约束。
表1:FoodAI-756数据集上各种模型的性能。这些模型在ImageNet上进行了预训练,并在数据集中进行了微调。SENet和ResNeXt的组合给出的top-1准确性为80.86%。还将查看推论(测试速度)和模型大小,以帮助做出权衡速度和性能的实际决策。最佳性能以粗体显示。
4.1.2合并焦点损失后的性能
在表2中给出了进行焦点损失模型训练的结果。由于焦点损失的使用,已经改进了模型的收敛到一个更好的优化。通过结合SENet和ResNeXt-101,获得了83.2%的最高准确率,超过了之前最好的80.86%。这证明了在像FoodAI-756这样的不平衡数据集上,通过在训练过程中动态改变损失的规模,并降低简单示例的重要性,焦点损失能够提高性能。
4.1.3测试数据集上的性能
接下来,进一步研究一些结果,以获得新的见解,把重点放在了最容易被错误分类的例子上。目标是理解为什么这些特定的类会被错误地分类。这可能是我们训练策略中的一个缺陷吗?是因为数据太难还是噪音太大?是不是因为这些类看起来都很相似?或者可能是这些因素的组合。在许多情况下,从视觉食物的名称,可以看到一些项目和他们的预测有非常相似的成分,从而导致混淆。特别地,表中的第一行显示了预测没有汤(干)的带有汤的同一道菜。对此的一种可能解释是,数据集具有干式菜肴的实例比汤式菜肴的实例更多。另一个有趣的例子是最后一行:Mee Kuah和Mee Rebus。在图5中可以看到这两个类的图像,它们看起来非常相似。在收集数据集时,假设这些应该是不同的类别。经过进一步的研究,发现这些类别通常被认为是同一项。这意味着要把它们合并成一种视觉食物。
4.2生产环境下模型的评估
系统每天大约接收几个API调用。正如预期的那样,白天有3个使用高峰,一个高峰在早上7点左右,一个高峰在午餐时间,从中午12点到下午2点,另一个在晚餐时间从6点到晚上8点。在这里,介绍了用户对查询数据的分析结果。
4.2.1模型的性能
如何在现实世界中衡量模型的性能?一种方法是手工注释查询的数据,并将其与模型预测进行比较。这个办法非常昂贵,有两个原因:
(一)它需要大量的人工,这很费时;
(二)标注过程需要一位熟悉所有756种视觉食品类别(适用于各种美食)的专家,要找到/聘用此类专家进行标注并非易事。请注意,注释这些图像比收集它们困难得多。这是因为在数据收集过程中,只查询一个关键字并立即检索几个需要粗略外观才能确认的图像。在用户查询的情况下,注释者必须查看一个图像并将其分配为756个类别之一(其中一些在视觉上非常相似)。
衡量模型性能的另一种方法是基于用户给出的反馈。尽管没有收到所有查询的反馈,但这是一个有用的指标。根据反馈,在前1位准确性中的得分约为50%,在前5位准确性中的得分约为80%。可能有几个因素会导致现实世界中的性能比测试数据集更差。假设以下可能的原因(并非详尽无遗):
域转移。可能是查询数据和训练数据分布不同。作者的数据相对更干净,与用户拍摄的真实世界照片相比,质量更高。这种域转移可能会导致模型性能下降。
数据查询质量差。与域转移密切相关的是图像查询质量差。许多用户可能提交质量差的查询(例如,颠倒的图像、大部分食物被消费等)。这些图像会导致模型性能不佳。
不同的不均衡分布。如前所述,FoodAI-756数据集是高度不平衡的,在学习的模型中产生了偏差。这种偏差可能会影响现实世界中的模型性能,在现实世界中,每个类查询的实例分布可能与训练数据集中的实例分布不同。
反馈质量差。用户可能对食品不了解,所以可能会给出任意的反馈。他们也可能有意“玩弄”这项技术,故意给出错误的反馈。
接下来,将通过案例研究来探究其中的一些因素
4.2.2用户查询分析
首先查看用户发送的一些查询,并确定一些关键属性。在图6中展示了几个示例,其中根据相关的挑战将它们分为8个类别。虽然有几个查询很容易分类(A),但仍存在许多挑战,包括类间相似性(B)、类内多样性(C)、不完整的食物(D)、非食物(E)、拍摄不佳的照片(F)、多种食物(G)和未知的食物(H)。详细描述见标题。
4.2.3查询图像与数据集
在这里,提出了几个基于想要调查的食品行为的案例研究。
案例研究1。想探索一些在用户查询数据上性能非常差的情况(而在开发阶段测试数据的性能是合理的)。考虑了两种情况:豆奶和肉末豆腐。将用户查询的一些示例和FoodAI-756数据集中的示例可视化,如图7所示。在豆奶的例子中,很明显查询数据与作者的数据完全不同,因为用户查询的是纸箱,而作者的模型是在实际牛奶上训练的。因此,结果并不令人惊讶,作者应该潜在地考虑包装商品中的任何文本,以尝试提高预测。在用肉末豆腐的情况下,查询集和作者的数据出现了一个域转移,这可能以域自适应技术来克服。
案例研究2。还想探索这样一个场景,即前1的准确率很低,但前5的准确率非常高。这样的场景可以让作者了解用户最令人困惑的食物,还可以突出用户可能给作者错误反馈的情况。在图8中,展示了两个例子: (一)对虾干面的前1预测是福建面。两者都具有相似的成分,并且有可能由于与用户查询数据相比,训练集中每个类的实例数量不同,导致模型存在偏差; (二)对鱼汤也有类似的解释,它的前1预测主要是鱼汤混合配料海鲜。请注意,很难验证类不平衡假设,因为这需要我们手动标记大量的查询数据。
5 结论与未来方向
FoodAI是一个基于深度学习的食品图像识别系统,用于智能食品记录。FoodAI通过促进基于照片的食品日志,帮助减轻人工记录在线食品日志的负担。该系统已经过培训,可以识别756种不同类型的食物,特别是涵盖新加坡常见的各种菜肴。作者已经进行了几次实验来训练一个依靠最先进的视觉识别方法的强大模型,并通过结合焦点损失来进一步提高性能。分析了如何定期更新数据集,以及如何在开发过程中根据模型性能获得可操作的见解。这项技术已经部署,有几个组织和大学使用这项服务。新加坡健康促进委员会是作者的主要合作伙伴之一,该委员会已将FoodAI整合到 “健康365”应用程序中。每天要处理多个API调用,还进行了广泛的分析和案例研究,以深入了解模型在现实世界中的表现。
作者也在寻求新的研究和发展方向。其中一个主要的挑战是是如何随着新食品的流行而更新模型。重新训练模型可能非常昂贵且耗时。为了减轻这种情况,正在探索长期学习解决方案。一个相关的想法是,如果新类的数据非常有限,如何扩展模型以识别该类?正在考虑采用小样本学习技术来做到这一点。由于食品种类繁多,因此不可能保持详尽无遗的清单。另一种计算卡路里消耗量的方法是直接从图片中估算卡路里。正在探索的一个相关任务是在食物图像和烹饪食谱之间进行跨模式检索,希望检索给定图像的食谱(从食谱中估计营养和卡路里消耗更容易)。作者也在研究更健康消费的激励策略和食物推荐,正在努力将FoodAI的研究扩展为一个可行的解决方案,以帮助智能消费和健康的生活方式。
| 参考文献
Sahoo D, Hao W, Ke S, et al. FoodAI: Food image recognition via deep learning for smart food logging[C]//Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2019: 2260-2268.
以上是关于FoodAI:基于深度学习的食品图像识别与记录系统的主要内容,如果未能解决你的问题,请参考以下文章
基于图像识别与深度学习的无人机配网线路智能巡检系统在青藏高原顺利应用
步态识别基于深度学习的步态识别系统的MATLAB仿真,包括ALEXNET,改进CNN,GOOGLENET