专栏名称: CloudMan
云计算深度实践者;定期发布《每天5分钟玩转OpenStack》教程;让 OpenStack 不再难学!
目录
相关文章推荐
51好读  ›  专栏  ›  CloudMan

拍照查卡路里APP - 技术方案调研

CloudMan  · 公众号  ·  · 2025-03-05 05:17

正文

请到「今天看啥」查看全文


最近国外有一款APP在健身圈火了。功能很简单:自动识别照片中的食物并计算卡路里。团队开发加市场也就两三个人,主要用大模型实现。我就想可以把它当作教程案例,原因如下:

  1. 功能单一,初学者容易上手。
  2. 别人已经走通,现有大模型能实现。

这里先介绍一下 CloudMan 的开发背景,便于大家对照。

我工作头几年用Java开发过Web应用,不过已经是二十多年前的事了。后来一直做服务和实施,有时会编写一些Shell和Ansible脚本。

总结起来就是: 有一定开发经验,但欠缺最新的开发技术

下面来看看我是如何开发这个APP的。

调研

目前咱们知道方向是用大模型来实现,但具体怎么做还没有思路。不过没关心,可以问AI。

这里我问了字节旗下的豆包 https://www.doubao.com/

可能有人会问为什么不用chatGPT?

一个原因是豆包不需要梯子,用起来限制少。但更重要的是现在国内大模型已经很能打了,完全不输给国外的一流大模型。

除了豆包,DeepSeek、千问、文心、Kimi、智谱都能达到相同效果。后面我们也尽可能用国内的产品和服务。

我问豆包:
我想开发一个拍照查卡路里的APP,其功能是用户用手机拍摄或选取照片,APP识别照片中的食物并计算卡路里。请问该怎么做?请给出方案

豆包回答如下:

先来看最重要的 图像识别

豆包推荐了Google Cloud Vision API、百度 AI 开放平台的图像识别服务和自己训练卷积神经网络(CNN)模型。

自己训练肯定不行,咱没那技术也没必要,那就百度吧。

于是我让豆包详细介绍了一下百度 AI 开放平台 https://ai.baidu.com/ 图像识别服务的使用方法。

按照豆包给出的步骤,找到了百度图像识别的服务列表。

能不能满足需求得试了才知道,我准备了三张图片。

我们希望大模型能识别图片中所有食物(包括果蔬、菜品等)并计算卡路里。

下面是测试过程:

测试结果:

果蔬识别 :只能识别单个果蔬,且不提供卡路里信息。
菜品识别 :能识别菜品并提供卡路里信息,但不能识别果蔬。
图像多主体检测 :能识别多个物体,但只给出分类信息,没有名称,也没有卡路里。

看来没有一种服务能完全满足需求。

不过如果把它们结合起来或许能行。比如先用“图像多主体检测”找出每一个食物,然后用“菜品识别”和“果蔬识别”确定各个食物的名称,如果没有卡路里信息或许还需要调用外部查询服务。

但这个方案太复杂了,要考虑的情况太多,实现起来难度大,关键是:

这样的方案不够AI

理想的情况应该是这样:

大模型根据我的要求,自己去处理中间环节,直接返回给我想要的答案。

有可能吗?还真能。

之前我忽略掉了一个服务“图像内容理解”,仔细研究后发现这正是我们想要的。

我们可以把要求直接写在“question”中,比如“识别图中食物或菜品及其卡路里”,上传图片就能返回我们想要的结果。

效果如下:

“图像内容理解”完全能满足需求,接下来要做的就是优化“question”,通常也叫提示词(prompt)。目前大模型返回的是一段自然语言,为了跟前端APP交互,我们希望返回一个结构化的JSON数组。比如下面这样:

[
    {
        name: “苹果”, 
        unit:”个”, 
        quantity: “1”, 
        calorie: “95”
    },
    {
        name: “香蕉”, 
        unit:”只”, 
        quantity: “2”, 
        calorie: “236”
    }
]

经过几轮迭代,最终我们的提示词如下:

识别图中食物或菜品,每种以格式{name: “”, unit:””, quantity: “”, calorie: “”}输出,放在数组中

演示如下:

到这里,技术方案基本上确定下来了:

调用百度大模型“图像内容理解”功能,返回JSON格式的结果

大家可以看到,在调研过程中我们走了些弯路,刚开始并没有找准“图像内容理解”这个服务。CloudMan 也是想借这个事情告诉大家:

多尝试,多探索,有时候不是AI做不到,而是我们还没触碰到它的能力边界。

目前(2025年3月)百度“图像内容理解”有两点不足:

  1. 提示词的长度不能超过100个字符,
  2. 识别效果有时不太理想,比如耙耙柑识别成柿子,有时没有卡路里信息。

对于这些限制,我们的解决思路很简单:

换更好的大模型

AI发展很快,大模型每几个月就会更新迭代。所有这些限制都是暂时的,即便是当下,我们也有更好的选项,这个咱们后面讨论。

下一节任务:开发前端APP并与大模型集成。








请到「今天看啥」查看全文