方法文章

基于图像的饮食评估深度神经网络

11.2K 次观看

DOI:

10.3791/61906

2021年3月13日

本文内容

摘要

本文所展示工作的目标是开发一种技术,用于从移动设备拍摄的图像中自动识别食物和饮料种类。该技术包含两种不同方法——第一种方法执行食物图像识别,第二种方法执行食物图像分割。

摘要

由于手动膳食评估方法存在诸多问题且成本较高,因此需要采用自动化解决方案来简化和加快工作流程,并提高其质量。如今,自动化解决方案能够以更简单的方式记录个体的膳食摄入情况,例如通过智能手机摄像头拍摄图像。本文将重点介绍此类基于图像的膳食评估方法。在食物图像识别问题上,近年来深度神经网络已达到最先进的水平,我们将介绍本领域内的相关研究工作。具体而言,我们首先描述一种基于名为 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 进行食物图像识别

  1. 获取食物图像数据集
    1. 收集一份不同的食物和饮料列表,这些食物和饮料将作为食物图像识别模型的输出类别。建议选择种类多样的流行食物和饮料,以便训练出鲁棒性强的食物图像识别模型。
    2. 将食物和饮料列表保存为文本文件(例如“txt”或“csv”格式)。
      注意:本文作者所使用的文本文件可在补充材料中找到(“food_items.txt”),其中包含520种斯洛文尼亚食物的列表。
    3. 编写或下载一个 Python43 脚本,利用 Google Custom Search API44 从列表中的每一项食物下载图像,并将每类食物的图像分别保存到独立的文件夹中。
      ​注意:本文作者所使用的 Python 脚本可在补充材料中找到(“download_images.py”)。若使用该脚本,需将脚本中的开发者密钥(变量“developerKey”,Python 脚本第8行)和自定义搜索引擎ID(变量“cx”,Python 脚本第28行)替换为所用 Google 账户对应的值。
    4. 运行步骤1.1.3中的 Python 脚本(例如,使用命令:“python download_images.py”)。
  2. (可选)清理食物图像数据集
    1. 以与第1.4节相同的方式训练一个食物图像检测模型,但输出类别仅设为两个(食物、非食物),而非步骤1.1.1中的输出列表。
      注意:本文作者使用来自食谱网站和 ImageNet 数据集45 的图像组合来训练食物图像检测模型。由于本研究重点在于食物图像识别,且此步骤为数据集清理的可选操作,因此省略了进一步的细节。有关该方法的更多说明,可参见 Mezgec 等人2 的研究。
    2. 将步骤1.2.1中训练的检测模型应用于步骤1.1.4生成的食物图像数据集。
    3. 删除被步骤1.2.1中的检测模型标记为“非食物”的所有图像。
    4. 人工检查食物图像数据集,查找其他错误图像、低质量图像以及图像重复项。
    5. 删除在步骤1.2.4中发现的图像。
  3. 增强食物图像数据集
    1. 使用 CLoDSA 库46 将食物图像数据集中的每张图像旋转90°,生成每张图像的新版本(参见所附 Python 脚本的第19至21行)。
      注意:本文作者所使用的所有 CLoDSA 命令均包含在一个 Python 脚本中,该脚本可在补充材料中找到(“nutrinet_augmentation.py”)。若使用该脚本,需将输入路径(变量“INPUT_PATH”,Python 脚本第8行)和输出路径(变量“OUTPUT_PATH”,Python 脚本第11行)替换为所需文件夹的路径。
    2. 使用 CLoDSA 库将食物图像数据集中的每张图像旋转180°,生成每张图像的新版本(参见所附 Python 脚本的第19至21行)。
    3. 使用 CLoDSA 库将食物图像数据集中的每张图像旋转270°,生成每张图像的新版本(参见所附 Python 脚本的第19至21行)。
    4. 使用 CLoDSA 库将食物图像数据集中的每张图像进行水平翻转,生成每张图像的新版本(参见所附 Python 脚本的第23和24行)。
    5. 使用 CLoDSA 库为食物图像数据集中的每张图像添加随机颜色噪声,生成每张图像的新版本(参见所附 Python 脚本的第26和27行)。
    6. 使用 CLoDSA 库将食物图像数据集中的每张图像放大25%,生成每张图像的新版本(参见所附 Python 脚本的第29和30行)。
    7. 将步骤1.3.1至1.3.6生成的图像与原始图像(参见所附 Python 脚本的第16和17行)一起保存到一个新的食物图像数据集中(每张食物图像共生成7个变体)。此操作通过执行所附 Python 脚本第32行的命令完成。
  4. 执行食物图像识别
    1. 将步骤1.3.7中生成的食物图像数据集导入 NVIDIA DIGITS 环境47,并在 NVIDIA DIGITS 用户界面中将数据集划分为训练集、验证集和测试集。
    2. 将 NutriNet 架构2 的定义文本复制粘贴到 NVIDIA DIGITS 中,作为自定义网络。
      注意:NutriNet 架构的定义文本可在补充材料中找到(“nutrinet.prototxt”)。
    3. (可选)在 NVIDIA DIGITS 用户界面中定义训练超参数。
      注意:超参数是指在训练开始前用于定义训练过程的参数。本文作者所使用的超参数可在补充材料中的文件(“nutrinet_hyperparameters.prototxt”)中找到。尽管每个数据集都需要通过实验确定最优超参数,但该文件提供了一组可直接复制到 NVIDIA DIGITS 用户界面中的超参数配置。此外,NVIDIA DIGITS 会为超参数提供默认值,可作为基准使用。因此,此步骤为可选。
    4. 运行 NutriNet 模型的训练。
    5. 训练完成后,选取性能最佳的 NutriNet 模型迭代版本。该模型将用于测试本方法的性能。
      ​注意:确定最佳性能模型迭代的方法有多种。一种简单的方法如下:NVIDIA DIGITS 会输出每个训练周期的准确率指标图。检查哪个周期在食物图像数据集的验证子集上达到了最低的损失值,该周期对应的模型迭代即为最佳性能模型。确定最佳模型迭代的一个可选步骤是观察训练子集的损失值随周期变化的趋势:若训练损失值持续下降,而验证损失值保持不变或持续上升,则应选择训练损失值开始下降前的那个周期,因为这可能标志着模型开始对训练图像过拟合。

