Real-time Mobile Food Recognition System论文笔记

摘要

论文设计了一个手机端的食物识别系统,用于卡路里的查询,培养用户的饮食习惯。
大致流程如下:

  • 为了识别食物,用户首先通过触屏画出包含食物的边框,在选定的边框里面执行食物的识别算法。
  • 为了提高准确率,通过使用GrubCur算法来对每一种食物进行分割,提取出其中的color histogram特征和SURF-based bag-of-features特征
  • 最后使用线性SVM和fast 开方核进行分类(总共有50类)。

1.简介

首先讲述了现有的这些饮食记录app的缺陷,然后提出说现有的手机中,四核处理器变得越来越普通。之前的手机系统一般需要有服务端支持,上传资源到服务端会耗费很多时间,不能够达到实时的效果。因此,本文才提出了跑在手机上的实时的食物识别系统。
Alt text

该文章实现了:

  • 一款基于手机端的交互实时食物识别和记录系统,可以达到实时效果,不用再上传到服务端。
  • 使用线性SVM利用开方核来快速准确做食物识别,使用多线程多CPU系统
  • 应用程序流程:首先对食物拍一张照片,通过手指拖动来划定一个区域,在这个区域里面进行food image recognition
  • 通过GrubCut可以进行划定区域的自动调整,通过ESS来进行区域框方向的变化

2.相关工作

2.1食物识别

食物识别困难的原因在于食物会发生形状的变化。食物识别属于细粒度的分类问题。
主要介绍了一些已有的成果。然后夸自己,说只有自己的系统才能达到实时交互的效果,但是也不忘谦虚的说自己的系统数据库太小,只有50种食物类别,需要用户帮忙。

2.2手机设备和计算机视觉

讲述了现有的一些利用手机实现的物体识别应用。

3.系统概述

Alt text

  1. 用户用手机拍照,系统在后台连续的请求摄像头设备的图像帧(这里没有看明白)
  2. 用户选定bounding box,而bounding box是可以利用算法自动调整的。可以选取超过两个bounding box
  3. 每一个bounding box的区域里面做食物识别,bounding box的区域方向根据估值高的建立(这里也没有看明白)
  4. 结果出来之后,把top five的候选结果和direction arrows显示在屏幕上。
  5. 从食物候选列表中选取食物种类,食物体积的多少可以通过滑动条来大致说明(这方法也太扯蛋了一点吧- -|||)。如果候选列表中没有食物,把手机稍微移动一下,然后重新做第3步
  6. 把选中的卡路里结果显示在屏幕上

总之呢,食物的卡路里和营养成分表将显示在手机屏幕上,该信息可以保存到服务端,在web端查看。
Alt text

4.食物识别的方法

4.1 Bounding Box Adjustment 边界框的调整

由于用户选取的bounding box不会特别准确,一般来说都会偏大的,所以使用GrabCut方法来调整。需要前景背景区域作为种子。我们把bounding box里面的区域作为前景区域,两倍于bounding box,外面的区域作为背景区域。为了缩短时间,我们只做一次调整。
关于GrabCut算法(抠图算法):

4.2 Food Recognition 食物识别

  • 首先在每个window里面提取特征
  • 根据提前计算好的codebook建立特征向量
  • 最后我们根据特征向量用线性SVM进行分类

4.3 Image Features 图片特征

本文选取了color histogramBag-of-SURF两个联合特征。对于bounding box长的那个边大于200,我们resize到200

Color Histogram:

把窗口分成了3×3的block,对于每一个block抽取64-bin的直RGB色彩方图。总共是576维的彩色直方图。

Bag-of-SURF

这一块提到的算法比较多,应该算是难点部分了。原文如下:

Bag-of-SURF: As local features, we use dense-sampled bag-of-SURF. SURF [1] is an invariant 64-dim local descriptor for scale, orientation and illumination change. We sample points by dense sampling in scale 12 and 16 with every 8 pixel with the window. To convert bag-of-features vectors, we prepared a codebook where the number of codeword was 500 by k-means clustering in advance. We apply soft assignment [11] by 3 nearest-neighbor assigned reciprocal number of Euclid distance to the codeword, also we use fast approximated-nearest-neighbor search based kdtree to search the codebook for the corresponding codeword for each sampled point. Finally, we create a 500-dim bagof-SURF vector.

这里我们首先要了解SURF特征,然后在此基础上了解bag-of-features。下面这段引用较为清楚地阐释了bag-of-features:

  1. 首先,我们用surf算法生成图像库中每幅图的特征点及描述符。
  2. 再用k-means算法对图像库中的特征点进行训练,生成类心。
  3. 生成每幅图像的BOF,具体方法为:判断图像的每个特征点与哪个类心最近,最近则放入该类心,最后将生成一列频数表,即初步的无权BOF。
  4. 通过tf-idf对频数表加上权重,生成最终的bof。(因为每个类心对图像的影响不同。比如超市里条形码中的第一位总是6,它对辨别产品毫无作用,因此权重要减小)。
  5. 对query进来的图像也进行3.4步操作,生成一列query图的BOF。
  6. 将query的Bof向量与图像库中每幅图的Bof向量求夹角,夹角最小的即为匹配对象。

当然当中一些细节的地方跟文献引用的流程有差异。但是bag-of-features的整个流程大致就是这样了。

4.4 Classification 分类

分类用线性SVM来做,多分类采用one-vs-rest。本文食物分为50类,故训练了50个线性SVM分类器。线性SVM如下所示:

Alt text
where x is an input vector, f(x) is an output SVM score,
xi is support vector, yi ∈ {+1, −1} is a class label, αi is a
weight of the corresponding support vector, b is a bias vector, and M is the number of support vector.

然后又说,尽管使用线性SVM可以节省内存,但是准确率肯定没有非线性分类器高。那怎么办呢?于是就使用了一种叫做explicit embedding technique的技术,采用了kernel feature maps。在使用了$\chi^2$核映射之后,特征向量的维度变成了原来的三倍。这个映射可以被用于L1-normalized histogram上,然后把它应用于L1-normalized color histogramsBag-of-SURF向量上。

4.5 Estimation of the more reliable direction 建立更可靠的方向

由于SVM计算出来的最高分数对应的食物种类可能错误,这种情况下我们需要对原始输入的图像进行微调,从而计算出更可靠的SVM估值。为了鼓励用户移动摄像头,我们会在屏幕上显示一个箭头来提醒用户朝哪个方向移动。
为了更好的计算出SVM估值,我们采用了Efficient Sub-window Search(ESS)
在上面那个公式中,权重向量w可以被分解成$w^+$$w^-$:
$$ w = w^+ + w^-$$
然后根据ESS方法,对$w^+$$w^-$采用积分图像的方法可以在o(1)时间内完成SVM估值计算。