每天早上那杯咖啡到底含有多少咖啡因?这个问题困扰着许多依赖咖啡提神的上班族。传统的手动记录方式不仅繁琐,还容易遗漏。这个项目通过计算机视觉技术,实现了对咖啡、茶等饮品中咖啡因含量的自动识别与记录。
核心思路很简单但实用:用手机拍摄饮品照片,通过图像识别判断饮品类型和体积,再结合已知的咖啡因含量数据,自动计算并记录每日摄入量。我在实际使用中发现,这套系统对拿铁、美式、红茶等常见饮品的识别准确率能达到85%以上,比手动记录可靠得多。
整个系统分为三个主要模块:
我选择Flask作为后端框架,因为它轻量且易于与Python的计算机视觉库集成。前端使用简单的HTML5页面,通过浏览器调用手机摄像头。数据库采用SQLite,足够应对个人使用场景。
图像识别部分尝试了两种方案:
实测发现,对于常见的标准杯型饮品,传统方法已经足够准确且计算量小。但当遇到特殊容器或混合饮品时,深度学习模型的鲁棒性更好。最终我采用混合方案:先用传统方法快速识别,失败时再调用深度学习模型。
提示:如果要在树莓派等资源受限的设备上运行,建议只使用传统方法,可以保证实时性。
建立一个准确的饮品特征数据库是项目成功的关键。我收集了以下维度的数据:
python复制# 示例数据库结构
drinks_db = {
"americano": {
"color_range": [(30,30,30), (80,60,40)],
"texture": "uniform",
"caffeine_per_ml": 0.6,
"standard_volumes": [250, 350, 450]
},
"latte": {
"color_range": [(180,160,140), (220,200,180)],
"texture": "foamy_top",
"caffeine_per_ml": 0.4,
"standard_volumes": [300, 400]
}
}
通过图像估算液体体积是本项目的难点之一。我的解决方案是:
python复制def estimate_volume(img):
# 边缘检测
edges = cv2.Canny(img, 50, 150)
# 霍夫变换检测直线
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=100, maxLineGap=10)
# 找出杯子的左右边缘
left_edge = min([l[0][0] for l in lines])
right_edge = max([l[0][2] for l in lines])
# 液面检测(基于颜色突变)
liquid_level = detect_liquid_level(img)
# 计算液面高度比例
height_ratio = (liquid_level - cup_bottom) / (cup_top - cup_bottom)
return standard_volume * height_ratio
最初版本需要用户手动选择杯型和拍摄角度,体验不佳。经过几次迭代后,系统现在可以:
通过以下方法将识别准确率从最初的72%提升到89%:
当系统无法确定饮品类型时,会提供最可能的3个选项让用户确认。同时记录这些边缘案例用于后续模型优化。
对于混合饮品(如咖啡+牛奶),系统会:
系统自动生成每日/每周咖啡因摄入报告,包括:
python复制def generate_report(user_data):
plt.figure(figsize=(10,6))
plt.plot(user_data['date'], user_data['caffeine'], 'b-o')
plt.axhline(y=400, color='r', linestyle='--') # 推荐日上限
plt.xlabel('Date')
plt.ylabel('Caffeine (mg)')
plt.title('Daily Caffeine Intake')
return plt
推荐使用Docker容器部署,只需三步:
docker pull myrepo/caffeine-monitordocker run -p 5000:5000 myrepo/caffeine-monitorhttp://localhost:5000所有数据默认存储在本地,可选配置包括:
这套系统稍作修改就可以用于:
我在实际使用中发现,最大的价值不是精确的数字,而是培养了对饮品选择的意识。现在我会主动选择低咖啡因的饮品,睡眠质量确实有所改善。