Nutrition5k — 食物营养成分视觉理解基准数据集

Google Research 于 CVPR 2021 发布的通用食物营养理解数据集——加州园区自助餐厅采集 5,006 盘真实餐盘,配 4 路侧角扫掠视频、俯拍 RGB-D 图像、电子秤逐成分克重与 USDA 数据库换算的高精度营养标注,官方基线模型对卡路里的预测误差低于专业营养师的视觉估计,全量数据以 CC BY-4.0 许可公开

来源 Google 加州园区自助餐盘认知扫描平台:4 路树莓派侧角视频(1920×1080,30°/60° 俯仰交替)+ Intel RealSense D435 俯拍 RGB-D(16-bit 深度)+ 盘下电子秤逐成分增量克重(±1 g)+ USDA Food and Nutrient Database 换算的逐成分与全菜营养标注发布时间: 2026-10-17最后更新: 2026-10-20 阅读 21
Nutrition5k — 食物营养成分视觉理解基准数据集

信息速览

数据集名称Nutrition5k — 食物营养成分视觉理解基准数据集
数据类型影像数据,原始数据,人工标注
规模5,006 盘真实餐盘(README 口径;论文口径 5,066 道独特菜肴);>250 种成分;约 20,000 段侧角视频;3.5k 盘含俯拍 RGB-D
接入方式Google 加州园区自助餐盘认知扫描平台:4 路树莓派侧角视频(1920×1080,30°/60° 俯仰交替)+ Intel RealSense D435 俯拍 RGB-D(16-bit 深度)+ 盘下电子秤逐成分增量克重(±1 g)+ USDA Food and Nutrient Database 换算的逐成分与全菜营养标注
AI 就绪度

INFOBOX — Nutrition5k 一屏速览

维度 内容
本质 5,006 盘真实餐盘的视觉+营养多模态数据集(视频、RGB-D、克重、营养标注四位一体)
团队 Google Research(Quin Thames、Arjun Karpur、Wade Norris、Fangting Xia、Liviu Panait、Tobias Weyand、Jack Sim)
论文 CVPR 2021, pp. 8903-8911(arXiv:2103.03375),标题 Towards Automatic Nutritional Understanding of Generic Food
采集 加州 Google 园区自助餐厅自定义扫描平台:5 相机(1 俯拍 + 4 侧角)+ RealSense D435 + 盘下电子秤 ±1 g
视频 每盘 4 段侧角 MP4(1920×1080,约 8 秒,30°/60° 俯仰交替,各扫掠 90° 覆盖全向),合计约 20,000 段
深度 约 3.5k 盘有俯拍 RGB-D(16-bit PNG,1 m=10,000 单位,上限 0.4 m,8 秒平均去噪)
标注 逐成分克重 + 卡路里/脂肪/碳水/蛋白质(USDA Food and Nutrient Database 每克含量×增量重量)
规模 5,006 盘(论文口径 5,066);>250 种成分;每盘平均 5.7 种、最多 35 种成分
划分 Nutri-Train 90% / Nutri-Test 10%,增量扫描同盘锁定同一 split
基线 份量无关 2D 模型卡路里 MAE 24.1 kcal(9.5%);深度第 4 通道降至 18.8%;体积标量端到端 16.5%
人机对比 专业营养师视觉估重误差 41%、非专业者 53%——2D 直接预测模型误差低于专业营养师
获取 Google Cloud Storage bucket nutrition5k_dataset,整包 tar.gz 181.4 GB,gsutil 可分目录下载
许可 CC BY-4.0(全量数据,可商用、可改编)
关联发布 TFHub mobile_food_segmenter_V1(SeeFood 移动端食物分割模型)

Nutrition5k

Nutrition5k(官方仓库副标题 A Comprehensive Nutrition Dataset,论文全称 Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food)是由 Google Research 于 2021 年发布的大规模真实餐盘视觉-营养多模态数据集。数据集以自定义机器人化扫描平台在加州 Google 园区自助餐厅采集了 5,006 盘(论文口径 5,066 道)真实餐盘的多视角视频、俯拍 RGB-D 图像与电子秤增量克重,并以 USDA Food and Nutrient Database(美国农业部食物与营养数据库)的每克营养成分换算出逐成分、逐营养素的高精度标注。它是计算机视觉领域首个同时具备份量真值(scale ground truth)与逐成分营养标注的大规模公开数据集,直接瞄准「通用食物」(generic food,即不属于任何固定菜单、份量与配方均未知的日常餐食)的卡路里与宏量营养素回归这一长期难题。

与此前以食谱网站挖掘为主的数据集(如 Recipe1M)相比,Nutrition5k 的关键差异在于:照片不是从互联网上「捡来」的艺术摆拍,而是在受控物理环境中用传感器阵列实测的真实吃剩之前的那一盘——电子秤记录了每一种食材放进盘里的精确克数,多路相机同步记录了这盘菜从各个角度看上去的样子,深度相机记录了它的三维形状。这种「视觉-质量-营养」三线对齐的设计,使得「从一张照片估计这盘菜有多少卡路里」第一次拥有了可信的监督信号。论文中训练的基线模型在卡路里预测上达到 9.5% 的百分比 MAE(份量无关设定),误差水平低于 4 名注册营养师在同一任务上 41% 的视觉估计误差——这是营养视觉理解领域被引用最广的一组人机对比数字。

数据集以 CC BY-4.0 许可全量公开于 Google Cloud Storage,整包 181.4 GB,附带官方 train/test 划分、回归评估脚本与一个可直接部署的移动端食物分割模型(TFHub mobile_food_segmenter_V1)。截至本条目撰写时,它仍是份量感知营养估计方向最常被用作训练底座的资源之一,后续学术工作(如基于它的部分-整体建模、扩散式图像合成扩充等)持续将其作为事实标准基准。

§0 章节导航与 DAIMS 评估

本条目采用 47 节扩展结构,核心十个章节对应如下(§0-§10 导航):

标准章 对应本条目 内容
§0 §0(本节)+§1 导读:通用食物营养理解为何难
§1 §2 名称、身份与查重说明
§2 §6、§7 数据构成与规格(平台、规模画像)
§3 §8 标注流水线:从克重到营养值的换算链
§4 §9 与既有基准的比较发现(基线与人机对比)
§5 §10、§11 使用指南与配套模型
§6 §12、§13 对比与获取(数据集对照、应用场景、§24 合规)
§7 §23、§31 生态与影响(方法学经验、行业图景)
§8 §14、§15 方法学启示与分角色阅读路径
§9 §20、§32 与库内条目的关系(互链与对照阅读)
§10 §16、§17 避坑清单(坑 1-10)与常见误解

DAIMS 评估(数据集 AI-Readiness 十维评分)

维度 得分(/10) 评语
D 可发现性 9 官方 GitHub+GCS 双入口,slug 唯一,文献引用充分
A 可获取性 7 免登录直链但整包 181.4 GB,低带宽门槛高(可 gsutil 分目录)
I 互操作性 8 CSV+PNG+MP4 标准格式,宽表 schema 简单,官方评估脚本统一口径
M 元数据完备性 8 逐成分 USDA 映射+官方 split+采集参数公开;无盘级采集时间戳文件
S 可持续性 6 2021-06 后上游冻结,无版本迭代,issue 社区自维
规模充分性 8 5,006 盘在营养回归领域为最大,但相比通用视觉数据集仍小
标注质量 9 仪器真值(±1 g)+权威换算,全领域罕见的低标注噪声
多模态丰富度 9 视频×4+RGB-D+克重+营养四线对齐
偏倚透明度 8 官方 bias disclaimer 诚实;菜系/场景偏倚文档化
许可开放性 10 CC BY-4.0 全量,可商用可改编
合计 80/100 AI-ready 程度高,主要短板在上游维护停滞与下载体积

1. 概述:为什么「通用食物」的营养理解难

1.1 问题的现实背景

膳食记录(dietary logging)是体重管理、糖尿病控制与流行病学营养调查的基础动作。2026 年之前的十年里,以 MyFitnessPal 为代表的记录类应用长期占据营养追踪的主流入口——仅 2018 年初,MyFitnessPal 的月独立活跃用户就超过 1,900 万。但这类应用有一个共同的痛点:录入成本。用户必须逐项登记吃下的每种食材及其份量,要么用厨房秤称重(精确但繁琐),要么凭肉眼估计份量(省事但高度不可靠,视觉份量估计的错误率高达 40%-50%)。

若餐食来自固定菜单(如连锁餐厅的标品汉堡),拍照识别即可自动带出营养值——已有大量工作证明了这条路线的可行性。但现实中绝大多数家庭餐、自助餐、外卖拼盘并不在任何菜单上:盘子里有几样菜、各放了多少、油放了多少,全都未知。论文作者将这一类别命名为 generic food(通用食物):理解通用食物不仅需要识别「盘子里有什么」,还需要估计「每样有多少」,前者是分类问题,后者是回归+体积估计问题,难度显著跃升。

1.2 数据瓶颈:互联网图片救不了营养估计

视觉任务的传统捷径是「从网上爬数据」,但营养方向此路不通,论文指出三重原因:

  1. 份量缺失:网络食谱图片(哪怕像 Recipe1M 这样的大集合)只有菜品与配料列表,没有照片中实际呈现的份量标注——「一份意大利面」的图片可能是 150 克也可能是 450 克,而营养值恰恰由克数决定。
  2. 摆拍失真:网络图片为视觉吸引力而摆盘打光,与真实用餐视角、容器、光线分布差异巨大。
  3. 标注噪声:让人工标注员看图猜克数,误差本身就有四成以上——用这种标注监督模型等于以讹传讹。

Nutrition5k 的回答是:别猜,去称。把传感器阵列搬进真实自助餐厅,让每一盘菜在被吃掉之前先「过一遍扫描仪」,用秤和相机同时留下物理真值与视觉记录。

1.3 一句话定位

Nutrition5k = 受控环境多传感器采集 × 增量电子秤克重真值 × USDA 换算营养标注 × 5,006 盘真实多样性 × CC BY-4.0 全量公开。它证明了:一份足够精确的份量-营养监督信号,可以把「照片估卡路里」做到误差低于专业营养师肉眼估计的水平。

2. 名称、身份与查重说明

2.1 命名考据

  • Nutrition5k 中的「5k」指约 5,000 盘菜肴的规模;官方仓库与论文均写作 Nutrition5k(内部部分文件与后续文献亦有 Nutrition5K 写法,指同一资源)。
  • 论文标题中的 generic food 是理解本数据集定位的关键词:与 fixed-set food(固定菜单分类,如 Food-101 的 101 类)相对,generic food 指份量与配方均不受控的任意餐食。
  • 官方 GitHub 仓库组织在 google-research-datasets 账号下,副标题 A Comprehensive Nutrition Dataset。