2. 使用全卷积网络进行食物图像分割

  1. 获取仿制食品图像数据集
    1. 获取一个仿制食品图像的数据集。仿制食品图像是研究人员在使用食品复制品进行行为学研究时收集的。
      注:本文作者获得的仿制食品图像是在实验室环境中收集的18
    2. 对每张食品图像进行像素级手动标注——图像中的每个像素都必须包含其所属食品类别的信息。此步骤的结果是为食品图像数据集中的每张图像生成一张对应的标注图像,其中每个像素代表一个食品类别。
      ​注:实现此目标的工具有多种——本文作者使用了 JavaScript Segment Annotator48
  2. 增强仿制食品图像数据集
    1. 对食品图像数据集的训练子集图像执行与第 1.3 节相同的步骤。
      注:除步骤 1.3.5 外,所有数据增强步骤也需在对应的标注图像上执行。如果使用第 1.3 节中的脚本,则需将输入路径(Python43 脚本代码中的变量 'INPUT_PATH',第 8 行)和输出路径(变量 'OUTPUT_PATH',第 11 行)替换为所需文件夹的路径。此外,将问题类型(变量 'PROBLEM',第 6 行)设置为 'instance_segmentation',将标注模式(变量 'ANNOTATION_MODE',第 7 行)和输出模式(变量 'OUTPUT_MODE',第 10 行)均设置为 'coco'。
  3. 执行仿制食品图像分割
    1. 执行与第 1.4 节相同的步骤,但跳过步骤 1.4.2,取而代之的是执行步骤 2.3.2 和 2.3.3。
      注:超参数是指在训练开始前用于定义训练过程的参数。本文作者在可选步骤 1.4.3 中使用的训练超参数可在补充文件中提供的文件('fcn-8s_hyperparameters.prototxt')中找到。尽管针对每个数据集都需要实验以确定最优超参数组合,但该文件中包含的超参数配置可直接复制到 NVIDIA DIGITS47 用户界面中。此外,NVIDIA DIGITS 会为超参数提供默认值,可作为基准使用。
    2. 将 FCN-8s 架构15的定义文本复制粘贴到 NVIDIA DIGITS 环境中作为自定义网络。
      注:FCN-8s 架构的定义文本在 GitHub 上公开可获取49
    3. 在 NVIDIA DIGITS 用户界面中输入预训练的 FCN-8s 模型权重的路径。
      ​注:这些模型权重是在 PASCAL VOC 数据集17 上预训练的,可在互联网上获取49

