APP下载

智能高校健康食堂系统应用设计与实现*

2022-01-14贾昀峰

科技创新与应用 2022年2期
关键词:菜品食堂饮食

任 捷,贾昀峰,李 萌,温 馨,吴 淑

(1.四川大学 软件学院,四川 成都610207;2.四川大学 文学与新闻学院,四川 成都610207)

近些年来,我国社会经济的快速发展,人们生活质量不断提高,膳食营养也越来越受到普遍重视。国内外大量科研数据显示,营养膳食能在极大程度上影响一个人的生活状态和身体健康。合理膳食是健康的基础,饮食风险导致疾病几率在持续增长,已成为影响人们健康的主要危险因素。《“健康中国2030”规划纲要》提出,要广泛推广合理膳食行动,针对一般人群、特定人群和家庭,加强营养和膳食指导[1]。

高校学生在日常学习和生活中体力和脑力消耗大、身体基础代谢快,需要保证合理的热量和营养摄入。作为刚刚脱离父母而步入大学的群体,容易养成不良饮食习惯,危害身体健康。食物的选择影响着大学生的身体健康,而食物的供应主要来源于高校食堂。目前,尚无以学生群体为受众的、具有菜品检测与识别功能的健康食堂系统,来帮助学生更容易获得菜品相关信息,从而更好地改善个性化健康饮食计划。因此,本文选择从高校食堂切入进行需求分析,设计实现一个可以识别记录每日膳食,并分析其热量营养的微信小程序,可以让高校学生更方便的记录并调整自己的饮食结构,养成良好的饮食习惯。

本文使用前后端分离、目标检测、推荐系统等技术,构建一个面向高校学生饮食的食堂健康系统。学生随时可以查询食堂菜品信息,也可通过拍照识别的方式对日常饮食摄入进行记录。此外,系统还根据综合数据提供菜品热榜、热量排行等,让学生在制定个人饮食计划上能有更完善的依据,更好地满足营养需求。

1 相关知识

1.1 前后端分离

前后端分离的连接方式,即将软件应用的前端与后端分为两个独立的模块分别进行开发部署,并通过相关的通信技术(如HTTP 协议)进行交互对接,从而有效提高开发过程的灵活度和用户体验度[2]。

本文采用基于前后端分离的C/S 架构(微信小程序/服务器)进行应用的开发。前端使用Vue.js+mpvue 框架构建,以方便工程化地处理页面交互逻辑,解决常规前端开发中数据通信与dom 操作等问题。前后端交互上使用微信小程序官方封装的请求API,能够有效避免跨域访问问题的产生,同时也较大程度地提升了接口的可读性、安全性和可修改性。

1.2 菜品目标检测

目标检测,即找出图像中所有感兴趣的目标(物体)并确定它们的类别及位置,是目前计算机视觉领域的核心问题之一。常见的深度学习目标检测算法分为两大系列:RCNN 系列与YOLO 系列。分别为二阶段(two-stage)基于区域检测和一阶段(one-stage)基于区域提取的代表性算法。目前,在面向餐饮领域的菜品图片识别与检测实现上,通常是基于这两个系列进行开发与创新的[3]。

本文的应用中,系统能够获取学生端上传的菜品图片,并识别出图片中所有菜品的类别,随后反馈相应信息,此处需要用到上述的目标检测算法。实现过程中,本文使用了Faster RCNN 算法[4]来完成菜品目标检测功能。Faster RCNN 算法是在最初的RCNN 算法的基础上,采用自适应尺度池化对整个网络进行优化,从而规避了RCNN 中冗余的特征提取操作,提高了网络识别的准确率。同时,使用SoftMax 非线性分类器,以多任务学习的方式同时进行分类和回归。

1.3 缓存与消息队列

本系统使用了Redis 缓存技术,将数据存储在内存中,从而大幅提高了数据读取速度,也会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。从而不仅保证了数据读取的效率,也保证的数据存储的安全性[5]。此外,Redis 还支持丰富的数据类型,如string、list、hash 等,预防了多种数据类型产生冲突的可能性。

同时,为防止模块间高并发通信,本系统搭建了消息队列中间件RabbitMQ,避免由于来不及同步处理请求发生阻塞的情况。通过消息队列,可以缓解系统的压力,提高系统的性能。RabbitMQ 具有消息集群等多种机制,支持多种协议和多种语言,保证系统的高可用性和高可靠性[6]。

2 架构设计

2.1 分层架构