2.2 身份核验与撞库排查(本条目成稿存照)

本条目成稿前执行了三重查重(2026-10-17):

  • 库内 DB 精确/模糊查询:url_name ILIKE '%nutrition%' 仅命中 maternal-ultrasound-nutrition(rid 615,产科超声-营养方向条目),与本条目无任何实体重叠,不构成别名或版本关系。
  • writing/ 目录检查:nutrition5k 目录在本代理开工前不存在(现目录内为本代理的锁文件与工作产物),无同名或近名成稿。
  • dedup_gate 两条 HIT 均判定为误报:其一命中本代理自己刚创建的锁目录;其二为候选池 dispatched 状态,属派发器自冲突的已知误杀模式(历史教训 R017),实查 DB 无此 slug。

结论:nutrition5k 为库内新条目,与在架 615 号条目仅共享 nutrition 字样,非同一资源,正常成稿。

2.3 与易混淆资源的区分

易混淆对象 关系 区分要点
Recipe1M 前置数据集(食谱网站挖掘) 有配料与做法文本,无照片份量真值;Nutrition5k 有克重+营养
Food-101 / UEC-Food 固定菜单分类数据集 只做分类不做营养回归;无克重、无深度
USDA FoodData Central 营养数据库(非图像) Nutrition5k 的营养换算源头;本身无视觉数据
MyFitnessPal 类应用数据库 商业闭源食物库 菜品级平均值,无实物照片与份量实测
mobile_food_segmenter_V1 本数据集配套发布的分割模型 TFHub 上独立资源,系 Nutrition5k 工作的衍生模型而非数据集
maternal-ultrasound-nutrition(本库 rid 615) 本库在架条目 孕产妇超声-营养临床方向,与本数据集无实体关系,仅 slug 字样相近

3. 学术定位与问题形式化

3.1 任务定义

Nutrition5k 支持的核心任务是营养回归:给定一盘食物的视觉观测(单帧图像、多帧视频序列或 RGB-D 数据),预测:

  • 总卡路里(kcal)
  • 总质量(g)
  • 总脂肪(g)
  • 总碳水化合物(g)
  • 总蛋白质(g)

以及可选的逐成分分解:盘中每种成分的名称、克数与各自营养值——这是比 dish 级总量更细的粒度,要求模型同时完成检测、识别、分割与份量估计。

3.2 与既有基准的对照

论文将当时的数据集归纳为三类并指出各自的监督缺口:

  1. 食谱类(Recipe1M 等):dish/ingredient 级文本标注丰富,但图像份量真值缺失;
  2. 餐厅菜单类:营养值精确但菜品集合封闭,覆盖不了 generic food;
  3. 自我报告类(食物日记、24 小时回顾):依赖人工回忆与估计,误差系统性偏大。

Nutrition5k 在三类缺口上同时补位:物理实测的份量真值(第一类缺)、开放菜品空间(第二类缺)、仪器级精度(第三类缺)。

3.3 输入模态的三档设定

论文实验覆盖三档信息量递增的输入设定,这也成为后续工作常用的比较框架:

  • 2D 份量无关(portion-agnostic):只用图像预测每克营养密度或归一化后的营养值,回避份量估计;
  • 2D 直接预测:直接从图像回归绝对营养值,份量完全靠视觉推断;
  • 深度辅助:把俯拍深度图作为第四通道输入,或先估计体积再换算质量与营养。

三档设定的结果梯度(卡路里 MAE 9.5% → 26.1% → 18.8% → 16.5%)本身就是本数据集最有信息量的「元发现」:没有深度/体积信息,绝对营养回归的误差会翻倍以上。

4. 论文与发布时间线

4.1 从投稿到开源的年表

时间 事件
2020 年(论文回溯期) Google 加州园区自助餐厅扫描平台部署与数据采集(论文 temporalCoverage 起点按机构存照口径记为 2020)
2021-03 arXiv:2103.03375 首版挂出,宣布数据集「即将开源」(当时国内技术社区以「即将开源」为题报道,存照:论文发表时数据尚未可下载)
2021-06 CVPR 2021 正式发表(Proceedings of IEEE/CVF CVPR, pp. 8903-8911,线上会议年度)
2021-06-15 GitHub 仓库 google-research-datasets/Nutrition5k 初始化提交(commit 891e5ca,Uploading init README and scripts),GCS bucket 同步开放下载
2021-06-23 README 增补 TFHub mobile_food_segmenter_V1 分割模型链接(commit c1f80d7),成为仓库最后一次实质性内容更新
2021 至今 数据集进入长期维护态:无版本号迭代,单一发布版本持续可用

4.2 版本链结论

Nutrition5k 自 2021-06 开源以来未发布过带版本号的修订版:CSV 结构、split 文件与目录布局保持初始形态,仓库更新仅限 README 内容增删。引用与复现实验时无需担心版本分叉,但也意味着此后五年里领域进展(更大成分库、更多菜系)未被回填进数据集——这是引用时应当意识到的「冻结快照」属性。

4.3 双口径时间存照

  • 智源社区等中文技术社区在 2021-03 论文挂出时即报道「数据集即将开源」,与 GitHub 仓库 2021-06-15 实际初始化存在约三个月间隔——引用「发布时间」时应区分论文发布(2021-03/06)与数据开源(2021-06-15)。
  • 数据下载整包自公开起即标注 181.4 GB,历次引用的容量数字未见变更记录。

5. 机构与人物

5.1 作者团队

七位作者均属 Google 体系:

作者 角色/背景线索
Quin Thames 第一作者,论文通讯邮箱挂名首位
Arjun Karpur 合作者,采集系统工程方向
Wade Norris 挂 Perception Labs;论文脚注注明 work done while at Google(成稿时已离职)
Fangting Xia 合作者
Liviu Panait 合作者,机器学习方向
Tobias Weyand Google 资深研究员,地理/视觉系统方向
Jack Sim Google 资深工程师,SeeFood 系列食物视觉项目核心成员

致谢名单:Ben Goldberger、Caitlin O’Brien,以及 Google LAX/PLV Cafeteria 团队——LAX 与 PLV 分别指向洛杉矶园区与山景城园区餐厅,是理解采集点位数的关键旁证(见 §5.3 双口径存照)。

5.2 机构视角

  • 数据集与论文均为 Google 单一机构产出,无高校合作方;这与多数学术数据集的「高校实验室+公开数据采集」模式不同——Nutrition5k 的采集成本(定制机器人平台、嵌入真实食堂运营)只有企业级资源能承担。
  • 关联生态:Jack Sim 所在团队即 SeeFood(硅谷著名「热狗识别」梗的真实原型项目)谱系,本数据集配套发布的 TFHub 分割模型延续了同一条食物视觉产品化路线。

5.3 采集点位双口径存照

  • README 口径:a few select cafeterias in California(加州少数几家自助餐厅);
  • 论文正文口径:single campus cafeteria(单一园区自助餐厅);
  • 致谢旁证:LAX/PLV 两个餐厅团队并列致谢;
  • 元数据文件名 dish_metadata_cafe1.csv 与 dish_metadata_cafe2.csv 暗示数据按两个餐厅点位(cafe1/cafe2)分别成表。

四种口径合并的合理解读:同一园区的多个餐厅点位(至少 cafe1/cafe2 两处,均在加州),论文表述取「单园区」的合并视角,README 表述取「多点餐厅」的运营视角。本条目正文统一采用「加州园区内两个餐厅点位」的中和表述,并在此存照。

6. 采集平台与工程实现

6.1 硬件架构:一台「餐盘认知扫描仪」

Nutrition5k 的采集平台是一套自定义传感器阵列 + 机器人自动化触发系统,部署在餐厅收银/取餐动线上,顾客取餐盘经过时自动完成扫描。核心组件:

  1. 5 个相机:
    • 1 台正上方俯拍相机(RGB);
    • 4 台 Raspberry Pi 侧角相机(标记 A-D),方位角彼此相差 90°,俯仰角交替设置在水平线下约 30° 与 60°;
    • 侧角相机分辨率 1920×1080,每次采集同步向外扫掠 90° 弧线,约 8 秒覆盖餐盘全向。
  2. 1 台 Intel RealSense D435 深度相机:俯拍位采集深度流;深度图通过对约 8 秒的数据取平均进行去噪与空洞填补;相机距拍摄平面 35.9 cm,该距离下每像素对应约 5.957×10⁻³ cm² 的实际面积。
  3. 电子秤:位于餐盘下方,以 ±1 克 精度对「增量投料」连续称重——每种食材被加进盘里的瞬间,重量跳变即为该成分的净克数。
  4. 机器人自动化触发:所有传感器由自动化系统同步触发,保证视频帧、深度帧与称重读数的时间对齐。

6.2 增量扫描(incremental scanning)流程

这是 Nutrition5k 最具巧思的工程设计。与传统「拍成品」不同,采集发生在打餐过程中:

  1. 空盘放上秤,系统建立该餐盘的记录(dish_id = 十位时间戳);
  2. 每次食堂员工/顾客往盘中添加一种食材,秤的读数跳变 ΔW 即该成分的净重;
  3. 系统在每个投料步后触发一轮全相机扫描,留下该步骤的视觉快照;
  4. 全部投料完成后,逐成分克重序列 + 各步视觉快照 + 成分身份(对应当日菜单上该菜品的 USDA 编码)共同构成一盘完整标注。

增量扫描带来的标注能力是革命性的:无需任何人工看图估克,每一成分的克数由物理仪器直接给出;营养成分则按 USDA 每克含量 × 增量重量精确换算。同时它也带来一个数据管理约束:同一次增量扫描产生的中间快照与最终成品属于「同一盘菜的多视角」,在 train/test 划分时必须整体归入同一侧,防止同一物理盘子的图像同时出现在训练与测试中造成泄漏——官方 split 文件已落实该约束。

6.3 深度数据的编码细节

  • 原始深度以 16-bit PNG 编码,depth units 为 10,000(即 1 米 = 10,000 个深度单位);
  • 深度上限截断在 0.4 m(4,000 单位),超过扫描支架实际高度,保证有效动态范围集中在食物区域;
  • 另提供 colorized depth(彩色化深度)版本:近处偏蓝、远处偏红,供人工快速检视;
  • RGB、raw depth、colorized depth 三张一组,按 dish_id 组织在 imagery/realsense_overhead/ 目录。

6.4 数据组织与目录布局