3. 使用 HTC ResNet 进行食物图像分割

  1. 获取食物图像数据集
    1. 从FRC网站下载食物图像数据集19
  2. 增强食物图像数据集
    1. 执行步骤1.3.1–1.3.4。
      注意:本文作者所使用的包含全部CLoDSA46命令的Python43脚本,可在补充文件中提供的文件('frc_augmentation.py')中找到。若使用该脚本,需将输入路径(Python脚本第8行变量'INPUT_PATH')和输出路径(Python脚本第11行变量'OUTPUT_PATH')替换为所需文件夹的路径。
    2. 使用CLoDSA库对食物图像数据集中的每张图像添加高斯模糊,生成每张图像的新版本(参见所附Python脚本的第26和27行)。
    3. 使用CLoDSA库对食物图像数据集中的每张图像进行锐化处理,生成每张图像的新版本(参见所附Python脚本的第29和30行)。
    4. 使用CLoDSA库对食物图像数据集中的每张图像应用伽马校正,生成每张图像的新版本(参见所附Python脚本的第32和33行)。
    5. 将步骤3.2.1–3.2.4生成的图像与原始图像(参见所附Python脚本的第16和17行)一起保存为新的食物图像数据集(每张食物图像共8个变体)。此操作通过执行所附Python脚本第35行的命令完成。
    6. 将步骤3.2.2–3.2.4生成的图像与原始图像(参见所附Python脚本的第16和17行)一起保存为新的食物图像数据集(每张食物图像共4个变体)。此操作通过删除所附Python脚本的第19至24行,并执行第35行命令完成。
  3. 执行食物图像分割
    1. 修改MMDetection库50中现有HTC20 ResNet-101架构16定义文件中的“model settings”和“dataset settings”部分,使其能够接受来自步骤3.1.1、3.2.5和3.2.6的食物图像数据集。
    2. (可选)修改步骤3.3.1中的HTC ResNet-101架构定义,以设定训练超参数:在“dataset settings”部分设定批量大小,在“optimizer”部分设定求解器类型和学习率,在“learning policy”部分设定学习策略,在“runtime settings”部分设定训练轮数。
      ​注意:修改后的HTC ResNet-101架构定义文件可在补充文件中找到('htc_resnet-101.py')。超参数是在训练开始前用于定义训练过程的参数。虽然每个数据集都需要通过实验确定最优超参数组合,但该文件已包含一组可直接使用的超参数配置,因此本步骤为可选。
    3. 使用MMDetection库在步骤3.1.1获得的食物图像数据集上运行HTC ResNet-101模型的训练(例如,使用命令:'python mmdetection/tools/train.py htc_resnet-101.py')。
    4. 完成步骤3.3.3的训练后,选取表现最佳的HTC ResNet-101模型迭代版本,并在步骤3.2.5的食物图像数据集上继续执行下一阶段训练,进行微调。
      ​注意:有多种方法可确定表现最佳的模型迭代版本。一种简单的方法如下:MMDetection库会在命令行界面输出每个训练轮次的准确率指标值。检查在食物图像数据集的验证子集上哪个轮次的损失值最低,该轮次对应的模型迭代版本即可视为表现最佳。确定最佳模型迭代版本的可选步骤是观察训练子集的损失值随轮次的变化情况:若训练损失值开始持续下降,而验证子集的损失值保持不变或持续上升,则应选择训练损失值开始下降之前的那个轮次,因为这可能标志着模型开始对训练图像过拟合。
    5. 完成步骤3.3.4的训练后,选取表现最佳的HTC ResNet-101模型迭代版本,并在步骤3.2.6的食物图像数据集上继续执行下一阶段训练,进行微调。
      ​注意:参见步骤3.3.4的注释。
    6. 完成步骤3.3.5的训练后,选取表现最佳的HTC ResNet-101模型迭代版本,并再次在步骤3.2.5的食物图像数据集上继续执行下一阶段训练,进行微调。
      ​注意:参见步骤3.3.4的注释。
    7. 完成步骤3.3.6的训练后,选取表现最佳的HTC ResNet-101模型迭代版本。该模型将用于测试本方法的性能。
      注意:参见步骤3.3.4的注释。步骤3.3.3–3.3.7的流程在本文作者设定的目标下取得了最佳结果。对于每个数据集,均需通过实验确定最优的训练与数据增强步骤序列。

