儿研所 - 餐盘识别

儿研所 - 餐盘识别

  1. 项目简述

    和北京儿研所合作的项目,其想做的是通过用户餐前餐后的两张图片,计算出小孩子这顿饭吃了多少饭(菜)。将两张2d的照片转换成一顿饭菜的重量,进而根据《营养膳食图谱》计算出这顿饭小孩子摄入了多少营养元素。

  2. 项目背景

    这里就截取我的毕设报告中的关键点了:

    • 营养问题是婴幼儿期最常见的健康问题,影响体格生长和智力发育
    • 婴幼儿营养支持依赖于准确、及时的膳食喂养评价数据
    • 当前缺少快捷方便的婴幼儿膳食喂养评估系统
  3. 评估流程

    大多数人看他这里应该还是蛮蒙的,如何从两张图片计算出婴幼儿的膳食重量呢?接下来先简述一下整个评估的流程:

     ![整体流程](/images/projects/eryansuo/WX20191102-203454.png)
    
    • 登陆、选择孩子:每个家长有自己的账号,根据自己的账号可以看到自己的孩子,每个孩子有自己的餐食记录。

      选择孩子

    • 餐前/后评估(上传照片):上传餐前餐后的参事照片,要求照片上的餐食清晰,并且有一枚我们提供的标准大小硬币。

      上传照片

    • 点击硬币:在照片上传后,点击我们提供的标准硬币。可以看到硬币被圈出大小。

      点击硬币

    • 选择背景:选择餐盘的背景颜色,就可以看到餐盘颜色的事例。

      选择餐盘

    • 选择食物:分别选择自己所吃的食物,输入食物的高度,可以看到食物的重量。

      选择食物

    • 生成重量:完成餐前餐后评估,就会计算餐前餐后的食物重量差,也就得出了这顿饭各种食物所吃的重量。

      膳食结果

  4. 关键原理

    食物重量 = 食物面积 * 食物高度

    公式

    其实在这个项目中,食物重量就是根据上述两个公式计算而得的。

    几个关键点,这里详细的说一下:

    • 选择硬币:这枚硬币是儿研所会提供给家长的一枚标准大小硬币。也就是通过和这枚硬币比较大小,得出食物的面积。
    • 食物高度:儿研所在提供一个硬币同时,还会提供一个耙子,用于将饭菜耙开,好选择饭菜种类,同时这个耙子也可以计算饭菜的高度。
  5. 图像处理部分

    计算面积无疑是这个项目的核心,面积的图像处理使用OpenCV做的,他的流程其实也不复杂。

    • 图像分割。OpenCV是可以提取轮廓,但轮廓的提取在两色图中最为清晰。这也就是这个项目中为什么要选择硬币颜色和餐盘颜色了。这里以餐盘颜色举例。当选择餐盘颜色后,会将餐盘颜色的RGB转换为HSB(为了解决影子和反光,影子和反光后rgb会有很大变换但色相不会),通过色相再次对图片进行染色,色相接近餐盘的染为餐盘颜色,色相不接近餐盘的染为纯黑色,如下图:

      染色

    • 膨胀腐蚀。其实在上步过后,并不好直接提取轮廓,原因就是在食物边缘处,很多界定不清晰地方会有很多非常小的闭合微小轮廓,或者只识别出一个圈。这时膨胀和腐蚀就派上用处了。可以通过膨胀解决掉这些微笑的轮廓。这里的膨胀洗漱其实我们也调整了很多次,因为如果膨胀系数太小,可能导致边缘没有膨胀够问题并未解决,如果膨胀系数太大会增大误差,并且接近的食物可能会全部膨胀到一起。为了解决膨胀系数问题,最后我们策略是多次识别,先把膨胀系数取得很小,在逐渐加大直到识别到了一个适当大小的面积。在膨胀和腐蚀后就可以提取到轮廓了。

      ![提取轮廓]](/images/projects/eryansuo/WX20191102-210928.png)

    • 寻找轮廓。为什么要点击一下食物,一是获得食物的种类,第二个原因就是寻找一个在食物内的点已获得这一轮廓。(需要注意要先把外轮廓即盘子的这一轮廓去掉)

    至此面积就可以很好的提取出来了。

  6. 项目网址

  7. 毕设论文地址,在论文中可以看到更详细的步骤,本文只是做了核心流程简介。自己英语很中式,所以相信读起来很轻松。

Search

    Table of Contents