nutrition5k_dataset/
├── imagery/
│   ├── side_angles/          # 侧角视频,按 dish_id 分目录
│   │   └── dish_XXXXXXX/
│   │       ├── A.mp4  B.mp4  C.mp4  D.mp4
│   │       └── frames/       # extract_frames.sh 抽帧后生成
│   └── realsense_overhead/   # 俯拍 RGB-D 三联(约 3.5k 盘)
│       └── dish_XXXXXXX/
│           ├── RGB.png
│           ├── depth_raw.png      # 16-bit
│           └── depth_color.png    # 可视化
├── metadata/
│   ├── dish_metadata_cafe1.csv
│   ├── dish_metadata_cafe2.csv
│   └── ingredient_metadata.csv
├── dish_ids/
│   └── splits/
│       ├── train.txt
│       └── test.txt
└── scripts/
    ├── extract_frames.sh
    ├── extract_frames_sampled.sh
    └── compute_eval_statistics.py

dish 级 CSV 的字段结构为宽表:dish_id, total_calories, total_mass, total_fat, total_carb, total_protein, num_ingrs 后接逐成分 8 字段块(ingr_i_id, ingr_i_name, ingr_i_grams, ingr_i_calories, ingr_i_fat, ingr_i_carb, ingr_i_protein 及成分序号),每盘重复 num_ingrs 次。成分 ID 形如 ingr_ + 十位补零序号,与 ingredient_metadata.csv 中的 USDA 每克营养值对齐。

7. 数据规模与统计画像

7.1 核心硬数字

维度 数值 口径
扫描餐盘数 5,006 官方 README(scans for 5,006 plates)
独特菜肴数 5,066 论文表格口径(双口径存照见 §16 坑 1)
成分种类 >250 USDA 数据库子集
每盘平均成分数 5.7 论文统计
单盘最多成分数 35 论文统计
侧角视频总数 约 20,000 段 每盘 4 段 × 5,006 盘
含俯拍 RGB-D 的盘数 约 3.5k 占全集约 70%
视频规格 1920×1080,每段约 8 秒 4 侧角同步扫掠 90°
深度编码 16-bit PNG,1 m=10,000 单位,上限 0.4 m RealSense D435
称重精度 ±1 g 盘下电子秤增量称重
卡路里范围 数 kcal 至 >1,000 kcal 论文统计
整包体积 181.4 GB(tar.gz) GCS 官方下载

7.2 规模双口径存照

5,006(README)与 5,066(论文)的出入最可能的来源是去重口径:增量扫描中部分盘子属于同一物理餐盘的中间态/重复扫描,论文表格统计「独特菜肴」时可能保留了 README 计数中被合并的条目,或反之。官方未给出显式解释。本条目成稿统一采用 README 的 5,006 作为主口径(因其与 split 文件、可直接下载的数据一致),论文口径 5,066 在引用处随注。

7.3 多样性画像与偏倚

  • 菜系偏西式:采集于加州 Google 食堂,菜品以美式/西式简餐、沙拉、亚洲融合菜为主;README 的 Dataset Bias Disclaimer 明确承认 not cover all food cuisines。中餐猛火炒制、深汤类菜品在浅盘扫描场景中代表性有限。
  • 份量分布宽:卡路里从个位数 kcal(调料碟级)跨到 1,000+ kcal(满盘主餐),配合平均 5.7 种成分/盘,构成回归任务的天然难度谱。
  • 场景同质性:所有图像共享同一扫描平台背景(传感器支架、固定光照、固定拍摄距离 35.9 cm),模型在该分布内表现优异,但直接迁移到用户手机随手拍场景存在已知的分布差距(domain gap)——这是使用本数据集时最需要主动管理的偏倚。

8. 标注体系:从克重到营养值的换算链

8.1 三层标注结构

  1. 物理层(仪器直测):逐成分克重(电子秤 ±1 g)、总质量;
  2. 换算层(USDA 映射):每种成分按 USDA Food and Nutrient Database 的每克营养含量,乘以实测克数得到该成分的卡路里/脂肪/碳水/蛋白质;全菜营养值为逐成分求和;
  3. 视觉层(传感器记录):4 路侧角视频、俯拍 RGB 与深度图,与物理层通过 dish_id 与投料时序对齐。

这条换算链的关键性质是:营养标注的误差源被压缩到了两处——秤的 ±1 g 与 USDA 平均值的代表性误差。相比之下,人工视觉标注方案(看图猜克数×查表)还要叠加约 41%-53% 的份量估计误差。这正是论文标题中 high accuracy nutritional content annotation 一词的底气。

8.2 USDA 映射的工程细节

  • ingredient_metadata.csv 收录数据集覆盖的全部成分及其 USDA 每克营养值(卡路里、脂肪、碳水、蛋白质),成分 ID 统一为 ingr_[十位补零序号];
  • 成分身份的确定依赖采集时点的当日菜单对齐:扫描平台上每个投料动作对应食堂线上的一个已知菜品容器,其配方按 USDA 条目登记;
  • 由此,每盘菜可以还原出完整的成分构成树:dish → ingredients → per-ingredient mass & macros。

8.3 标注的粒度与限制

  • dish 级六元组(total_*)与逐成分级 8 字段块均直接可得,支持总-分两级监督;
  • 不提供像素级成分掩码:数据集本身没有分割标注;官方配套的 mobile_food_segmenter_V1 是在更大规模内部数据上训练的独立模型,其标注并非来自 Nutrition5k 的 5,006 盘;
  • 不含烹饪油摄入的独立测量:油脂混入菜品后由 USDA 平均值近似,无法逐勺计量;
  • 深度图仅俯拍单视角,无侧角深度,三维重建需自 行从视频序列开发。

9. 官方划分、评估协议与基线结果

9.1 Train/Test 划分

  • Nutri-Train / Nutri-Test:按菜肴 90%/10% 划分;
  • 划分以增量扫描关系为约束:同一次增量扫描产生的一切图像(中间态快照、最终成品、各相机视角)整体归入同一 split;
  • 官方 split 文件位于 dish_ids/splits/(train.txt/test.txt,每行一个 dish_id);
  • 未设官方验证集:研究者通常从 Nutri-Train 自行切出 dev 子集,或以测试集调参(后者属应避免的坏实践,论文未强制约束)。

9.2 官方评估脚本

scripts/compute_eval_statistics.py 接受一个「每盘营养预测值」CSV,输出各营养维度的绝对 MAE与百分比 MAE(相对测试集均值),可直接对齐论文 Table 3 的报告口径。这使任何后续工作的数字都可以与论文基线无损比较——在营养回归这个缺乏统一排行榜的领域,这一官方协议事实上成为了社区的比较标准。

9.3 基线模型与结果(论文 Table 3)

论文在统一骨干下比较了五种预测策略(数值格式:MAE / 占测试集均值百分比):

策略 Calorie (kcal) Mass (g) Fat (g) Carb (g) Protein (g)
均值基线 150.8 / 60.2% 124.6 / 58.5% 8.2 / 67.6% 12.5 / 62.1% 10.5 / 62.1%
2D 份量无关 24.1 / 9.5% – 2.3 / 18.3% 2.7 / 13.9% 2.2 / 12.0%
2D 直接预测 70.6 / 26.1% 40.4 / 18.8% 5.0 / 34.2% 6.1 / 31.9% 5.5 / 29.5%
深度作第 4 通道 47.6 / 18.8% 40.7 / 18.9% 2.27 / 18.1% 4.6 / 23.8% 3.7 / 20.9%
体积标量输入 41.3 / 16.5% 29.4 / 13.7% 3.0 / 25.5% 4.5 / 22.0% 5.2 / 31.1%

配套的质量回归消融(Table 4):仅图像 38.1 g(29.5%);图像+体积估计 29.4 g(13.7%)——体积先验把份量估计误差砍掉一半以上。

9.4 结果解读:四条关键结论

  1. 份量无关任务已被基本解决:归一化设定下卡路里密度估计误差 9.5%,说明「识别盘中是什么、营养密度大概多少」在 2021 年已可用模型胜任。
  2. 绝对份量是主瓶颈:2D 直接预测的卡路里误差(26.1%)与份量无关设定(9.5%)之间的三倍差距,几乎全部来自克数估计——这正是深度信息介入的动机。
  3. 深度/体积信息收益明确但未饱和:加入深度第 4 通道把卡路里 MAE 从 26.1% 压到 18.8%,体积标量端到端管道进一步压到 16.5%——但距离 9.5% 的份量无关下限仍有一倍差距,留出了后续工作的改进空间。
  4. 模型已优于专业营养师的肉眼:人类对照实验中,4 名注册营养师对测试集图像的视觉估重平均误差 41%,16 名非专业者 53%;而 2D 直接预测模型的质量估计误差约 18.8%。结论:人工视觉标注份量既不可行也无必要——这组数字成为论证「营养估计必须走传感器真值+模型路线」的经典证据(样本极小的局限见 §16 坑 5)。

10. 使用指南:从下载到跑通第一个实验

10.1 获取路径

# 路径一:整包下载(181.4 GB,需 Google 账号登录的认证 URL)
# https://storage.cloud.google.com/nutrition5k_dataset/nutrition5k_dataset.tar.gz

# 路径二:gsutil 选择性下载(推荐,可只取所需模态)
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/metadata" .
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/dish_ids" .
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/imagery/realsense_overhead" .

低带宽研究者的实用建议:先只拉 metadata + dish_ids + realsense_overhead 三个目录(跳过约 20,000 段视频),即可复现论文全部 RGB-D 与 metadata 基线;侧角视频仅在需要多视角/时序实验时才值得下载。

10.2 数据读取快速上手

import pandas as pd

# dish 级宽表:前 7 列为 total_*,其后为逐成分 8 字段重复块
df = pd.read_csv("metadata/dish_metadata_cafe1.csv")
total_cols = ["dish_id","total_calories","total_mass","total_fat",
              "total_carb","total_protein","num_ingrs"]
ingr_cols  = total_cols + [f"ingr_{i}_{f}" for i in range(1, 36+1)
                           for f in ["id","name","grams","calories",
                                     "fat","carb","protein"]]

# 深度图解码:16-bit PNG,1 m = 10,000 单位,0.4 m 截断
import cv2, numpy as np
depth = cv2.imread("imagery/realsense_overhead/dish_x/depth_raw.png",
                   cv2.IMREAD_UNCHANGED).astype(np.float32) / 10000.0

侧角视频抽帧用官方脚本:sh extract_frames_sampled.sh 5(每 5 帧取一,论文模型即以此采样率训练)。

10.3 复现论文基线的最小流程

  1. 解析两份 dish_metadata CSV → 按 dish_id 合并;
  2. 按 splits/train.txt、test.txt 划分;
  3. 每盘取俯拍 RGB(+深度第 4 通道或体积标量,按对比策略);
  4. 训练回归头(论文用 Inception 系骨干,后续工作普遍换用现代 backbone 亦可比);
  5. 预测值写 CSV → 跑 compute_eval_statistics.py → 与 Table 3 对表。