结果

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,该指标类似于传统深度学习网络中的分类准确率,主要区别在于准确率的计算是在像素级别而非图像级别进行的:

figure-results-1

其中,PA 表示像素准确率,nij 表示真实类别为 i 且被预测为类别 j 的像素数量,ti = Σj nij 表示真实标签中类别 的像素总数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

figure-results-2

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

figure-results-3

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

figure-results-4

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

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

figure-results-6
图2:来自仿制食品图像数据集的图像。 原始图像(左),人工标注的真实标签(中),以及FCN-8s模型的预测结果(右)。该图已发表于Mezgec等人的研究1请点击此处查看此图的放大版本。

团队名称排名平均精确率平均召回率
rssfete163.4%88.6%
simon_mezgec259.2%82.1%
arimboux353.9%73.5%
latentvec448.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 GPUNVIDIAN/A需要配备 NVIDIA GPU,因为以下某些软件框架无法在无此硬件的情况下运行。https://www.nvidia.com
软件
CaffeBerkeley AI ResearchN/ACaffe 是一个深度学习框架。https://caffe.berkeleyvision.org
CLoDSAJónathan HerasN/ACLoDSA 是一个基于 Python 的图像增强库。https://github.com/joheras/CLoDSA
Google API ClientGoogleN/AGoogle API Client 是用于 Google 基于发现机制的 API 的 Python 客户端库。https://github.com/googleapis/google-api-python-client
JavaScript Segment AnnotatorKota YamaguchiN/AJavaScript Segment Annotator 是一个基于 JavaScript 的图像标注工具。https://github.com/kyamagu/js-segment-annotator
MMDetectionMultimedia Laboratory, CUHKN/AMMDetection 是一个基于 PyTorch 的目标检测工具箱。https://github.com/open-mmlab/mmdetection
NVIDIA DIGITSNVIDIAN/ANVIDIA DIGITS 是 Caffe 的封装工具,提供图形化网页界面。https://developer.nvidia.com/digits
OpenCVIntelN/AOpenCV 是一个计算机视觉库。https://opencv.org
PythonPython Software FoundationN/APython 是一种编程语言。https://www.python.org
PyTorchFacebook AI ResearchN/APyTorch 是一个机器学习框架。https://pytorch.org
Ubuntu OSCanonicalN/A作者使用的是 Ubuntu 14.04 操作系统,该系统与上述所有软件框架和工具兼容。https://ubuntu.com

