本文所展示工作的目标是开发一种技术,用于从移动设备拍摄的图像中自动识别食物和饮料种类。该技术包含两种不同方法——第一种方法执行食物图像识别,第二种方法执行食物图像分割。
本文所展示工作的目标是开发一种技术,用于从移动设备拍摄的图像中自动识别食物和饮料种类。该技术包含两种不同方法——第一种方法执行食物图像识别,第二种方法执行食物图像分割。
由于手动膳食评估方法存在诸多问题且成本较高,因此需要采用自动化解决方案来简化和加快工作流程,并提高其质量。如今,自动化解决方案能够以更简单的方式记录个体的膳食摄入情况,例如通过智能手机摄像头拍摄图像。本文将重点介绍此类基于图像的膳食评估方法。在食物图像识别问题上,近年来深度神经网络已达到最先进的水平,我们将介绍本领域内的相关研究工作。具体而言,我们首先描述一种基于名为 NutriNet 的深度神经网络架构的食物与饮料图像识别方法。该方法与深度学习早期阶段大多数基于深度学习的食物图像识别研究类似,仅限于每张图像输出一个结果,因此不适用于包含多种食物或饮料的图像。正因如此,能够执行食物图像分割的方法具有更强的鲁棒性,因其能够在图像中识别任意数量的食物或饮料项目。因此,我们还介绍了两种食物图像分割方法——一种基于全卷积网络(FCN),另一种基于深度残差网络(ResNet)。
膳食评估是确定个体饮食中可干预环节的关键步骤。然而,采用传统的手动方法进行膳食评估往往伴随着较高的成本。这些方法还容易出现错误,因为它们通常依赖个体的自我报告。自动化的膳食评估通过提供一种更简便的食物摄入量化与定性方式,解决了上述问题。这种方法还能减少手动评估中存在的某些误差,例如遗漏餐次、无法准确评估食物体积等。因此,开发能够识别不同食物和饮料并量化食物摄入量的自动化解决方案具有明显优势1。这些解决方案还可用于估算食物和饮料项目(以下简称“食物项目”)的营养成分。因此,自动化膳食评估在多种应用场景中均具有实用价值——从严格的医学用途,例如帮助营养师更便捷、准确地追踪和分析患者的饮食,到面向大众的健康类应用程序中的使用。
从图像中自动识别食物种类是一项具有挑战性的计算机视觉问题。这主要是因为食物通常属于可变形物体,且在加工过程中可能丢失大量视觉信息。此外,不同食物在外观上可能非常相似,而同一种食物在不同图像中也可能呈现出显著差异2。同时,识别准确率还受到多种因素影响,例如图像质量、食物是否被其他物体遮挡、拍摄距离等。饮料类别的识别则面临其特有的挑战,其中最主要的问题是图像中可用的视觉信息有限。这些信息可能包括饮料的颜色、容器的颜色与结构,以及在理想成像条件下可观察到的饮料密度2。
为了从图像中成功识别食物项目,有必要学习每种食物和饮料类别的特征。传统上,这一目标是通过手动定义的特征提取器实现的3,4,5,6,这些提取器基于颜色、纹理、尺寸等特定项目特征或这些特征的组合来进行识别。此类特征提取器的示例包括多核学习4、成对局部特征5以及特征袋模型6。由于食物图像的复杂性,这些方法通常仅能达到较低的分类准确率——介于10%至40%之间3,4,5。其原因是手动方法的鲁棒性不足,难以实现足够高的准确性。由于食物项目的外观可能存在显著差异,因此无法通过人工方式涵盖所有这些变化。当减少食物类别数量5或结合不同的图像特征6时,使用手动定义的特征提取器可获得更高的分类准确率,这表明该问题需要更复杂的解决方案。
这就是深度学习在食物图像识别问题上被证明如此有效的原因。深度学习,或称深度神经网络,其灵感来源于生物大脑,它允许由多个处理层组成的计算模型通过对一组输入图像进行训练来自动学习特征7,8。正因如此,深度学习已在多个研究领域显著提升了技术水平7,其中计算机视觉以及随之而来的食物图像识别便是典型代表之一2。
特别是,深度卷积神经网络(DCNNs)在食物图像识别中最为流行——这些网络受到动物视觉系统的启发,其中单个神经元通过响应视觉场中的重叠区域来尝试理解视觉输入9。卷积神经网络接收输入图像,并在每一层网络中执行一系列操作,最常见的包括卷积层、全连接层和池化层。卷积层包含可学习的滤波器,用于响应输入数据中的特定特征;而全连接层则整合来自其他层的输出数据,以获得更高层次的信息。池化层的目标是对输入数据进行下采样2。在深度学习模型的应用中,有两种已被证实较为流行的方法:其一是采用现有的深度神经网络定义10,11,本文称之为深度学习架构;其二是设计新的深度学习架构12,13,并对其中任一种架构在食物图像数据集上进行训练。这两种方法各有优劣:使用现有深度学习架构时,可以选择在其他问题上表现良好的架构,并针对目标问题进行微调,从而节省时间并确保所选架构的有效性;而设计新的深度学习架构则更加耗时,但能够开发出专门针对特定问题特点设计的架构,从而在理论上对该问题具有更优的性能。
本文介绍了这两种方法。针对食物图像识别问题,我们开发了一种名为 NutriNet2 的新型深度卷积神经网络(DCNN)架构,该架构是在著名的 AlexNet 架构14 基础上改进而来。与 AlexNet 相比,NutriNet 主要有两点不同:其一,NutriNet 接受输入尺寸为 512×512 像素的图像(而 AlexNet 为 256×256 像素);其二,NutriNet 在神经网络的起始部分增加了一个卷积层。引入这两项修改的目的是尽可能从识别数据集的图像中提取更多信息。更高的图像分辨率意味着图像包含更丰富的信息,而更多的卷积层则有助于从图像中提取额外的特征知识。与 AlexNet 约 6000 万个参数相比,NutriNet 的参数数量更少,约为 3300 万个。这一差异是由于增加的卷积层导致第一个全连接层的维度不同所致2。图 1 展示了 NutriNet 架构的示意图。用于训练 NutriNet 模型的食物图像均收集自互联网,具体采集流程在实验方案文本中有详细描述。
针对食物图像分割问题,我们采用了两种现有的不同网络架构:全卷积网络(FCN)15 和深度残差网络(ResNet)16,在我们开发各自的食物图像分割方案时,这两种架构均代表了图像分割领域的最先进水平。Long 等人提出了多种 FCN 变体:FCN-32s、FCN-16s 和 FCN-8s15。FCN-32s 基于 FCN 最后一层的预测结果输出像素级分割图,而 FCN-16s 变体则将最终层的预测结果与前一层的预测结果进行融合。FCN-8s 进一步引入了另一个更早层的预测信息,因此能够实现更精细的分割粒度,这使其适用于食物图像识别任务。我们所使用的 FCN-8s 模型在 PASCAL 视觉物体类别(PASCAL VOC)数据集上进行了预训练17,并使用食物复制品图像(下文简称“仿真食物”)18 进行训练与测试,原因在于仿真食物在视觉上与真实食物高度相似,且目前缺乏像素级标注的真实食物图像。仿真食物被广泛应用于多种行为学研究中,并为所有研究参与者的每一道菜肴拍摄图像。由于这些图像中的食物成分是已知的,因此该图像数据集非常适合用于深度学习模型的训练。数据集的处理步骤在实验方案文本中进行了详细描述。
基于 ResNet 的解决方案是在食品识别挑战赛(Food Recognition Challenge, FRC)19 的框架下开发的。该方案采用混合任务级联(Hybrid Task Cascade, HTC)20 方法,并以 ResNet-10116 作为主干网络。这是一种针对图像分割问题的先进方法,可结合不同的特征提取器(即主干网络)使用。我们也考虑了其他主干网络,特别是其他 ResNet 变体,如 ResNet-5016,但 ResNet-101 因其网络深度以及能够以足够复杂的方式表征输入图像,成为最合适的选择。用于训练 HTC ResNet-101 模型的数据集为 FRC 数据集,并额外加入了增强图像。这些数据增强方法在实验方案文本中进行了详细说明。
本文旨在为机器学习专家提供参考资料,帮助其了解在食物图像识别与分割问题中表现优异的深度学习架构及数据增强方法;同时也为营养学研究人员提供参考,使其能够利用我们的方法实现食物图像识别的自动化,用于膳食评估。下文介绍了食物图像识别领域的深度学习解决方案及相关数据集。在实验方案部分,我们详细说明了如何使用三种不同方法训练深度神经网络模型,以实现自动化的膳食评估。此外,每个实验方案部分还描述了用于训练与测试的食物图像数据集的获取与处理过程。
深度卷积神经网络(DCNN)在食物图像识别与分割任务中的表现通常显著优于其他方法,因此该领域近年来的绝大多数研究均基于此类网络。Kawano 等人将 DCNN 用于补充人工方法21,在 UEC-FOOD100 数据集上实现了 72.26% 的分类准确率22。Christodoulidis 等人则完全依赖 DCNN,在自建数据集上达到了 84.90% 的更高准确率23。Tanno 等人开发了 DeepFoodCam——一款基于 DCNN 的智能手机食物图像识别应用程序24。Liu 等人提出了一种基于物联网的饮食评估系统,该系统利用 DCNN 进行分析25。Martinel 等人引入了一种基于 DCNN 的方法,充分利用了食物图像的特定特征26,并在 Food-101 数据集上报告了 90.27% 的准确率27。Zhou 等人撰写了一篇关于食品领域深度学习解决方案的综述28。
最近,Zhao 等人提出了一种专门用于移动应用中食物图像识别的网络29。该方法采用一个较小的“学生”网络,从一个较大的“教师”网络中学习。通过该方法,他们在 UEC-FOOD256 数据集上实现了 84% 的准确率30,在 Food-101 数据集上的准确率达到 91.2%27。Hafiz 等人使用深度卷积神经网络(DCNN)开发了一种仅针对饮料图像识别的解决方案,报告了高达 98.51% 的准确率31。Shimoda 等人描述了一种在食物图像中检测盘子区域的新方法,无需使用像素级标注32。Ciocca 等人引入了一个新数据集,包含来自 20 个不同食物类别、11 种不同状态(固体、切片、奶油状糊状物等)的食物样本,并提出了训练识别模型的方法,该模型不仅能识别食物类别,还能识别食物所处的状态33。Knez 等人评估了适用于移动设备的食物图像识别方案34。最后,Furtado 等人开展了一项研究,比较人类视觉系统与深度卷积神经网络(DCNN)的性能,发现人类识别的准确率(80%)仍优于 DCNN(74.5%)35。作者指出,当食物类别数量较少时,DCNN 表现良好;但在包含数百个类别的数据集上,人类识别的准确率更高35,这凸显了该问题的复杂性。
尽管深度学习取得了先进的成果,但它存在一个主要缺点——需要大量输入数据集来训练模型。在食品图像识别的情况下,需要一个庞大的食品图像数据集,该数据集应尽可能涵盖多种不同的真实场景。实际上,这意味着对于每一种具体的食品或饮料,都需要收集大量图像,并且数据集中应包含尽可能多的不同种类的食品。如果某种特定食品在数据集中的图像数量不足,则该食品很可能无法被成功识别。另一方面,如果数据集仅覆盖了少量食品种类,那么该解决方案的应用范围将受到限制,只能识别少数几种不同的食品和饮料。
过去已发布多个数据集。匹兹堡快餐图像数据集(Pittsburgh Fast-Food Image Dataset, PFID)3 的提出旨在推动食品图像识别领域的进一步研究。电气通信大学食品100(University of Electro-Communications Food 100, UEC-FOOD100)22 和电气通信大学食品256(University of Electro-Communications Food 256, UEC-FOOD256)30 数据集包含日本菜肴,其中 UEC-FOOD256 数据集还扩展收录了一些国际菜肴。Food-101 数据集包含从某网站获取的流行菜肴图像27。Food-5036 和视频检索组食品172(Video Retrieval Group Food 172, VireoFood-172)37 数据集是以中文为基础的食品图像集合。米兰比可卡大学2016(University of Milano-Bicocca 2016, UNIMIB2016)数据集由一家意大利食堂的餐盘图像组成38。Recipe1M 是一个大规模的烹饪食谱与食品图像数据集39。Food-475 数据集40 将此前发布的四个食品图像数据集27,30,36,37 整合为一。北京工商大学食品60(Beijing Technology and Business University Food 60, BTBUFood-60)是一个用于食品检测的图像数据集41。最近,ISIA 食品500(ISIA Food-500)数据集42 也已公开,该数据集包含多种多样的食品图像。与其他公开可用的食品图像数据集相比,该数据集包含大量图像,划分为500个食品类别,旨在推动多媒体食品识别技术的发展42。
1. 使用 NutriNet 进行食物图像识别
2. 使用全卷积网络进行食物图像分割
3. 使用 HTC ResNet 进行食物图像分割
NutriNet 与当时三种流行的深度学习架构进行了对比测试:AlexNet14、GoogLeNet51 和 ResNet16。针对所有架构还测试了多个训练参数,以确定最优值2。其中一项参数是求解器类型的选择,它决定了损失函数的最小化方式。该函数是训练神经网络的主要质量度量指标,因为在训练优化过程中,它比分类准确率更适用。我们测试了三种求解器:随机梯度下降(Stochastic Gradient Descent, SGD)52、Nesterov 加速梯度法(Nesterov's Accelerated Gradient, NAG)53 和自适应梯度算法(Adaptive Gradient algorithm, AdaGrad)54。第二个参数是批量大小(batch size),它定义了同时处理的图像数量。深度学习架构的深度决定了该参数的取值,因为更深的架构需要更多的 GPU 显存;这种方法的结果是,无论架构深度如何,所有架构的显存都被图像完全填满。第三个参数是学习率,它定义了神经网络参数在训练过程中更新的速度。该参数与批量大小协同设定,因为同时处理的图像数量直接影响收敛速度。AlexNet 模型使用 256 张图像的批量大小和 0.02 的基础学习率进行训练;NutriNet 使用 128 张图像的批量大小和 0.01 的学习率;GoogLeNet 使用 64 张图像和 0.005 的学习率;ResNet 使用 16 张图像和 0.00125 的学习率。另外三个参数在所有架构中保持固定:学习率策略(逐步下降,step-down)、步长(30%)和 gamma 值(0.1)。这些参数共同描述了每个训练周期(epoch)中学习率的变化方式。该方法的核心思想是,随着模型逐渐接近最优损失值,学习率被逐步降低,以实现模型的精细调优。最后,所有深度学习架构的训练周期数均固定为 1502。
在所有测试参数中,NutriNet 在识别数据集上取得的最佳结果为 86.72% 的分类准确率,比 AlexNet 的最佳结果高出约 2%,略高于 GoogLeNet 的最佳结果。总体表现最优的架构是 ResNet(高出约 1%),但 ResNet 的训练时间显著长于 NutriNet(约为 NutriNet 的五倍),这一点在需要持续重新训练模型以提高准确率及可识别食物种类数量时尤为重要。NutriNet、AlexNet 和 GoogLeNet 均使用 AdaGrad 优化器取得了各自的最佳结果,而 ResNet 的最佳模型则采用了 NAG 优化器。NutriNet 还在公开可用的 UNIMIB2016 食物图像数据集38上进行了测试。该数据集包含 73 种不同食物的 3,616 张图像。NutriNet 在该数据集上的识别准确率达到 86.39%,略高于该数据集作者报告的基线识别结果(85.80%)。此外,NutriNet 还在一个包含 115 种不同食物和饮料项目的 200 张真实场景图像的小规模数据集上进行了测试,NutriNet 在该数据集上的前五准确率为 55%。
为了训练FCN-8s假食物图像分割模型,我们采用Adam55作为求解器类型,因为我们发现其在此任务中表现最优。基础学习率设置得非常低,为0.0001。设置较低数值的原因在于每次只能处理一张图像,这是像素级分类过程所导致的结果。该方法对GPU内存的需求显著高于图像级分类。因此,学习率必须设置得较低,以避免参数更新过快而收敛到次优值。训练轮数(epochs)设置为100,学习率策略、步长和gamma值分别设置为逐步下降(step-down)、34%和0.1,因为这些参数组合生成了最精确的模型。
使用像素准确率指标对FCN-8s模型进行了精度测量15,该指标类似于传统深度学习网络中的分类准确率,主要区别在于准确率的计算是在像素级别而非图像级别进行的:

其中,PA 表示像素准确率,nij 表示真实类别为 i 且被预测为类别 j 的像素数量,ti = Σj nij 表示真实标签中类别 i 的像素总数1。换言之,像素准确率通过将正确预测的像素数除以像素总数来计算。训练完成的 FCN-8s 模型的最终准确率为 92.18%。图 2 展示了伪造食品图像数据集中的三个示例图像(分别来自训练集、验证集和测试集),以及对应的真值标签和模型预测结果。
用于训练HTC20 ResNet-101模型进行食物图像分割的参数设置如下:求解器类型采用SGD,因其性能优于其他类型的求解器。基础学习率设为0.00125,批量大小设为2张图像。每个训练阶段的训练轮数设为40轮,并进行了多个训练阶段——首先在未进行图像增强的原始FRC数据集上训练,随后以交替方式多次在8倍增强和4倍增强的FRC数据集上训练,每次均选取表现最优的模型,并在下一训练阶段对其进行微调。有关训练阶段的更多细节,请参见方案文本的第3.3节 。最后采用逐步降低学习率的策略,在固定轮数时降低学习率(第一训练阶段的学习率下降轮次为第28轮和第35轮)。需要注意的是,尽管该训练阶段序列在FRC范围内的测试中取得了最佳效果,但在使用其他数据集时,可能需要采用不同的训练序列才能获得最优结果。
本研究采用以下精确度指标评估了基于ResNet的食物图像分割方案19:

其中 P 为精确率,TP 为食物图像分割模型正确预测的正样本数量,FP 为错误预测的正样本数量,IoU 为交并比,其计算公式如下:

其中,交集面积 表示模型预测结果与真实标注重叠的像素数量,并集面积表示模型预测结果与真实标注的总像素数,两者均在像素级别及每一类食物类别上进行计算。召回率作为次要评价指标,其计算方式类似,公式如下19:

其中 R 为召回率,FN 为食物图像分割模型产生的假阴性预测数量。精确率和召回率在所有真实标签类别上进行平均。基于这些指标,我们的模型达到了 59.2% 的平均精确率和 82.1% 的平均召回率,在第二届食物识别挑战赛19的第二轮中排名第二。该结果在平均精确率指标上落后第一名 4.2%,领先第三名 5.3%。表 1 列出了本次竞赛中排名前四的参赛者结果。

图1:NutriNet 深度神经网络架构示意图。 该图已发表于 Mezgec 等人2。 请点击此处查看此图的放大版本。

图2:来自仿制食品图像数据集的图像。 原始图像(左),人工标注的真实标签(中),以及FCN-8s模型的预测结果(右)。该图已发表于Mezgec等人的研究1。 请点击此处查看此图的放大版本。
| 团队名称 | 排名 | 平均精确率 | 平均召回率 |
| rssfete | 1 | 63.4% | 88.6% |
| simon_mezgec | 2 | 59.2% | 82.1% |
| arimboux | 3 | 53.9% | 73.5% |
| latentvec | 4 | 48.7% | 71.1% |
表1:食物识别挑战赛第二轮的前4名结果。 以平均精确率作为主要性能指标,平均召回率作为次要指标。结果来源于官方竞赛排行榜19。
补充文件。 请点击此处下载该文件。
近年来,深度神经网络已被多次验证为识别食物图像的可行解决方案10,11,12,21,23,25,26,29,31,33。本文所展示的工作进一步证实了这一点1,2。单输出食物图像识别方法简单直接,适用于仅预期包含单一食物或饮料项目的图像的简单应用场景2。
食物图像分割方法似乎特别适用于普遍识别食物图像,且对食物项目的数量没有任何限制1。由于该方法通过分类图像中每个单独的像素来实现,因此不仅能够识别图像中任意数量的食物项目,还能精确定位食物项目的位置及其大小。后者可用于进行食物重量估计,尤其是在使用参考物体或固定距离相机的情况下。
关于食物图像数据集的可用性,已有一些相关研究工作3,22,27,30,36,37,38,39,40,41,42,我们希望未来能开展更多工作,特别是在整合来自全球不同地区食物图像数据集方面,这将有助于开发出更稳健的解决方案。目前,自动食物图像识别方案的准确率尚未达到人类水平35,这很大程度上可能是由于所使用的食物图像数据集在规模和质量上尚不充分所致。
未来,我们的目标是进一步在真实世界图像上评估所开发的方法。通常,该领域的数据集往往包含在受控环境中拍摄的图像,或为识别目的手动优化过的图像。因此,收集一个大规模且多样化的真实世界食物图像数据集至关重要,以涵盖个体可能希望识别的各种食物和饮料种类。迈向这一目标的第一步由“食物识别挑战赛”(Food Recognition Challenge)提供,该挑战赛包含了一个真实世界食物图像数据集19,但仍需进一步工作,以在全球范围内的食物图像上验证该方法,并与营养师开展合作研究。
作者无任何利益冲突需要披露。
作者谨此感谢澳大利亚纽卡斯尔大学的 Tamara Bucher 提供虚假食物图像数据集。本研究由欧盟“地平线2020”科研与创新计划(资助编号 863059 - FNS-Cloud,769661 - SAAM)以及斯洛文尼亚研究署(资助编号 P2-0098)资助。欧盟和斯洛文尼亚研究署在本文的设计、分析或撰写过程中未发挥任何作用。
| 姓名 | 公司 | 目录编号 | 评论 |
|---|---|---|---|
| 硬件 | |||
| NVIDIA GPU | NVIDIA | N/A | 需要配备 NVIDIA GPU,因为以下某些软件框架无法在无此硬件的情况下运行。https://www.nvidia.com |
| 软件 | |||
| Caffe | Berkeley AI Research | N/A | Caffe 是一个深度学习框架。https://caffe.berkeleyvision.org |
| CLoDSA | Jónathan Heras | N/A | CLoDSA 是一个基于 Python 的图像增强库。https://github.com/joheras/CLoDSA |
| Google API Client | N/A | Google API Client 是用于 Google 基于发现机制的 API 的 Python 客户端库。https://github.com/googleapis/google-api-python-client | |
| JavaScript Segment Annotator | Kota Yamaguchi | N/A | JavaScript Segment Annotator 是一个基于 JavaScript 的图像标注工具。https://github.com/kyamagu/js-segment-annotator |
| MMDetection | Multimedia Laboratory, CUHK | N/A | MMDetection 是一个基于 PyTorch 的目标检测工具箱。https://github.com/open-mmlab/mmdetection |
| NVIDIA DIGITS | NVIDIA | N/A | NVIDIA DIGITS 是 Caffe 的封装工具,提供图形化网页界面。https://developer.nvidia.com/digits |
| OpenCV | Intel | N/A | OpenCV 是一个计算机视觉库。https://opencv.org |
| Python | Python Software Foundation | N/A | Python 是一种编程语言。https://www.python.org |
| PyTorch | Facebook AI Research | N/A | PyTorch 是一个机器学习框架。https://pytorch.org |
| Ubuntu OS | Canonical | N/A | 作者使用的是 Ubuntu 14.04 操作系统,该系统与上述所有软件框架和工具兼容。https://ubuntu.com |
申请许可以重复使用本 JoVE 文章的文本或图表
申请许可