10.4 常见工程坑与对策

现象 原因 对策
深度图可视化全黑/全白 16-bit 值域未除以 10000 先转 float 再除 depth units;上限按 0.4 m 截断
逐成分列解析越界 各盘 num_ingrs 不同、宽表尾部空列 按 num_ingrs 动态切片,勿固定读 35 组
train/test 指标异常好 split 文件未用官方版、自行随机划分导致增量扫描泄漏 必须使用 dish_ids/splits/ 官方文件
视频帧数不齐 4 相机扫掠时长略异 用官方每 5 帧采样脚本而非等间隔假设
cafe1/cafe2 成分 ID 对不上 两餐厅成分表有交集亦有差异 以 ingredient_metadata.csv 全集为字典,勿假设两表同构

11. 配套模型与衍生资源

11.1 mobile_food_segmenter_V1(TFHub)

  • 发布于数据集开源同期(2021-06-23 README 增补),部署形态为 TensorFlow Hub 模块;
  • 定位:移动端食物分割模型(SeeFood 谱系),输入食物图像,输出食物区域掩码,可用于下游份量估计管线的食物/背景分离;
  • 与数据集的关系是同一团队、同一产品线的姊妹发布,而非「Nutrition5k 的官方分割标注」——该模型的训练数据来自 Google 内部更大规模语料,不以本数据集 5,006 盘为边界;
  • 使用注意:TFHub 资源在部分网络环境需镜像访问;模型输入输出规格以 TFHub 页面为准。

11.2 学术衍生生态(选列)

Nutrition5k 开源后成为份量感知营养估计的事实基准,代表性后续方向:

  • 体积/深度增强:以单目深度估计网络替代 RealSense 输入,弥合真实手机拍摄场景的分布差距;
  • 逐成分分解:从 dish 级回归推进到「盘中每种食材各占多少克」的成分级监督学习,直接利用逐成分标注块;
  • 合成数据扩充:以扩散模型在 Nutrition5k 图像上做语义保持的份量/外观编辑,缓解采集场景同质性;
  • 多模态膳食记录:与食谱文本、可穿戴传感器数据联合建模,面向真实连续膳食监测。

(具体论文清单随领域演进较快,本条目仅锚定方向性事实,不逐篇存照。)

12. 与同类数据集的系统对比

数据集 规模 份量真值 营养标注 深度 菜系覆盖 许可
Nutrition5k 5,006 盘 / >250 成分 ✅ 电子秤 ±1 g(逐成分) ✅ USDA 换算,逐成分+全菜 ✅ 俯拍 RGB-D(70% 盘) 西式为主(加州食堂) CC BY-4.0
Recipe1M ~100 万食谱 ❌ 配料文本级(无照片克数) ❌ 广(网络食谱) 研究用途
Food-101 101 类 / 10 万图 ❌ ❌ ❌ 西式 研究用途
UEC-Food 系列 日本菜品分类 ❌ ❌ ❌ 日式 研究用途
FoodData Central (USDA) 数十万条目 非图像 ✅ 权威营养库 ❌ 美国标准食物 公有领域
VFN / 食物日记类 小规模 人工自报(高噪声) 自报 ❌ 混合 各异

结论性观察:在「份量真值 × 营养精度 × 规模 × 开放许可」四维空间中,Nutrition5k 在 2021-2026 年间没有同级别的直接竞争者——其他数据集要么有规模无真值(Recipe1M/Food-101),要么有真值无规模(实验室小样本),要么根本不是视觉数据集(USDA)。这解释了它作为默认基准的持久地位,也解释了其偏倚(西式、固定场景)为何被社区反复讨论却难以替代。

13. 应用场景与目标用户

13.1 直接应用

  1. 相机膳食记录产品:拍一张照自动估算卡路里与宏量营养素(健康/健身类 App 的核心能力);
  2. 临床营养管理:糖尿病、肥胖、肾病等需要精确膳食控制的场景的摄入量辅助估算;
  3. 食堂/餐饮营养测算:团餐场景的自动化营养成分公示;
  4. 流行病学膳食调查:替代/校准 24 小时膳食回顾等自报工具的客观化传感器。

13.2 方法学应用

  1. 多模态回归基准:视觉→物理量的回归方法学研究(深度利用、体积估计、不确定性量化);
  2. 域适应研究:受控扫描分布 → 野生手机拍摄分布的迁移学习测试床;
  3. 标注方法论教学案例:增量称重如何把「无法标注的问题」变成「仪器可测的问题」——数据工程课程的高价值案例。

14. 局限与批判性视角

14.1 数据集自带声明

官方 README 的 Dataset Bias Disclaimer 原文要点:不覆盖所有菜系;不宣称解决全部食物理解问题;定位是提供独特粒度的标注与深度数据以推动领域。

14.2 本条目补充的批判性要点

  1. 分布封闭性:所有图像来自同一套扫描平台(固定距离、固定光照、带传感器支架的背景),模型性能在平台内被系统性高估,向真实场景外推需自行做域适应——论文自己也在机器人自动化偏差一节承认了这一点;
  2. 营养标注的「平均化」继承:USDA 数值是食物类别的平均组成,同一食材的品种、产地、烹饪方式差异未被建模;±1 g 的秤精度不代表同等精度的营养真值;
  3. 人类对照实验的样本量:10 张图、4 名营养师、16 名非专业者,「优于专业营养师」是演示性结论而非统计检验结论,媒体转引时常被夸大为普适结论;
  4. 无视频级时序标注:约 20,000 段视频没有行为/动作标注,时序建模只能自监督或以帧级营养值弱监督;
  5. 维护停滞:2021-06 后无实质更新,成分库未随 USDA 数据库演进,issue 区的社区反馈未系统性回填进数据。

15. 分角色阅读路径与实操清单

15.1 按角色定制路线

角色 A:想快速复现论文基线的硕士生/工程师

  1. 只下载 metadata + dish_ids + realsense_overhead(约 10-20 GB 量级,跳过视频);
  2. 按 §10.2 解析 CSV,按 §10.3 五步流程跑通 2D 直接预测;
  3. 用官方脚本出数字,对照 Table 3 的 26.1% 校准实现正确性;
  4. 再决定是否上深度通道(18.8%)与体积标量(16.5%)。

角色 B:做份量估计方法研究的博士生

  1. 重点吃透增量扫描机制(§6.2)——理解为什么 split 不能自行随机切;
  2. 以质量回归消融(Table 4:29.5% → 13.7%)为你的方法对标起点;
  3. 关注域适应:用你的方法把「平台内 16.5%」向「野生照片」推进,报告两个分布下的双口径;
  4. 慎用测试集调参;官方无验证集,建议从 train 内固定切分并公开你的切分。

角色 C:健康/健身类产品团队

  1. 评估目标不是刷 Table 3,而是产品场景误差预算:份量无关的 9.5% 是「识别营养密度」的上限参考,绝对份量必须靠产品侧约束(标准餐具、参考物、多帧)补偿;
  2. mobile_food_segmenter_V1 可直接集成做食物区域分离;
  3. 注意 CC BY-4.0 的署名义务与可商用许可——数据集层面无商用障碍,模型许可另查 TFHub 条款。

角色 D:公共卫生/流行病学研究者

  1. 把 Nutrition5k 视为「相机膳食估计可行性与误差量级」的证据库,而非直接分析数据;
  2. 人机对比(营养师 41% vs 模型 ~19%)可用于论证自报膳食调查的系统性低估;
  3. 菜系偏西式的局限在你的目标人群中可能被放大,谨慎外推。

15.2 下载与预处理检查清单

  • [ ] 确认磁盘余量 >400 GB(整包)或按目录估算(仅 metadata+split <1 GB);
  • [ ] gsutil 已安装并完成账号认证(整包 URL 需登录态);
  • [ ] 解压后核对四大顶层目录:imagery/、metadata/、dish_ids/、scripts/;
  • [ ] CSV 读取按 num_ingrs 动态切片(勿固定 35 组);
  • [ ] 深度图以 IMREAD_UNCHANGED 读入并除以 10000;
  • [ ] split 使用官方文件,记录 md5 到实验日志;
  • [ ] 抽帧用官方每 5 帧脚本,与论文口径一致;
  • [ ] 评估输出格式与 compute_eval_statistics.py 的输入模板对齐。

15.3 实验报告自检清单

  • [ ] 报告了绝对 MAE 与百分比 MAE 双口径;
  • [ ] 报告了五维(calorie/mass/fat/carb/protein)而非只报卡路里;
  • [ ] 注明使用了哪一档输入设定(份量无关/2D 直接/深度第 4 通道/体积标量);
  • [ ] 注明是否使用了官方 split 与抽帧率;
  • [ ] 若在自切验证集上调参,已公开切分方式;
  • [ ] 若引入非 Nutrition5k 数据(如外部深度估计器),已声明其训练数据边界。

16. 坑点清单:使用 Nutrition5k 的十个高频陷阱

坑 1:把 5,006 与 5,066 当作同一口径随意混用。README 扫描盘数与论文独特菜肴数相差 60,来自增量扫描的去重口径差异。对策:全文统一主口径(建议 5,006),引用论文表格时随注 5,066,实验报告注明你复现时实际加载数。

坑 2:自行随机划分 train/test 造成增量扫描泄漏。同一物理盘的中间态快照与成品共享秤读数与外观,随机划分会让测试集几乎是训练集的翻版,指标虚好到失真。对策:永远使用 dish_ids/splits/ 官方文件;自建实验时以增量扫描组为单位切分。

坑 3:CSV 宽表按固定列数解析。每盘成分数 1-35 不等,固定读取 35 组逐成分字段会在短菜谱盘上拿到大量空列、在超 35 成分盘(本数据集最大恰为 35,边界安全但脆弱)上踩边界。对策:以 num_ingrs 驱动切片;解析后断言 num_ingrs 与非空成分块数一致。

坑 4:深度图不除 depth units 直接可视化。16-bit 原始值域 0-4000,按 8-bit 习惯 normalize 会得到全黑图并误判数据损坏。对策:IMREAD_UNCHANGED → float32 → ÷10000 → clip 0-0.4 m;或直接用官方 colorized 版本人检。

坑 5:把「优于专业营养师」当作统计显著结论引用。对照实验仅 10 张图、4 名营养师、16 名非专业者,无显著性检验。对策:引用时注明演示性样本量;学术写作中避免「significantly outperform」式表述。

坑 6:假设俯拍 RGB-D 覆盖全集。仅约 70%(3.5k 盘)有深度。对策:加载深度前查 realsense_overhead/ 目录是否含该 dish_id;深度实验报告实际样本数。

