2021年3月13日
本文所展示工作的目标是开发一种技术,用于从移动设备拍摄的图像中自动识别食物和饮料种类。该技术包含两种不同方法——第一种方法执行食物图像识别,第二种方法执行食物图像分割。
由于传统的手动膳食评估方法存在诸多问题且成本较高,因此需要自动化解决方案来减轻工作负担、提高工作效率并提升评估质量。如今,自动化解决方案能够以更简便的方式记录个体的膳食摄入情况,例如通过智能手机摄像头拍摄图像即可实现。本文将重点介绍基于图像的膳食评估方法,该方法采用深度神经网络,代表了当前该领域的最先进水平。
具体而言,我们将介绍三种解决方案:一种用于食物图像识别,一种用于食物模型或仿制食品的图像分割,另一种用于真实食物的图像分割。收集一份不同食物和饮料的列表,这些将作为食物图像识别模型的输出类别。将食物和饮料列表保存在文本文件中,例如 TXT 或 CSV 格式。
请注意,本文作者所使用的文本文件可在补充文件中的 food items.txt 中找到,其中包含 520 种斯洛文尼亚食品项目的列表。编写或下载一个 Python 脚本,利用 Google 自定义搜索 API 从该列表中下载每种食品项目的图像,并将这些图像保存到各自独立的文件夹中。本文作者所使用的 Python 脚本可在补充文件中的 download images.py 中找到。
如果使用此脚本,需要将 Python 脚本代码中第 8 行的开发者密钥变量(developer key)和第 28 行的自定义搜索引擎 ID 变量(CX)替换为所使用 Google 账户对应的值。运行步骤 1.1.3 中的 Python 脚本。使用 CLoDSA 库,通过对食物图像数据集中的每张图像旋转 90 度,创建每张图像的新版本。
请注意,本文作者所使用的包含全部 CLoDSA 命令的 Python 脚本,可在补充文件中的 NutriNet_augmentation.py 文件中找到。使用 CLoDSA 库,通过对食物图像数据集中的每张图像旋转 180 度,生成每张图像的一个新版本。使用 CLoDSA 库,通过对食物图像数据集中的每张图像旋转 270 度,生成每张图像的另一个新版本。
使用 CLoDSA 库,通过对食品图像数据集中的每张图像进行水平翻转,创建每张图像的新版本。使用 CLoDSA 库,通过对食品图像数据集中的每张图像添加随机颜色噪声,创建每张图像的新版本。使用 CLoDSA 库,通过对食品图像数据集中的每张图像放大 25%,创建每张图像的新版本。
将步骤 1.3.1 至 1.3.6 中生成的图像连同原始图像一起保存,构成一个新的食物图像数据集。每个食物图像共包含七种变体。将步骤 1.3.7 中获得的食物图像数据集导入 NVIDI DIGITS 环境,并将该数据集划分为训练集、验证集和测试集。
将 NutriNet 架构的定义文本复制并粘贴到 NVIDIA DIGITS 中。请注意,NutriNet 架构定义可在补充文件中的 NutriNet.dot.proto.txt 找到。也可选择在 NVIDIA DIGITS 中定义训练超参数,或使用默认值。
本文作者所使用的超参数包含在补充文件中的一个文件内,文件名为 NutriNet underscore hyper-parameters dot proto TXT。运行 NutriNet 模型的训练过程。训练完成后,选取性能最佳的 NutriNet 模型迭代版本。
然后利用该模型测试此方法的性能。请注意,确定最佳性能模型迭代的方式有多种。更多详细信息请参见文章正文。
获取一组伪造食品图像的数据集。请注意,本文作者所使用的伪造食品图像是在实验室环境中采集的。对每张食品图像进行像素级的手动标注。
图像中的每个像素都必须包含其所属食物类别的信息。请注意,有许多工具可以实现此目的。本文作者使用了 JavaScript 分割标注器。
此步骤的结果是为食物图像数据集中的每张图像生成一张标注图像,其中每个像素代表一个食物类别。对食物图像数据集的训练子集中的图像执行与第1.3节相同的步骤。需要注意的是,除了步骤1.3.5之外,所有数据增强步骤也必须在对应的标注图像上同步进行。
执行与第1.4节相同的步骤,但跳过步骤1.4.2。取而代之的是执行步骤2.3.2和2.3.3。请注意,本文作者所使用的训练超参数可在补充文件中的“FCN-8S_underscore_hyper-parameters_dot_proto_TXT”文件里找到。
将FCN-8S架构的定义文本复制并粘贴到NVIDIA DIGITS中。将预训练的FCN-8S模型权重导入NVIDIA DIGITS。请注意,这些模型权重是在Pascal视觉对象类别数据集上预训练得到的,可通过互联网获取。
从食品识别挑战赛网站下载食品图像数据集。执行步骤 1.3.1 至 1.3.4。请注意,本文作者所使用的所有 CLoDSA 命令均包含在补充文件中的 FRC_augmentation.py 文件内的 Python 脚本中。
使用 CLoDSA 库,通过对食品图像数据集中的每张图像添加高斯模糊,创建其新版本。使用 CLoDSA 库,通过对食品图像数据集中的每张图像进行锐化处理,创建其新版本。使用 CLoDSA 库,通过对食品图像数据集中的每张图像应用伽马校正,创建其新版本。
将步骤 3.2.1 至 3.2.4 中生成的图像与原始图像一起保存,构建一个新的食物图像数据集,每个食物图像共包含八个变体。同时,将步骤 3.2.2 至 3.2.4 中生成的图像与原始图像一起保存,构建另一个新的食物图像数据集。
每张食物图像总共包含四个变体。修改 MM Detection 库中现有的 HTC ResNet 101 网络结构定义,使其能够接收来自步骤 3.1.1、3.2.5 和 3.2.6 的食物图像数据集。可选地,可修改步骤 3.3.1 中的 HTC ResNet 101 网络结构定义以设置训练超参数,或直接使用默认值。
请注意,修改后的 HTC ResNet 101 架构定义可在补充文件中的 HTC_resNet_101.py 中找到。使用 MM Detection 库在步骤 3.1.1 的食物图像数据集上运行 HTC ResNet 101 模型的训练。在完成步骤 3.3.3 的训练后,选取表现最佳的 HTC ResNet 101 模型迭代版本,并在步骤 3.2.5 的食物图像数据集上运行下一阶段的训练,对其进行微调。
请注意,有多种方法可以确定性能最佳的模型迭代版本。更多详细信息请参见文章正文。这一点对接下来的步骤同样重要。
在完成步骤 3.3.4 的训练后,选取表现最优的 HTC ResNet 101 模型迭代版本,并在步骤 3.2.6 的食物图像数据集上运行下一阶段的训练,对其进行微调。在完成步骤 3.3.5 的训练后,选取表现最优的 HTC ResNet 101 模型迭代版本,并再次在步骤 3.2.5 的食物图像数据集上运行下一阶段的训练,对其进行微调。在完成步骤 3.3.6 的训练后,选取表现最优的 HTC ResNet 101 模型迭代版本。
然后利用该模型测试此方法的性能。需要注意的是,步骤 3.3.3 至 3.3.7 针对本文作者所定义的目标取得了最佳结果。对于每个数据集,均需通过实验确定训练和数据增强步骤的最佳顺序。
在测试趋势模型后,NutriNet在识别数据集上的分类准确率达到86.72%,比当时流行的深度神经网络架构AlexNet高出约2%,也略高于GoogLeNet。为了评估FCN-8S虚假食物图像分割模型的准确性,采用了像素准确率作为评价指标。训练后的FCN-8S模型准确率为92.18%。基于ResNet的食物图像分割方案则使用“食物识别挑战赛”中定义的精确率指标进行评估。
通过该指标,训练模型的平均精确率达到59.2%,在食品识别挑战赛中排名第二。近年来,深度神经网络已多次被验证为识别食品图像的合适解决方案。本文所展示的工作进一步证明了这一点。
单一输出的食物图像识别方法简单直接,可用于简单的应用场景。而食物图像分割方法虽然在准备标注图像方面需要更多工作,但其对真实世界图像的适用性要高得多。未来,我们的目标是进一步在真实世界图像上评估所开发的流程。
迈向真实世界验证的第一步由食物识别挑战赛提供,该挑战赛包含了一个真实世界食物图像的数据集。然而,仍需进一步的工作,以在全球范围内的食物图像上验证此方法,并与营养师开展合作研究。
本文介绍了一种利用移动设备图像实现食品与饮料项目自动识别的技术。该技术专注于通过两种主要方法,利用深度神经网络进行膳食评估:食物图像识别与食物图像分割。
基于深度神经网络的自动化图像饮食评估方法解决了人工摄入追踪在可扩展性和可重复性方面的挑战,能够从真实世界图像中实现高通量、定量的表型分析。这些能力支持转化营养学研究、数字生物标志物开发以及贯穿生物制药研发管线的数据驱动干预研究。整合稳健的食物识别与分割模型,可提高饮食暴露数据的预测置信度,为发现性研究和临床前研究提供重要依据。
基于图像的饮食评估利用深度神经网络,适用于从早期发现到转化研究的全过程,支持数字表型分析、暴露-反应建模及生物标志物匹配。