基于微信小程序和前后端分离技术,结合健康管理和菜品识别业务特点,并充分考虑师生和食堂工作人员的使用需求,本文采用分层思想设计了系统的总体架构,从上到下共分为四个层次:用户层、业务层、数据库、运行环境,具体如图1 所示。

图1 系统架构图

用户层:又称表示层、界面UI 层,位于分层架构最上层,与用户直接接触。本文用户层是基于微信小程序平台进行设计开发的。微信小程序(Miniapp)是一种“触手可及”的应用,即用户使用微信扫一扫或者搜一下就可打开应用进行使用,具有很高的易用性和跨平台性。相较于传统的APP,它十分适应于高校应用场景[7]。

业务层:又称逻辑层,对具体问题进行逻辑判断与执行操作,是用户层和数据库层的桥梁,实现两层之间的数据连接与指令传达。此处划分为四个子系统——食堂端、学生端、深度学习模块和安全控制域。

数据库:即按照数据结构来组织、存储和管理数据的一些仓库。此处建立两个关系型数据库MySQL,作为存放主要数据信息的主备库;同时,建立一个非关系型数据库Redis,作为频繁数据的缓存库。

运行环境:即系统所依靠的机器设备、操作系统、虚拟环境等。此处使用云服务器+Docker 技术进行多容器化部署,同时为保证系统较高可用性,利用Nginx 技术实现负载均衡,对流量进行平均分配。

2.2 系统部署

通过系统部署图可以展现软件系统中的物理架构,方便进行分级和关系处理。本系统的部署图如图2 所示。从后往前看,MySQL 部署在专门的数据库服务器上;菜品目标检测模块使用python 实现,并使用轻量级Web 框架Flask 配上uWSGI Web 服务器部署在专用的深度学习服务器上;而对于应用中的主要业务处理模块与中间件则部署在统一的一台应用服务器当中;前端依据具体用户需求分为多个端提供访问。

图2 系统部署图

如因设备成本、访问量小等问题,需要将业务处理、深度学习和数据库三大模块放置在同一台服务器当中,也直接可通过Docker 镜像技术进行容器化部署。此方法单机管理,成本可控,比较适合小规模应用作业,但模块上具有较高耦合性,因此需要进行适当权衡。

3 功能设计与实现

3.1 模块设计

本系统在功能需求上划分成两个端:学生端、食堂端。

学生端的前端为微信小程序,包含着例如饮食方案、健康报告、饮食计划跟踪、菜品识别、菜品推荐等重要功能内容。值得注意的是,当中的“菜品拍照识别”与菜品饮食推荐两大功能属于系统架构中(见图1)的深度学习模块的功能。而食堂端可以设计成小程序端,也可以是Web 网页端。在实际应用当中,通常为了满足食堂管理后台对食品和菜品信息进行批量化的展示与处理,适合构建成Web 界面;具体系统功能结构如图3 所示。

图3 系统功能结构图

3.1.1 学生端

学生端主要包含的功能介绍如下:

(1)菜品拍照识别:用户用餐时可对菜品进行拍照并上传照片,系统将对照片进行识别分析,然后为用户返馈本次用餐分析,包括菜品的食材、营养成分、常用调味品、热量等信息。同时,用户可以对识别的结果设置规格(单位克或份)。通过点击记录按钮,本次识别将作为用户的饮食统计数据并后续供用户查看。

(2)菜品饮食推荐:用户在发现页点击推荐导航选项,系统通过用户的饮食方案和使用历史生成菜品推荐清单并向用户展示。

(3)选择饮食方案:用户可以在饮食方案处选择适合自己的饮食方案,系统为用户计算的每日推荐热量摄入值和营养比例和分量值将根据用户选择的方案与用户的身体数据得出。

(4)每日饮食计划跟踪:用户可查看到当日当前的早中晚三餐及加餐的用餐识别记录,并且根据用户的身体数据与用户选择的饮食方案查看当日的热量上限、剩余可摄入热量以及包含三大营养比例数据的营养分析等信息。

(5)查看健康报告:系统根据用户的用餐历史数据定期为用户生成一段时间内的饮食报告,饮食报告包含用户这段时间点过的菜品统计、摄入的营养统计、平均每日摄入的热量、访问次数最多的食堂等。

(6)查看菜品食堂信息:用户可以查看菜品和食堂的信息。

(7)收藏菜品:学生用户可以对自己中意的菜品进行收藏。

(8)个人资料管理:用户可以管理自己身体的基本信息,如年龄、身高、体重、性别等,为饮食推荐提供一定依据。

3.1.2 食堂端

食堂端主要包含的功能如下:

(1)食堂信息管理:管理员可以新建编辑餐厅的主页,添加餐厅图片,餐厅特色信息,主打菜品介绍等。

(2)菜品信息管理:可以进行菜品的编辑,菜品介绍中包括食材与调味品种类、展示图片、烹饪方式、荤素类型等,方便用户查看;且食堂端可以对菜品进行上架和下架处理操作,上架后也可以对菜品进行编辑处理。

(3)查看用户报告:可以对在本食堂使用过小程序的用户特征进行搜集,并进行分析查看。

3.2 主要模块实现

3.2.1 菜品拍照识别

对于菜品的拍照识别模块,大致有两种可行方案。

(1)自行算法训练:自行通过线上或线下方式进行多类别大数目的菜品图片数据搜集,并进行数据筛选、清洗和相应类别标注;然后寻找适合的目标检测算法训练模型,例如上文提到的Faster-RCNN 或者YOLO 系列算法;最后将训练优化好的模型部署到服务端,并放出接口以供逻辑层进行调用。

(2)调取服务接口:调取公共的深度学习API 服务接口(如AI 菜品识别,果蔬识别),来满足相应功能实现。

第一种方法易得到更加灵活的模型和更高的场景适应性,例如可自定义标签(label)以适应具体高校食堂的菜品信息;第二种方法稳定的模型和接口能够在一定程度上保证小程序性能和菜品检测的准确性,但不具备灵活特点;本文使用的是第一种方案。

3.2.2 菜品饮食推荐

学生端共实现了三种推荐方式如下:

内容推荐:小程序首页,系统将自动根据用户的用餐记录数据以及后台生成的标签,来生成菜品推荐清单并向用户展示。本文采用基于内容的推荐算法(Content-Based Recommendations,CBR),即根据用户的收藏和识别记录为用户打上相应标签,在推荐时计算用户与菜品标签的匹配程度,并反馈相似度最近的TopN 的序列以及与其相适应的菜品数据[8]。

位置推荐:小程序“附近”界面,系统会调用地图组件获取用户当前位置,并根据距离来推荐最近的TopN 食堂的菜品。

热门推荐:小程序“热门”界面,系统会排序筛选出前TopN 浏览量和收藏量的菜品,并向用户展示。

3.2.3 生成健康报告

系统根据用户的用餐历史数据定期为用户生成一段时间内的饮食报告,饮食报告包含用户这段时间点过的菜品统计、摄入的营养统计、平均每日摄入的热量、访问次数最多的食堂等。此处关注的是,如何通过摄入量去计算评估身体健康状态。本文借助营养和健身领域的经验,根据体质指数(BMI)[9]和基础代谢率(BMR)两个指标对身体状况进行衡量。

BMI:身体质量指数(Body Mass Index),是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。

BMR:基础代谢率(Basal Metabolic Rate),指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率。通常使用Harris Benedict 公式进行计算,它是根据身高、体重、年龄及性别来计算健康人体基础能量消耗的方法。计算公式如下所示,其中w 为体重(千克),h 为身高(厘米),a 为年龄(岁):

男性BMR=66.47+13.75×w+5×h-6.775×a

女性BMR=655.1+9.563×w+1.85×h-4.676×a

在进行系统测算时,仅需要将公式转化为对应语言(如java、python)代码,传入用户数据进行运算即可得出结果。根据具体的BMI 和BMR 结果,可以对用户提出针对性的饮食意见,如少食多餐多运动等。

4 结束语

结合高校学生营养膳食需求,本文基于前后端分离、菜品识别、菜品推荐等技术,完整设计并实现一个面向学生饮食健康的高校健康食堂系统小程序。学生可以选择个性化的饮食方案,通过菜品检测的方式获取菜品信息,并记录每餐的营养摄入量。同时,系统根据用户使用历史,产生对应的菜品推荐结果,生成的健康报告可以让用户量化地进行饮食结构的调整。综上所述,本应用可方便学生对每日饮食进行识别、记录与规划,有利于其个人对自己的日常饮食获得一个清晰直观的统计,并针对其中的问题进行调整,起到均衡饮食结构,保障学生身心健康,养成良好的饮食习惯的作用,具有较高的应用价值和可扩展空间。

猜你喜欢

菜品食堂饮食
团膳菜品质量管理存在的问题及完善策略
“互助孝老食堂”值得推广
春节饮食有“三要”
饮食如何搭配才健康
迷惑菜品又来了
食堂
幸福食堂值得推广
三千食堂
何为清淡饮食
假蒟叶系列菜品的开发利用现状