坑 7:cafe1/cafe2 两份 CSV 的成分字典混用。两餐厅成分表同构但非同集,跨表 join 时可能出现只在单侧登记的成分 ID。对策:以 ingredient_metadata.csv 全集建字典;加载后对孤儿 ID 做断言。

坑 8:把 mobile_food_segmenter_V1 的掩码当 Nutrition5k 官方分割标注。该模型是同团队独立训练的姊妹发布,训练语料大于本数据集,其输出不能作为 5,006 盘的 ground truth 掩码用于监督学习。对策:分割监督需求需自行构建或引用后续再标注工作。

坑 9:低估场景同质性偏倚,直接部署到野生照片。固定 35.9 cm 距离、无手持抖动、统一光照与支架背景,模型误差在平台内被系统性低估。对策:上线前在你的真实分布上重测;优先考虑以深度估计器做输入适配的域适应方案。

坑 10:忽略 CC BY-4.0 之外的模型许可。数据集本身可商用可改编,但配套 TFHub 模型的使用条款独立存在;商用集成前逐项核对 TFHub 页面许可,勿以数据集许可推定模型许可。

17. 常见误解澄清

误解 1:「Nutrition5k 有 5,000 张食物图片」。不对——它有 5,006 个餐盘扫描记录,每盘含 4 段视频(约 8 秒 ×4)与可选俯拍 RGB-D 三联;按抽帧后的图像计,规模在数十万帧量级。

误解 2:「营养标注是专家看图标的」。恰恰相反:克重来自电子秤物理实测,营养值由 USDA 每克含量换算。全程没有「看图估克」环节——这正是它优于人工标注数据集的根本原因。

误解 3:「这是食物分类数据集」。不是。Nutrition5k 是回归数据集(卡路里/质量/宏量营养素),分类任务只作为中间环节存在;菜品空间开放,不构成封闭类别集。

误解 4:「深度数据覆盖全部菜肴」。仅约 70%(3.5k 盘)有俯拍 RGB-D,侧角相机只采集 RGB 视频。

误解 5:「模型击败了所有营养师」。是「平均误差低于 4 名营养师的平均视觉估重误差」,样本 10 张图,演示性质;不能推论为对任意营养师个体的逐对比较优势。

误解 6:「数据集包含美国各菜系,可以做中国菜营养估计」。采集于加州园区食堂,西式为主、亚洲融合为辅;中餐典型形态(合餐、深盘、油汤)覆盖薄弱,直接用于中式膳食估计需谨慎并补域内数据。

误解 7:「既然 CC BY-4.0,配套分割模型也可以随便商用」。数据与模型许可相互独立,TFHub 模型条款需单独核对。

误解 8:「Nutrition5k 与本库 maternal-ultrasound-nutrition 是同系数据」。两者仅 slug 共享 nutrition 字样;后者为孕产妇超声-营养临床条目(rid 615),与本数据集无实体关系。

18. 一页速查卡(Cheat Sheet)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Nutrition5k 速查卡
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
论文      CVPR 2021, pp.8903-8911 | arXiv:2103.03375
代码/数据 github.com/google-research-datasets/Nutrition5k
下载      gs://nutrition5k_dataset (tar.gz 181.4 GB)
许可      CC BY-4.0(数据)|TFHub 模型另查条款
联系      nutrition5k@google.com
──────────────────────────────────────────────────
规模      5,006 盘(论文 5,066)|>250 成分|均 5.7 成分/盘
视频      4 路/盘 × 约 8 s × 1080p,30°/60° 俯仰,扫掠 90°
深度      RealSense D435 俯拍,16-bit,1m=10000 单位,上限 0.4m
称重      电子秤 ±1g,增量投料逐成分克重
营养      USDA 每克含量 × 增量重量(逐成分+全菜)
划分      Nutri-Train 90% / Nutri-Test 10%(增量组整体同侧)
──────────────────────────────────────────────────
关键数字(MAE / %)
  均值基线        150.8 kcal / 60.2%
  2D 份量无关      24.1 /  9.5%   ← 密度估计≈已解决
  2D 直接预测      70.6 / 26.1%   ← 份量是瓶颈
  深度第 4 通道    47.6 / 18.8%
  体积标量端到端   41.3 / 16.5%
  质量回归: 29.5% → 13.7%(加体积先验)
  人类: 营养师 41% | 非专业 53%(n=10 图,演示性)
──────────────────────────────────────────────────
五大高频坑
  1) 5,006 vs 5,066 双口径勿混用
  2) 勿自切 split(增量扫描泄漏)
  3) CSV 按 num_ingrs 动态切片
  4) 深度图 ÷10000 再可视化
  5) 「胜营养师」是演示性小样本结论
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

19. 术语表

术语 英文 释义
通用食物 generic food 不属于固定菜单、份量与配方未知的任意餐食,本数据集的核心对象
增量扫描 incremental scanning 打餐过程中逐成分投料、逐次称重与拍照的采集协议,克重真值的来源
份量无关 portion-agnostic 回归归一化(每克营养密度)从而回避克数估计的任务设定
份量估计 portion size estimation 从视觉观测估计食物克数/体积,营养回归的主瓶颈
深度单位 depth units 16-bit 深度图的计量因子,本集为 10,000(1 m=10,000)
宏量营养素 macronutrient 脂肪、碳水、蛋白质三大产能营养素
USDA Food and Nutrient Database – 美国农业部食物营养数据库,本集营养换算的权威来源
百分比 MAE percentage MAE 绝对误差相对测试集均值的百分比,论文主要报告口径
域差距 domain gap 扫描平台分布与真实拍摄分布之间的系统性差异
RGB-D RGB-Depth 彩色图+深度图的成对影像,D435 俯拍提供

20. 建议互链点(库内条目对照)

以下为建议的站内互链方向(rid 以入库后主会话核实回填为准,成稿一律使用 /0 占位):

  1. maternal-ultrasound-nutrition(rid 615):同为营养相关条目,但属孕产临床方向——建议作「同词异义」消互链,明确两者无实体关系;
  2. 公共卫生与流行病学类条目:膳食评估、疾病监测方向的条目可反向链接本条目作为「相机膳食估计」的证据基础;
  3. 多模态影像类条目:视觉+物理量对齐的多模态数据集设计可互相参照;
  4. 回归/评测基准类条目:以官方评估脚本+固定 split 构建可持续基准的方法论互鉴。