参考文献

  1. Mezgec, S., Eftimov, T., Bucher, T., Koroušić Seljak, B. Mixed Deep Learning and Natural Language Processing Method for Fake-Food Image Recognition and Standardization to Help Automated Dietary Assessment. Public Health Nutrition. 22 (7), 1193-1202 (2019).
  2. Mezgec, S., Koroušić Seljak, B. NutriNet: A Deep Learning Food and Drink Image Recognition System for Dietary Assessment. Nutrients. 9 (7), 657(2017).
  3. Chen, M., et al. PFID: Pittsburgh Fast-Food Image Dataset. Proceedings of the ICIP 2009. , 289-292 (2009).
  4. Joutou, T., Yanai, K. A Food Image Recognition System with Multiple Kernel Learning. Proceedings of the ICIP 2009. , 285-288 (2009).
  5. Yang, S., Chen, M., Pomerlau, D., Sukthankar, R. Food Recognition using Statistics of Pairwise Local Features. Proceedings of the CVPR 2010. , 2249-2256 (2010).
  6. Anthimopoulos, M. M., Gianola, L., Scarnato, L., Diem, P., Mougiakakou, S. G. A Food Recognition System for Diabetic Patients Based on an Optimized Bag-of-Features Model. IEEE Journal of Biomedical and Health Informatics. 18 (4), 1261-1271 (2014).
  7. LeCun, Y., Bengio, Y., Hinton, G. Deep Learning. Nature. 521, 436-444 (2015).
  8. Deng, L., Yu, D. Deep Learning: Methods and Applications. Foundations and Trends in Signal Processing. 7 (3-4), 197(2014).
  9. Hubel, D. H., Wiesel, T. N. Receptive Fields, Binocular Interaction and Functional Architecture in the Cat's Visual Cortex. The Journal of Physiology. 160 (1), 106-154 (1962).
  10. Singla, A., Yuan, L., Ebrahimi, T. Food/Non-Food Image Classification and Food Categorization using Pre-Trained GoogLeNet Model. Proceedings of the MADiMa'16. , 3-11 (2016).
  11. Yanai, K., Kawano, Y. Food Image Recognition using Deep Convolutional Network with Pre-Training and Fine-Tuning. Proceedings of the ICMEW 2015. , 1-6 (2015).
  12. Liu, C., et al. DeepFood: Deep Learning-Based Food Image Recognition for Computer-Aided Dietary Assessment. Proceedings of the ICOST 2016. , 37-48 (2016).
  13. De Sousa Ribeiro, F., et al. An End-to-End Deep Neural Architecture for Optical Character Verification and Recognition in Retail Food Packaging. Proceedings of the ICIP 2018. , 2376-2380 (2018).
  14. Krizhevsky, A., Sutskever, I., Hinton, G. ImageNet Classification with Deep Convolutional Neural Networks. Proceedings of the NIPS'12. , 1097-1105 (2012).
  15. Long, J., Shelhamer, E., Darrell, T. Fully Convolutional Networks for Semantic Segmentation. Proceedings of the CVPR 2015. , 3431-3440 (2015).
  16. He, K., Zhang, X., Ren, S., Sun, J. Deep Residual Learning for Image Recognition. Proceedings of the CVPR 2016. , 770-778 (2016).
  17. PASCAL VOC Project. PASCAL Visual Object Classes. , Available from: http://host.robots.ox.ac.uk/pascal/VOC (2020).
  18. Bucher, T., vander Horst, K., Siegrist, M. Fruit for Dessert. How People Compose Healthier Meals. Appetite. 60 (1), 74-80 (2013).
  19. Food Recognition Challenge. AICrowd. , Available from: https://www.aicrowd.com/challenges/food-recognition-challenge (2020).
  20. Chen, K., et al. Hybrid Task Cascade for Instance Segmentation. Proceedings of the CVPR 2019. , 4974-4983 (2019).
  21. Kawano, Y., Yanai, K. Food Image Recognition with Deep Convolutional Features. Proceedings of the UbiComp 2014. , 589-593 (2014).
  22. Matsuda, Y., Hoashi, H., Yanai, K. Recognition of Multiple-Food Images by Detecting Candidate Regions. Proceedings of the ICME 2012. , 25-30 (2012).
  23. Christodoulidis, S., Anthimopoulos, M. M., Mougiakakou, S. G. Food Recognition for Dietary Assessment using Deep Convolutional Neural Networks. Proceedings of the ICIAP 2015. , 458-465 (2015).
  24. Tanno, R., Okamoto, K., Yanai, K. DeepFoodCam: A DCNN-Based Real-Time Mobile Food Recognition System. Proceedings of the MADiMa'16. , 89-89 (2016).
  25. Liu, C., et al. A New Deep Learning-Based Food Recognition System for Dietary Assessment on An Edge Computing Service Infrastructure. IEEE Transactions on Services Computing. 11 (2), 249-261 (2017).
  26. Martinel, N., Foresti, G. L., Micheloni, C. Wide-Slice Residual Networks for Food Recognition. Proceedings of the IEEE WACV 2018. , 567-576 (2018).
  27. Bossard, L., Guillaumin, M., Van Gool, L. Food-101-Mining Discriminative Components with Random Forests. Proceedings of the ECCV'14. , 446-461 (2014).
  28. Zhou, L., Zhang, C., Liu, F., Qiu, Z., He, Y. Application of Deep Learning in Food: A Review. Comprehensive Reviews in Food Science and Food Safety. 18, 1793-1811 (2019).
  29. Zhao, H., Yap, K. -H., Kot, A. C., Duan, L. JDNet: A Joint-Learning Distilled Network for Mobile Visual Food Recognition. IEEE Journal of Selected Topics in Signal Processing. 14 (4), 665-675 (2020).
  30. Kawano, Y., Yanai, K. Automatic Expansion of a Food Image Dataset Leveraging Existing Categories with Domain Adaptation. Proceedings of the ECCV'14. , 3-17 (2014).
  31. Hafiz, R., Haque, M. R., Rakshit, A., Uddin, M. S. Image-Based Soft Drink Type Classification and Dietary Assessment System using Deep Convolutional Neural Network with Transfer Learning. Journal of King Saud University - Computer and Information Sciences. , (2020).
  32. Shimoda, W., Yanai, K. Weakly-Supervised Plate and Food Region Segmentation. Proceedings of the ICME 2020. , 1-6 (2020).
  33. Ciocca, G., Micali, G., Napoletano, P. State Recognition of Food Images using Deep Features. IEEE Access. 8, 32003-32017 (2020).
  34. Knez, S., Šajn, L. Food Object Recognition using a Mobile Device: Evaluation of Currently Implemented Systems. Trends in Food Science & Technology. 99, 460-471 (2020).
  35. Furtado, P., Caldeira, M., Martins, P. Human Visual System vs Convolution Neural Networks in Food Recognition Task: An Empirical Comparison. Computer Vision and Image Understanding. 191, 102878(2020).
  36. Chen, M. -Y., et al. Automatic Chinese Food Identification and Quantity Estimation. SA'12 Technical Briefs. , 1-4 (2012).
  37. Chen, J., Ngo, C. -W. Deep-Based Ingredient Recognition for Cooking Recipe Retrieval. Proceedings of the MM'16. , 32-41 (2016).
  38. Ciocca, G., Napoletano, P., Schettini, R. Food Recognition: A New Dataset, Experiments, and Results. IEEE Journal of Biomedical and Health Informatics. 21 (3), 588-598 (2017).
  39. Salvador, A., et al. Learning Cross-Modal Embeddings for Cooking Recipes and Food Images. Proceedings of the IEEE CVPR 2017. , 3020-3028 (2017).
  40. Ciocca, G., Napoletano, P., Schettini, R. CNN-Based Features for Retrieval and Classification of Food Images. Computer Vision and Image Understanding. 176-177, 70-77 (2018).
  41. Cai, Q., Li, J., Li, H., Weng, Y. BTBUFood-60: Dataset for Object Detection in Food Field. Proceedings of the IEEE BigComp 2019. , 1-4 (2019).
  42. Min, W., et al. ISIA Food-500: A Dataset for Large-Scale Food Recognition via Stacked Global-Local Attention Network. Proceedings of the MM'20. , 393-401 (2020).
  43. Python Software Foundation. Python. , Available from: https://www.python.org (2020).
  44. Google Custom Search API. Google. , Available from: https://developers.google.com/resources/api-libraries/documentation/customsearch/v1/python/latest/customsearch_v1.cse.html (2020).
  45. Stanford Vision Lab. ImageNet. , Available from: http://www.image-net.org (2020).
  46. Heras, J. CLoDSA. , Available from: https://github.com/joheras/CLoDSA (2020).
  47. NVIDIA DIGITS. NVIDIA. , Available from: https://developer.nvidia.com/digits (2020).
  48. Yamaguchi, K. JavaScript Segment Annotator. , Available from: https://github.com/kyamagu/js-segment-annotator (2020).
  49. Shelhamer, E. Fully Convolutional Networks for Semantic Segmentation. , Available from: https://github.com/shelhamer/fcn.berkeleyvision.org (2020).
  50. Multimedia Laboratory, CUHK. MMDetection. , Available from: https://github.com/open-mmlab/mmdetection (2020).
  51. Szegedy, C., et al. Going Deeper with Convolutions. Proceedings of the CVPR 2015. , 1-9 (2015).
  52. Bottou, L. Large-Scale Machine Learning with Stochastic Gradient Descent. Proceedings of the COMPSTAT'2010. , 177-186 (2010).
  53. Nesterov, Y. A Method of Solving a Convex Programming Problem with Convergence Rate O(1/k2). Doklady Akademii Nauk SSSR. 27, 372-376 (1983).
  54. Duchi, J., Hazan, E., Singer, Y. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research. 12, 2121-2159 (2011).
  55. Kingma, D. P., Ba, J. Adam: A Method for Stochastic Optimization. arXiv Preprint. , (2017).

重印与许可

申请许可以重复使用本 JoVE 文章的文本或图表

申请许可

标签

NutriNet FCN 8S HTC ResNet 101

相关文章