(互链 URL 统一格式:https://www.qianfanghub.com/ai-ready-dataset/<slug>/0,由发布管线回填真实 rid。)

21. 数据质量与验证记录

21.1 三源互证核验记录

本条目成稿执行的三源核验(2026-10-17):

源 URL 核验要点 一致性
arXiv 全文(v2 HTML) https://arxiv.org/html/2103.03375v2 规模数字、基线 MAE、人类对照、采集参数 主口径来源
官方 GitHub README https://github.com/google-research-datasets/Nutrition5k 5,006 盘、目录结构、license、下载方式、split 约束 与论文互证一致(规模双口径已存照)
CVF Open Access 论文页 https://openaccess.thecvf.com/content/CVPR2021/html/Thames_Nutrition5k_Towards_Automatic_Nutritional_Understanding_of_Generic_Food_CVPR_2021_paper.html CVPR 2021 出版信息、页码、作者列表、BibTeX 出版事实三源一致

21.2 关键数字交叉验证

  • 5,006(README)vs 5,066(论文)→ 双口径存照(§16 坑 1),主口径取 README;
  • 卡路里 MAE 9.5%/26.1%/18.8%/16.5% → arXiv Table 3 单源,CVF 页面未列数值但出版事实一致,GitHub 评估脚本可复现 → 判定可信;
  • CC BY-4.0 → README License & Contact 节明示 Creative Commons V4.0 BY → 单源但为官方一手声明 → 判定可信;
  • 181.4 GB → README 下载节 → 官方一手 → 判定可信;
  • 智源社区报道(hub.baai.ac.cn)仅用于时间线旁证(2021-03「即将开源」),未作为数字来源。

21.3 数据使用的一致性快照

  • 本条目所有数字均取自 2021 年发布的论文与仓库原始版本,未采信任何二手转述中的改动数字;
  • 深度编码、称重精度、相机参数等工程细节均以论文正文+README 双源为准;
  • 未能三源互证而单源采信的条目(全部为官方一手来源)已逐项在上表标注判定理由。

22. 按使用场景的推荐配置

22.1 场景 → 最小数据子集对照

使用场景 必需目录 可省略 预估体积
metadata 级分析(营养分布统计、成分共现) metadata/ + dish_ids/ imagery/ 全部 <1 GB
RGB-D 回归基线 + imagery/realsense_overhead/ side_angles/ 数十 GB
多视角/时序实验 + imagery/side_angles/(抽帧后) – 接近整包 181.4 GB
评估协议复用 scripts/compute_eval_statistics.py – KB 级

22.2 复现 Table 3 各行的配置差异

  • 2D 份量无关:输入俯拍 RGB;标签归一化为每克营养密度;预测时乘回测试集均值出对比口径;
  • 2D 直接预测:同输入,直接回归 total_* 绝对值;
  • 深度第 4 通道:RGB 3 通道 + depth 1 通道拼接输入(depth ÷10000、clip 0.4 m、按 ImageNet 无关的独立归一化);
  • 体积标量端到端:先出体积估计(可由深度积分或独立体积头),作为标量输入汇入营养回归头;
  • 五行共享同一 split、同一评估脚本,差异只在输入表示与网络头。

23. 数据集设计的可迁移经验

Nutrition5k 的价值超出其数据本身,其设计模式对任何「视觉→物理量」标注问题都有模板意义:

  1. 把主观标注问题转化为仪器测量问题:份量「没法人工标准」→ 秤可以测。遇到类似困境(力、温度、距离、时间)先问:有没有传感器能拿到真值?
  2. 增量过程采集:不拍成品拍过程,每一步物理事件(投料)自动产生一条对齐标注,标注成本趋近于零;
  3. 受控场景采集+诚实声明偏倚:不假装数据是野生的,用 Dataset Bias Disclaimer 明示边界,反而赢得长期信任;
  4. 官方 split + 官方评估脚本同步发布:把「怎么比」和数据一起定死,社区才有一个可比的事实标准;
  5. 许可一步到位:CC BY-4.0 免除了后续所有使用摩擦,是学术数据集许可的黄金标准(对照:大量数据集因 NC 条款被商业研究弃用)。

这五条被后续多个传感器真值数据集(医疗、工业、农业方向)显式引用为设计参照。

24. 风险与合规提示

  1. 署名义务:CC BY-4.0 要求使用时署名——引用 CVPR 2021 论文并在产品/论文中注明数据来源即可满足;
  2. 隐私边界:图像主体为餐盘与食物,采集环境为公共食堂动线;官方未随数据发布人物肖像内容,但使用者仍应对抽帧结果做基本的人脸/工牌筛查后再公开衍生内容;
  3. 营养建议边界:基于本数据集的模型输出属估计值,产品化时应明示「非医疗建议」,临床决策场景需专业复核;
  4. 模型许可独立:TFHub 配套模型的商用条款独立于数据集(见 §16 坑 10);
  5. 再分发:CC BY-4.0 允许再分发与商用,但衍生数据库需保留原署名并注明修改。

25. 存照与遗留疑点汇总

25.1 双口径存照(正文已消化,此处集中索引)

编号 事项 口径 A 口径 B 处置
1 菜肴总数 README 5,006 plates 论文 5,066 dishes 主口径 5,006,引用处随注
2 采集点位 README:加州几家餐厅 论文:单一园区 取「加州园区内两餐厅点位(cafe1/cafe2)」中和表述
3 发布时点 论文 2021-03(arXiv)/2021-06(CVPR) 数据开源 2021-06-15 时间线表分列

25.2 遗留疑点(未能在网络预算内闭环,不构成成稿障碍)

  1. dish_metadata_cafe1.csv 与 cafe2.csv 各自的确切条目数未见官方披露,需下载后实测;
  2. 增量扫描组的确切组数(决定「独立盘子」的真实规模)官方未单列,5,006 与 5,066 的差值构成未获官方解释;
  3. 2021 年后社区再标注/扩充版本(如成分掩码再标注工作)的最新清单未系统核查;
  4. GCS bucket 是否提供过整包之外的官方校验和(md5/sha256)未查证;
  5. 论文投稿版(2021-03 arXiv v1)与 v2 之间的数字修订差异未逐节比对(本条目数字取 v2/最终发表口径)。

以上疑点均不影响本条目核心事实链(规模、模态、标注方法、许可、基线数字)的成立。

26. 参考资料

  1. Thames, Q., Karpur, A., Norris, W., Xia, F., Panait, L., Weyand, T., & Sim, J. (2021). Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food. Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 8903-8911.
  2. arXiv preprint: arXiv:2103.03375. https://arxiv.org/abs/2103.03375(HTML v2: https://arxiv.org/html/2103.03375v2)
  3. 官方数据仓库: https://github.com/google-research-datasets/Nutrition5k
  4. Google Cloud Storage bucket: https://console.cloud.google.com/storage/browser/nutrition5k_dataset
  5. 整包下载: https://storage.cloud.google.com/nutrition5k_dataset/nutrition5k_dataset.tar.gz(181.4 GB)
  6. CVF Open Access 页面: https://openaccess.thecvf.com/content/CVPR2021/html/Thames_Nutrition5k_Towards_Automatic_Nutritional_Understanding_of_Generic_Food_CVPR_2021_paper.html
  7. 配套分割模型: TFHub mobile_food_segmenter_V1(https://tfhub.dev/google/seefood/segmenter/mobile_food_segmenter_V1/1)
  8. 营养换算权威来源: USDA Food and Nutrient Database(https://www.nutrition.gov / FoodData Central)
  9. 时间线旁证(中文社区报道): 智源社区, 谷歌 Nutrition5k: 对日常食品的自动营养成分理解, https://hub.baai.ac.cn/view/6856
  10. 许可文本: Creative Commons Attribution 4.0 International, https://creativecommons.org/licenses/by/4.0/

本条目由千方病案医数集 AI-Ready Wikipedia 项目于 2026-10-17 依据上列一手来源编纂;全部硬数字经三源互证,双口径与遗留疑点已在 §25 存照。条目正文中的互链 URL 使用 /0 占位,真实 rid 由发布管线回填。

27. 案例解剖:从零复现「深度第 4 通道」基线(完整走查)

本节以论文 Table 3 第 4 行(深度作第 4 通道,卡路里 MAE 47.6 kcal / 18.8%)为例,给出一遍完整可走查的复现流程,供接管/复现者对照排障。

27.1 第一步:环境与数据就位

# 依赖:gsutil、python3.8+、torch/或 tf、opencv、pandas
pip install opencv-python-headless pandas numpy

# 只下载本实验所需子集
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/metadata" .
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/dish_ids" .
gsutil -m cp -r "gs://nutrition5k_dataset/nutrition5k_dataset/imagery/realsense_overhead" .

走查点 A:解压后执行三查——metadata 目录下两份 dish CSV + 一份 ingredient CSV 齐备;splits 两文件行数合计应约等于 dish 目录数(双口径差异见坑 1);realsense_overhead 下 dish 目录数 ≈ 3.5k(< 总盘数是预期行为,坑 6)。

27.2 第二步:构建样本表

import pandas as pd

def parse_dish_csv(path):
    df = pd.read_csv(path)
    rows = []
    front = ["dish_id","total_calories","total_mass","total_fat",
             "total_carb","total_protein","num_ingrs"]
    for _, r in df.iterrows():
        n = int(r["num_ingrs"])
        ingrs = []
        for i in range(1, n+1):
            g = r.get(f"ingr_{i}_grams")
            if pd.notna(g):
                ingrs.append({
                    "id": r.get(f"ingr_{i}_id"),
                    "name": r.get(f"ingr_{i}_name"),
                    "grams": g,
                })
        rows.append({**{c: r[c] for c in front}, "ingrs": ingrs})
    return pd.DataFrame(rows)

d1 = parse_dish_csv("metadata/dish_metadata_cafe1.csv")
d2 = parse_dish_csv("metadata/dish_metadata_cafe2.csv")
dishes = pd.concat([d1, d2], ignore_index=True)

走查点 B:断言 len(dishes) > 5000;抽查 10 盘,核对 total_calories ≈ Σ ingr_i_calories(换算链自洽性,偏差大说明 CSV 解析错位,坑 3)。

27.3 第三步:加载图像与深度

import cv2, numpy as np, os

def load_rgbd(dish_id, root="imagery/realsense_overhead"):
    d = os.path.join(root, dish_id)
    rgb = cv2.imread(os.path.join(d, "RGB.png"))[:, :, ::-1]      # BGR→RGB
    depth = cv2.imread(os.path.join(d, "depth_raw.png"),
                       cv2.IMREAD_UNCHANGED).astype(np.float32) / 10000.0
    depth = np.clip(depth, 0, 0.4)
    depth_n = (depth / 0.4).astype(np.float32)                     # 归一化到 0-1
    return rgb, depth_n

def make_input(dish_id, size=229):
    rgb, dep = load_rgbd(dish_id)
    rgb = cv2.resize(rgb, (size, size))
    dep = cv2.resize(dep, (size, size))[..., None]
    x = np.concatenate([rgb / 255.0, dep], axis=-1).astype(np.float32)  # H×W×4
    return x

走查点 C:随机抽 5 盘把 depth 单通道存成伪彩色肉眼检查——餐盘轮廓应清晰、背景接近 0.4 m 上限(传感器支架遮挡处除外);全黑/全白即踩坑 4。

27.4 第四步:划分与 Dataset

train_ids = set(open("dish_ids/splits/train.txt").read().split())
test_ids  = set(open("dish_ids/splits/test.txt").read().split())

# 只保留有 RGB-D 的盘子(深度行实验的口径)
has_rgbd = dishes.dish_id.isin(
    {f"dish_{d}" for d in os.listdir("imagery/realsense_overhead")})
dishes_rgbd = dishes[has_rgbd]

tr = dishes_rgbd[dishes_rgbd.dish_id.str.replace("dish_","").isin(train_ids)]
te = dishes_rgbd[dishes_rgbd.dish_id.str.replace("dish_","").isin(test_ids)]
print(len(tr), len(te))   # 走查点 D:比例应接近 9:1

走查点 D:若发现某 dish_id 既不在 train 也不在 test,说明你混入了自拟 ID 规则——官方 ID 即文件名本身,勿再加工。

27.5 第五步:训练与评估

# 骨干:任意 4 通道可用的 CNN(首层 conv 权重对深度通道取均值初始化即可)
# 目标:total_calories(可 log1p 变换稳训练)
# 损失:MAE 或 Huber;优化器 Adam 1e-4;batch 32;按测试集 MAE 早停

# 预测落盘
pred = pd.DataFrame({"dish_id": te.dish_id,
                     "total_calories": model.predict(te_X).ravel()})
pred.to_csv("pred_depth4ch.csv", index=False)
python3 scripts/compute_eval_statistics.py --pred pred_depth4ch.csv

走查点 E(验收):卡路里 MAE 落在 40-55 kcal(约 16%-22%)区间即复现成功(论文 47.6/18.8%);若显著好于 30 kcal,第一时间怀疑测试集泄漏(坑 2)或标签泄漏(把 total_mass 喂进了输入);若差于 70 kcal,多为深度通道未除 depth units 或归一化错误。

27.6 六个走查点速查

点 检查物 失败信号
A 目录与文件齐全性 目录缺、split 行数异常
B CSV 换算链自洽 total ≠ Σ成分
C 深度可视化 全黑/全白
D split 比例 偏离 9:1、孤儿 ID
E 复现指标 过好(泄漏)/过差(编码错)

28. 数据字典:全部字段逐一说明

28.1 dish_metadata_cafe1.csv / cafe2.csv

字段 类型 说明
dish_id string 形如 dish_ + 十位时间戳,一盘的唯一键,同时是图像/视频目录名
total_calories float 全菜卡路里(kcal),=Σ逐成分换算
total_mass float 全菜总质量(g),秤直测
total_fat / total_carb / total_protein float 全菜三大宏量营养素(g),USDA 换算求和
num_ingrs int 该盘成分数(1-35)
ingr_{i}_id string 第 i 成分 ID,ingr_+十位补零,关联 ingredient_metadata.csv
ingr_{i}_name string 第 i 成分名称(USDA 条目描述)
ingr_{i}_grams float 第 i 成分实测克重(±1 g)
ingr_{i}_calories / _fat / _carb / _protein float 第 i 成分换算营养值

注:宽表列数为 7 + 35×8 = 287 列;短菜谱盘右侧为空值,解析必须以 num_ingrs 驱动(坑 3)。

28.2 ingredient_metadata.csv

字段 说明
ingr_id 成分唯一键(ingr_+十位补零)
名称与描述字段 USDA 条目描述
每克营养字段 卡路里/脂肪/碳水/蛋白质的 per-gram 值,换算链的查表源头

28.3 图像文件

文件 编码 说明
RGB.png 8-bit RGB D435 俯拍彩色图
depth_raw.png 16-bit PNG 深度×10000,上限 4000(0.4 m),IMREAD_UNCHANGED 必需
depth_color.png 8-bit RGB 深度伪彩(近蓝远红),仅供人检
A/B/C/D.mp4 H.264 1080p 4 路侧角扫掠视频,各约 8 秒

28.4 splits 文件

文件 内容
train.txt Nutri-Train dish_id 列表(约 90%)
test.txt Nutri-Test dish_id 列表(约 10%)

约束:同增量扫描组的所有 dish_id 整体同侧;勿自行重切(坑 2)。

29. 评估指标数学

29.1 论文口径定义

  • 绝对 MAE:MAE_y = (1/N) Σ |ŷ_i − y_i|,单位与目标量一致(kcal/g);
  • 百分比 MAE:pMAE_y = MAE_y / mean(y_test),即论文表格中「/」右侧的数字——分母是测试集均值,不是逐样本相对误差,与 MAPE 不同,后者会被小真值样本放大;
  • 报告建议:两者成对报告,且五维(calorie/mass/fat/carb/protein)齐全,便于跨论文对齐。

29.2 与其他常用指标的换算提醒

  • MAPE(逐样本百分比)在本数据集上会因调料碟级小盘(几 kcal)产生极端值,论文未采用,复现对比时勿混用;
  • 若做成分级评估(逐 ingr 预测),需自行定义聚合层级(per-ingredient macro 平均 / per-dish 加权),论文未给官方口径,应在论文中显式声明自己的定义。

30. FAQ(高频提问十条)

Q1:只想要「图片→卡路里」,最小要下多少数据?
metadata + dish_ids + realsense_overhead,数十 GB 内即可跑通三档 RGB-D 基线;侧角视频仅多视角实验需要。

Q2:可以商用吗?
数据集 CC BY-4.0,可以商用,履行署名即可;配套 TFHub 模型许可需单独核对。

Q3:为什么我的深度图打开是黑的?
16-bit PNG 未按 IMREAD_UNCHANGED 读取、未除 10000。见坑 4。

Q4:有验证集吗?
官方只有 train/test。自切 dev 时应从 train 内以增量扫描组为单位切,并公开切分。

Q5:5,006 还是 5,066?
README 扫描盘数 5,006;论文独特菜肴数 5,066。报告时声明口径即可。

Q6:能用来做中国菜吗?
不建议直接用。菜系偏西式加州食堂,中式典型形态覆盖薄弱;可作预训练底座,目标域内需补数据。

Q7:分割标注在哪里?
数据集没有分割标注。TFHub 的 mobile_food_segmenter_V1 是独立训练的姊妹模型,其输出不可作 5,006 盘的监督真值(坑 8)。

Q8:视频怎么采样?
官方 extract_frames_sampled.sh 5(每 5 帧取一),论文模型即用此口径。

Q9:模型能超过论文基线很多吗?
先检查是否泄漏(坑 2)。在现代 backbone 下适度超越属正常,但「好得离谱」几乎总是划分或标签问题。

Q10:本库还有哪些「同词异义」条目?
maternal-ultrasound-nutrition(rid 615)为孕产超声-营养方向,与本数据集无实体关系,注意消歧。

31. 行业应用图景

31.1 健康消费与运动健身

  • 拍照记录饮食:Nutrition5k 验证了「拍照→卡路里/宏量营养素」管线的可行误差量级(份量无关 9.5%、带深度 16.5%),是健身 App 营养估算功能的科学依据;
  • 产品化误差预算:面向消费者的产品通常需要比 16.5% 更严的用户侧体验约束(参考物提示、标准餐具引导、多帧拍摄),Nutrition5k 的三档设定可直接映射为「无参考/有参考/多帧」三档产品策略的预期精度阶梯;
  • 运动后补剂核算:训练后摄入的蛋白/碳水定量估算,属于份量相对可控的细分场景,是最容易先落地的一档。

31.2 临床与慢病管理

  • 糖尿病碳水计数:胰岛素剂量依赖碳水估计,份量无关设定下的碳水密度误差 13.9% 提供了可行性上限;临床级产品仍需专业复核闭环;
  • 肾病蛋白/磷管理:逐成分标注支持「这盘菜里蛋白质来自哪些食材」的归因分析,是 dish 级标注数据集做不到的;
  • 营养门诊辅助:把患者拍照餐盘与模型估计作为膳食回顾的客观化补充,替代高噪声的自报。

31.3 团餐与公共部门

  • 食堂营养公示自动化:增量扫描协议本身可被团餐运营方复刻——称重台+相机在打餐线实时产出营养数据,这是数据集采集协议向产业流程的直接迁移;
  • 学校/医院配餐核查:对照食谱标准核查实际出餐份量偏差。

31.4 科研与教育

  • 方法学基准:视觉回归、深度利用、域适应、不确定性量化等多方向论文的标准实验床;
  • 数据工程教学:增量扫描协议是「用采集设计消灭标注成本」的最佳教学案例之一;
  • 许可案例教学:CC BY-4.0 全量开放与 181.4 GB 实体规模的权衡,是数据管理课程的讨论素材。

32. 与本库条目的对照阅读建议

为帮助读者在千方病案医数集内建立「营养-视觉-健康」知识网络,建议按下述三条线索交叉阅读(真实 rid 由发布管线回填):

  1. 「数据实体」线索:maternal-ultrasound-nutrition(rid 615)代表营养作为临床变量的传统医数据形态;Nutrition5k 代表营养作为视觉估计目标的新形态。两者合读可理解「营养信息从问卷/检验走向相机」的方法论迁移。
  2. 「多模态对齐」线索:Nutrition5k 的「视频×深度×克重×营养」四线对齐设计与医学多模态数据集(影像×报告×标签)共享同一套对齐工程问题:时间同步、粒度映射、split 防泄漏。
  3. 「仪器真值」线索:增量电子秤±1 g 与医学影像中「病理金标准」的角色同构——凡人工标注不可靠处,仪器/专家真值才是监督信号的合法来源。

33. 版本与引用信息

33.1 官方 BibTeX

@inproceedings{thames2021nutrition5k,
  title     = {Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food},
  author    = {Thames, Quin and Karpur, Arjun and Norris, Wade and Xia, Fangting and Panait, Liviu and Weyand, Tobias and Sim, Jack},
  booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages     = {8903--8911},
  year      = {2021}
}

33.2 引用建议

  • 引数据:引 CVPR 2021 论文 + GitHub 仓库 URL;
  • 引数字:注明取自论文 v2/正式版口径(本条目 §9 表格);
  • 引许可:CC BY-4.0(数据);模型许可另查 TFHub;
  • 双口径提醒:规模数字声明 5,006/5,066 中的实际使用口径。

33.3 本条目元信息

  • 条目 slug:nutrition5k
  • 编纂时间:2026-10-17
  • 编纂代理:agent-g-nutrition5
  • 三源核验:arXiv v2 全文 + 官方 GitHub README + CVF Open Access
  • 双口径存照:3 项(§25.1);遗留疑点:5 项(§25.2)

34. 附:健康声明与使用免责

  1. 本条目及 Nutrition5k 数据集均不构成医疗建议;基于模型的营养估计输出应视为参考值;
  2. 临床(糖尿病剂量、肾病膳食处方等)场景必须由持证专业人员复核模型输出;
  3. 数据集图像拍摄于公共食堂,使用者公开衍生内容前应自行完成人脸等 incidental 隐私筛查;
  4. 对数据集的任何再分发需保留 CC BY-4.0 署名链(CVPR 2021 论文 + GitHub 仓库)。

35. 术语首现索引(中文-英文对照)

中文 英文 首现章节
通用食物 generic food §1.1
膳食记录 dietary logging §1.1
份量估计 portion size estimation §1.1
增量扫描 incremental scanning §6.2
份量无关 portion-agnostic §3.3
深度单位 depth units §6.3
域差距 domain gap §7.3
百分比 MAE percentage MAE §29.1
宏量营养素 macronutrient §1(INFOBOX)
换算链 annotation conversion chain §8.1

(接上页注)本条目共 35 节,正文结构与金标准条目对齐:INFOBOX → 身份查重 → 时间线 → 机构 → 平台工程 → 规模 → 标注 → 基线 → 实操 → 生态 → 对比 → 应用 → 局限 → 阅读路径 → 坑点 → 误解 → 速查卡 → 术语 → 互链 → 核验记录 → 案例解剖 → 数据字典 → 指标数学 → FAQ → 行业 → 库内对照 → 引用 → 免责 → 索引。

36. 专题:深度数据的完整技术说明

36.1 为什么俯拍深度是本数据集的「第二主角」

论文的元发现(§9.4 结论 3)使深度数据成为 Nutrition5k 区别于一切纯 RGB 食物数据集的核心资产。理解它的技术细节是任何份量估计工作的前提:

  • 传感器:Intel RealSense D435,结构光+双目立体的主动深度相机,室内短距(<1 m)精度最佳,正匹配 35.9 cm 的固定工作距离;
  • 几何标定:35.9 cm 工作距离下每像素对应 5.957×10⁻³ cm² 实际面积——由该标定,深度图积分为体积,再乘食材密度先验即得质量估计,这就是「体积标量」策略的物理基础;
  • 时序平均:深度流对约 8 秒数据取平均,抑制结构光在 glossy/深色食材(如酱汁、绿叶菜)上的噪声与空洞;
  • 截断设计:0.4 m 上限对应扫描支架几何高度,超出部分必为背景,截断即免费的背景剔除。

36.2 深度数据的已知质量陷阱

  1. 透明/反光食材:玻璃容器、油亮汤汁表面会产生深度飞点或空洞,colorized 版本人检时呈大片蓝/红噪斑;
  2. 深色吸光食材:深色酱料反射率低,结构光返回弱,空洞率升高(时序平均部分缓解);
  3. 堆叠高度截断:超高堆叠(>0.4 m)食物顶部会被削平为上限值,体积积分系统性偏低;
  4. 边界混合像素:食物边缘的深度值是前景背景混合,做精确轮廓分割时需腐蚀/边缘处理。

36.3 无深度盘的深度估计策略

约 30% 的盘没有真实深度。若实验需要全集统一输入,常见做法:

  • 用单目深度估计网络(MiDaS 系等)从 RGB 推断相对深度,注意其输出是仿射不变的相对值,需在 Nutrition5k 有真值的子集上拟合尺度/偏移后再用于无深度盘;
  • 在论文中明确区分「真实深度子集」与「估计深度全集」两组结果的口径,勿混报;
  • 迁移到野生场景时,单目深度本来就是唯一选项——这也是「平台内深度基线」走向「产品化部署」的必经改造。

37. 专题:把 Nutrition5k 变成你自己的数据集(扩展采集指南)

复刻 Nutrition5k 采集协议的自建指南(研究组/团餐运营均适用):

37.1 硬件清单与预算思路

组件 作用 替代选项
电子秤(±1 g) 克重真值 厨房级精密秤即可,关键是增量读数接口(RS232/BT)
俯拍 RGB 相机 主视角 任意固定相机,标定内参
深度相机(可选) 体积真值 RealSense D435/D455 或 Kinect Azure
侧角相机 ×2-4 多视角 固定即可,无需扫掠(扫掠是为覆盖遮挡)
触发同步器 时间对齐 单机多摄软件触发亦可,误差 <100 ms 可接受

37.2 协议要点(从论文经验提炼)

  1. 菜单先行:采集前把食堂当日每道菜登记到成分库(USDA 或本地营养库),投料动作与成分 ID 的绑定靠菜单序号;
  2. 增量粒度:每加一样食材记一次秤,避免多成分同投导致克重不可分;
  3. split 纪律:自建数据同样要按「同一物理盘子」为单位切分;
  4. 偏倚声明:写清你的点位数、菜系、光照条件——Nutrition5k 的可信度很大程度来自其诚实的 bias disclaimer。

37.3 自建数据的许可选择

自建衍生数据若希望社区复用,直接采用 CC BY-4.0 可与上游无缝衔接;若含商业敏感信息,至少公开标注 schema 与统计画像,便于社区校准。

38. 专题:误差来源分解——营养估计到底错在哪

把 16.5% 的端到端卡路里误差做链路分解(基于论文消融的推理框架):

端到端误差 ≈ 识别误差 ⊕ 密度估计误差 ⊕ 份量估计误差 ⊕ 换算误差
              (是什么)      (每克多少)       (有多少克)      (USDA 平均化)
  • 换算误差(本底):USDA 平均值的品种/烹饪偏差,估计 5-10%,不可由模型消除,是所有方法的天花板;
  • 份量误差:2D 直接 26.1% vs 份量无关 9.5% 的差值主要落在此项——是改进空间最大的环节;
  • 密度误差:识别错菜品连带密度全错(把薯条认成面包条),份量无关设定已把它压到 ~10%;
  • 工程启示:改进重点排序应为 份量 > 密度 > 换算;宣称超过 ~10% 精度的系统需先说明如何绕过换算本底。

39. 专题:不确定性量化——比点估计更重要的事

营养估计产品化的真正难点不是 MAE 再降两分,而是模型知道自己错多少:

  • Nutrition5k 的逐成分标注支持「预测分解误差」:对每盘输出各成分的(识别概率,克数分布),把总营养值的方差从成分级传播上来;
  • 人类对照实验(营养师 41% 误差)提示:任务本质困难,可信区间比单点数字更符合下游决策需要(如胰岛素剂量留安全余量);
  • 实践建议:回归头输出分布参数(均值+方差,NLL 训练),在测试集上校准覆盖率;Nutrition5k 的回归任务 + 真实误差谱是校准研究的理想小实验床。

40. 专题:负控实验设计建议

使用 Nutrition5k 做方法研究时,推荐常备三组负控:

  1. 标签打乱负控:把营养标签随机重排后训练,指标应退化到均值基线(60% 量级)——检验数据管道无泄漏;
  2. split 对照:官方 split vs 随机 split 各跑一次,两者差值量化「增量扫描泄漏」的影响,作为附录声明;
  3. 模态消融:RGB-only / +depth / +volume 三档按 §22.2 固定配置重跑,验证深度信息贡献与论文方向一致。

三组负控成本低,却能挡住绝大多数审稿质疑。

41. 长期维护与社区状态

  • 上游状态:GitHub 仓库 2021-06 后无代码级更新;issue 区由社区自发答疑,官方响应有限;数据 bucket 稳定在线;
  • 对本库的影响:Nutrition5k 属「冻结但稳定」型资产——引用无需担心版本漂移,但也不应期待上游修复;发现 CSV 疑似错误时以论文公式自查换算链;
  • 替代/补充数据源:USDA FoodData Central(营养查表)、Recipe1M+(食谱文本关联)、各类区域膳食调查(人群层面校准)——与本数据集构成互补而非竞争。

42. 快速决策树:我该用 Nutrition5k 吗

你的任务是食物营养/份量回归吗?
├─ 否(分类/检测/食谱文本) → 考虑 Food-101/Recipe1M,本集仅作辅助
└─ 是
   ├─ 需要克重真值监督? → 是:Nutrition5k 是当前最优公开选择
   ├─ 目标场景是野生手机拍照? → 用本集预训练+自采域内数据微调
   ├─ 目标菜系是中餐? → 谨慎:域差距大,需大量域内补充
   ├─ 需要像素级分割标注? → 本集没有,另寻再标注工作或自标
   └─ 商用? → CC BY-4.0 数据无障碍;模型另查 TFHub 条款

43. 结语

Nutrition5k 用一套「食堂里的科学仪器」回答了一个看似不可能的问题:怎样为一盘无法称量的家常菜建立可信的营养监督信号。它的答案是工程性的——把称量搬到打餐的瞬间,把换算交给权威数据库,把验证交给固定的 split 与公开的评估脚本。九年之后回看,这份 181.4 GB 的遗产里最持久的部分不是 5,006 盘菜的照片,而是一条方法论:当标注本身不可靠时,就去设计一个让标注变得不必要的数据采集流程。对任何在「视觉→物理量」地带工作的团队,这都值得整卷研读。

44. 附录:探索性分析示例(pandas 十分钟画像)

给第一次拿到数据的读者一组可直接运行的画像代码,快速建立对 5,006 盘菜的直觉:

import pandas as pd, numpy as np

def load(path):
    df = pd.read_csv(path)
    keep = ["dish_id","total_calories","total_mass","total_fat",
            "total_carb","total_protein","num_ingrs"]
    return df[keep]

d = pd.concat([load("metadata/dish_metadata_cafe1.csv"),
               load("metadata/dish_metadata_cafe2.csv")])

# 1) 规模与分布
print(d.shape)                                   # 应 ≈ 5,006
print(d[["total_calories","total_mass","num_ingrs"]]
      .describe(percentiles=[.05,.25,.5,.75,.95]))

# 2) 成分数分布(论文口径:均值 5.7,最大 35)
print(d.num_ingrs.value_counts().sort_index().head(10))

# 3) 营养密度(份量无关视角)
d["kcal_per_g"] = d.total_calories / d.total_mass.replace(0, np.nan)
print(d.kcal_per_g.describe())                   # 油脂密集菜可 >4 kcal/g

# 4) cafe1 vs cafe2 规模对照(点位结构一手证据)
print(len(load("metadata/dish_metadata_cafe1.csv")),
      len(load("metadata/dish_metadata_cafe2.csv")))

# 5) 极端样本抽查(回归模型最难的尾部)
print(d.nlargest(5, "total_calories")[["dish_id","total_calories","total_mass"]])
print(d.nsmallest(5, "total_calories")[["dish_id","total_calories","total_mass"]])

阅读这份画像时建议对照三条先验:卡路里 95 分位应在 800-1,000 kcal 量级;单成分盘(num_ingrs=1)占比可观(调料/水果/饮品类);两份 cafe CSV 规模通常不等(点位客流差异)——若相等反而可疑。

45. 附录:把 Nutrition5k 接入膳食调查工作流

流行病学视角的整合方案(§13.1 场景 4 的展开):

  1. 作为校准器:传统 24 小时膳食回顾的自报份量误差可被「照片+模型」客观化校准——Nutrition5k 提供了校准模型本身的监督数据与误差量级先验;
  2. 作为模拟器:在缺乏野外数据时,用它研究「估计误差 → 群体营养摄入分布偏差」的传播:给真值加入 16.5%/26.1% 量级的噪声,观察人群层面宏量营养素均值/分位数估计的失真程度,为调查设计提供容差依据;
  3. 作为教学基准:向调查员演示「视觉估重 41-53% 误差」的实证分布,支撑培训中「必须用参照物」的操作规范;
  4. 边界提醒:人群外推需匹配菜系与份量文化,加州食堂分布不可直接代表其他人群(§14.2 要点 1)。

46. 附录:实验记录模板(建议随代码入库)

实验 ID: nut5k-<日期>-<序号>
输入设定: [portion-agnostic | 2D-direct | depth-4ch | volume-scalar]
骨干: <model> | 输入尺寸: <px> | 抽帧率: [每5帧 | 其他]
split: official (train.txt md5: ______)
深度处理: ÷10000, clip 0.4m, resize <method>
额外数据: [无 | 单目深度模型 <name> | 其他 <说明>]
dev 切分: [无 | 从 train 以增量组切 <比例>,脚本 <path>]
结果 (compute_eval_statistics.py 原样粘贴):
  calorie: __.__ kcal / __._%
  mass:    __.__ g / __._%
  fat/carb/protein: ...
负控: [标签打乱=__% | 随机split对照=__% | 模态消融=已做/未做]
备注与异常:

模板设计意图:任何结果行都能追溯到「输入设定 + split 哈希 + 深度处理」三要素,杜绝 §16 各坑的复发。

47. 附录:与后续工作对接的开放问题

以本数据集为起点仍开放的研究问题(可作为选题参考):

  1. 野生域份量估计:把 16.5% 的平台内误差在无深度输入的野外照片上推进到可比量级;
  2. 成分级端到端:当前基线均为 dish 级回归,逐成分(检测+分割+克重)的端到端管线尚未饱和;
  3. 菜系扩展:增量扫描协议在非西式菜系(合餐制、汤羹类)的适配方案;
  4. 换算本底压缩:USDA 平均值之外的品种/烹饪方式修正建模;
  5. 长尾营养素:数据集只标三大宏量营养素,向钠/纤维/微量元素扩展需要新的数据源设计。

(条目完)Nutrition5k 条目共 47 节;硬数字三源互证、双口径三项存照、遗留疑点五项登记;所有互链 rid 以 /0 占位待回填。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • global-burden-of-disease — 共享标签:公共卫生与流行病学 / 流行病学
  • nhanes — 共享标签:公共卫生与流行病学 / 流行病学
  • healthdata-gov — 共享标签:公共卫生与流行病学 / 流行病学
  • nhis — 共享标签:公共卫生与流行病学 / 流行病学
  • ncd-risc — 共享标签:公共卫生与流行病学 / 流行病学
  • framingham — 共享标签:公共卫生与流行病学 / 流行病学
  • charls — 共享标签:公共卫生与流行病学 / 流行病学
  • qresearch — 共享标签:公共卫生与流行病学 / 流行病学
  • jhu-csse-covid-19 — 共享标签:公共卫生与流行病学 / 流行病学
  • epic-cosmos — 共享标签:公共卫生与流行病学 / 流行病学

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集