陳沁儀,沖 蕾,于澤昊,張澤權(quán),王展純,鄒星雨
(上海工程技術(shù)大學 城市軌道交通學院,上海 201620)
受到2020 年新冠疫情的影響,大部分校園、企業(yè)食堂采用了無人化、自動化的相關(guān)餐飲服務(wù),智能化、數(shù)字化迎來了一個新的發(fā)展階段。已有研究表明,食物中的一些成分可以改變血液中某些神經(jīng)遞質(zhì)的濃度水平,傳遞各種各樣的情緒信息。由此可見,食物,是影響神經(jīng)遞質(zhì)濃度水平的關(guān)鍵,是控制情緒的重要因素,直接影響了人的感情中樞。因此對菜譜推薦和健康分析進行研究的迫切性日益凸顯。本文擬對此展開探述與論述。
深度學習泛指一類用復(fù)雜多重非線性結(jié)構(gòu)分析數(shù)據(jù)的抽象算法,現(xiàn)在多用深度學習為基礎(chǔ)研發(fā)的深度神經(jīng)網(wǎng)絡(luò)作為工具的機器學習模型。在本作品中,主要體現(xiàn)在全連接的人工神經(jīng)網(wǎng)絡(luò)上,示意圖如圖1 所示。
圖1 神經(jīng)網(wǎng)絡(luò)示意圖Fig.1 Schematic diagram of neural network
神經(jīng)網(wǎng)絡(luò)(NN)是以模仿大腦神經(jīng)結(jié)構(gòu)為出發(fā)點的計算模型。大多數(shù)的神經(jīng)網(wǎng)絡(luò)可以被用來解決多維特征/多元變量問題。根據(jù)已有結(jié)論,具有2 個隱藏層的神經(jīng)網(wǎng)絡(luò)可以擬合任意函數(shù)。因此,傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)采用2 個隱藏層。在數(shù)學上,可以被表示成一種函數(shù)模型:(,,…,y)(,,…,x)。其中,輸入與輸出可以是任意長度的向量,同時可以將函數(shù)看作是黑盒,不需要了解其內(nèi)部邏輯。
人工神經(jīng)網(wǎng)絡(luò)擁有自組織、自學習、自適應(yīng)、強非線性函數(shù)逼近能力以及強容錯能力。目前,包括圖像識別、預(yù)測和模糊控制研究這些新興領(lǐng)域,人工神經(jīng)網(wǎng)絡(luò)都有涉足。人工神經(jīng)網(wǎng)絡(luò)通過對已知信息的反復(fù)學習和訓(xùn)練,同時逐漸調(diào)整和更改神經(jīng)元連接的權(quán)重,以此完成信息處理和模擬輸入輸出關(guān)系的目標。網(wǎng)絡(luò)的每一層都包含多個神經(jīng)元,用變權(quán)的有向弧來描述。
本作品設(shè)計的基于TensorFlow 的神經(jīng)網(wǎng)絡(luò)算法流程如圖2 所示,主要分為3 個部分,即:定義模型、訓(xùn)練與保存模型、加載模型并預(yù)測,分別設(shè)置在2 個可執(zhí)行的Python 文件中。
圖2 神經(jīng)網(wǎng)絡(luò)算法設(shè)計流程Fig.2 Design process of neural network algorithm
定義模型的部分主要工作有:
(1)定義占位器用以規(guī)定輸入數(shù)據(jù)的結(jié)構(gòu)。
(2)定義圖結(jié)構(gòu)用以規(guī)定神經(jīng)網(wǎng)絡(luò)模型的結(jié)構(gòu),如連接方式、神經(jīng)元個數(shù)、激活函數(shù)等,在本作品中含2 層隱藏層,各100 個神經(jīng)元,采用函數(shù)為激活函數(shù)。
(3)定義變量,如權(quán)重、偏移率等指標用以檢測與分析神經(jīng)網(wǎng)絡(luò)模型的合理性。
(4)定義損失函數(shù)、優(yōu)化函數(shù)等用以約束并優(yōu)化構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型。
訓(xùn)練、保存模型的部分主要工作有:
(1)實例化對象(),用以保存模型。
(2)構(gòu)建并打開會話()。
(3)模型內(nèi)所有參數(shù)初始化__(),如模型優(yōu)化函數(shù)、損失函數(shù)等參數(shù)。本作品采用梯度下降法進行優(yōu)化,通過計算可知,設(shè)置學習率為015 時較優(yōu)。
(4)定義迭代次數(shù)并訓(xùn)練模型(,_{:_,_:_}),(,_{:_,_:_}),本作品設(shè)置迭代次數(shù)3000 次,最終的模型損失為204,可以收斂。
(5)保存模型(sess,"./src/tmp/model.ckpt"),會在指定目錄下生成一系列“.ckpt”文件用以恢復(fù)模型。
在此基礎(chǔ)上,研究進一步給出了第三方庫調(diào)用說明如圖3 所示。
圖3 第三方庫調(diào)用說明Fig.3 Third-party library call instructions
在騰訊云平臺上傳部署后端代碼,定義執(zhí)行入口文件sl.handler.py 執(zhí)行app.py 的內(nèi)容__(,,)。app.py 的內(nèi)容包括執(zhí)行服務(wù)器請求部分與加載模型并預(yù)測部分。
執(zhí)行服務(wù)器請求部分的主要內(nèi)容有:
(1)構(gòu)建Flask 實例(___name___)。
(2)定義路徑操作修飾器@(),這里的請求方式為ANY,即接收任意請求方式。
(3)定義路徑操作函數(shù)()。
(4)將獲取的待預(yù)測參數(shù)正則化并轉(zhuǎn)換成list形式,這里只需提取其中的有效數(shù)字部分,即((r"\d+\.?\d?",user_selection)),并轉(zhuǎn)換為整形((,))。
(5)運行加載模型并預(yù)測部分的程序,得到預(yù)測結(jié)果。
(6)運用()函數(shù),將得到的結(jié)果JSON化作為返回值。
加載模型并預(yù)測部分的主要內(nèi)容有:
(1)清除圖的結(jié)構(gòu)__()。
(2)定義占位器用以規(guī)定輸入數(shù)據(jù)的格式。
(3)構(gòu)建并打開會話()。
(4)創(chuàng)建saver 實例()并恢復(fù)模型(sess,"./tmp/model.ckpt")。
(5)預(yù)測數(shù)據(jù)(,_{:})。
(6)將預(yù)測結(jié)果與所屬類別匹配,構(gòu)成字典格式。
(7)將該字典按照概率值降序排列(1,:__('probability'),True),并返回。
設(shè)置該云函數(shù)的觸發(fā)方式為API 網(wǎng)關(guān)觸發(fā),采用API 網(wǎng)關(guān)觸發(fā)的優(yōu)勢在于可以選擇同步或異步調(diào)用,且可以通過定義不同的路徑操作修飾器和函數(shù)用以實現(xiàn)多個功能,最大化利用一個函數(shù)解決多個功能。在小程序端僅需要通過(())進行HTTPS 訪問即可,流程如圖4 所示,(())方式的參數(shù)設(shè)置見表1。預(yù)測成功后的頁面顯示如圖5 所示。
表1 wx.request()參數(shù)說明Tab.1 wx.request()parameters description
圖4 菜譜推薦的前后端交互流程示意圖Fig.4 Schematic diagram of the front-end and back-end interaction process of recipe recommendation
圖5 預(yù)測成功后的頁面顯示Fig.5 The page after the successful prediction
百度AI 作為國內(nèi)最大的人工智能平臺之一,提供了很多方便快捷可被調(diào)用的API 接口和具體應(yīng)用,目前百度AI 的語音、圖像、文字、客流量等識別方向都取得了相當顯著的效果,在識別精度和速度上達到了較高的狀態(tài)。
通過調(diào)用百度AI 的智能圖像分析功能、進而實現(xiàn)菜品識別,識別速度快、準確率較高。具體過程如下:
(1)調(diào)用微信提供的(())接口,引導(dǎo)用戶選擇拍照或相冊上傳圖片,返回的結(jié)果為用戶上傳圖片的臨時路徑,即不會再次占用用戶的內(nèi)存。
(2)使用(()())獲取上傳圖片的臨時路徑,并使用64 格式轉(zhuǎn)碼。
(3)使用在百度官網(wǎng)注冊申請到的_和_,調(diào)用(())接口以HTTPS協(xié)議形式,以GET 請求方式,請求百度AI 提供的api 接口,由此可獲取到可被調(diào)用的唯一access_token。
(4)調(diào)用(())加載框,提示用戶正在進行識別。
(5)再次調(diào)用()接口,以POST 的請求方式,請求百度AI 提供的API 接口,在URL 中添加此前獲取的_,為待識別圖片的base64 編碼,調(diào)用成功后可獲得菜品識別結(jié)果、卡路里值及置信度,并調(diào)用(())接口關(guān)閉加載提示。
基于百度AI 的菜品識別及卡路里錄入功能示意如圖6 所示。研究中,在頁面顯示菜品識別的相關(guān)結(jié)果后,設(shè)置錄入按鈕,用戶可根據(jù)真實的菜品攝入情況選擇錄入。調(diào)用云函數(shù)(()),通過()()在數(shù)據(jù)庫的對應(yīng)集合中添加用戶、菜品名稱、數(shù)據(jù)來源、卡路里值、創(chuàng)建時間等信息,并在個人中心頁面顯示。菜品識別成功后的界面顯示、錄入后的歷史記錄可見圖7。
圖6 基于百度AI 的菜品識別及卡路里錄入功能示意圖Fig.6 Schematic diagram of dish recognition and calorie entry function based on Baidu AI
圖7 菜品識別成功后的界面顯示、錄入后的歷史記錄Fig.7 The interface display after the dish recognized and the history record after entry
微信小程序是一種全新的連接用戶與服務(wù)的方式,可以在微信內(nèi)被便捷地獲取和傳播,具有出色的使用體驗。故本文采用微信小程序作為前端,有較高的靈活性與兼容性??梢宰畲笙薅日{(diào)用微信提供的開放接口,提高開發(fā)效率,縮短代碼運行時間。
微信小程序基于當前的Web 技術(shù),通過獨立的運行環(huán)境感知平臺,提供接近原生應(yīng)用的用戶體驗。開發(fā)方法類似于WebAPP 的開發(fā)方法。微信小程序框架系統(tǒng)稱為MINA 應(yīng)用框架,是一個雙線程模型,分為邏輯層(App Service)和展示層(View)兩部分。小程序的顯示層描述語言包括WXML 和WXSS,這是一個基于JavaScript 的邏輯層框架,提供了一個在顯示層和邏輯層之間傳輸數(shù)據(jù)和事件的系統(tǒng)。框架如圖8 所示??蚣艿暮诵氖且粋€響應(yīng)式數(shù)據(jù)鏈接系統(tǒng),可以保持和顯示數(shù)據(jù)同步。
圖8 微信小程序框架系統(tǒng)概覽Fig.8 Overview of WeChat miniprogram framework system
在小程序啟動時,微信會在后臺完成以下工作:下載小程序代碼包、加載小程序代碼包、初始化小程序首頁,如圖9 所示。同時,在小程序啟動或一個新的頁面被打開時,頁面的初始數(shù)據(jù)()和路徑等相關(guān)信息會從邏輯層發(fā)送給視圖層,用于視圖層的初始渲染,詳見圖9。
圖9 微信小程序啟動流程圖、初始通信流程圖Fig.9 WeChat applet startup flowchart and initial communication flowchart
本設(shè)計采用了小程序·云開發(fā)中云數(shù)據(jù)庫與云函數(shù)功能,小程序·云開發(fā)是微信團隊聯(lián)合騰訊云推出的專業(yè)的小程序開發(fā)服務(wù),其優(yōu)勢在于無需搭建服務(wù)器,免登錄、免鑒權(quán)調(diào)用微信開放服務(wù)、不限開發(fā)語言與框架等,本設(shè)計采用JavaScript 作為小程序·云函數(shù)的主要開發(fā)語言。
云數(shù)據(jù)庫中的每條記錄都是一個JSON 格式的對象,一個數(shù)據(jù)庫可以有多個集合,集合可以看作一個JSON 數(shù)組,數(shù)組中的每個對象都是一條記錄,記錄的格式是JSON。常見的MySQL 數(shù)據(jù)庫為關(guān)系型數(shù)據(jù)庫,但是不便于在小程序內(nèi)獲取和調(diào)用。關(guān)系型數(shù)據(jù)庫和JSON 數(shù)據(jù)庫的概念對應(yīng)關(guān)系見表2。
表2 關(guān)系型數(shù)據(jù)庫和JSON 數(shù)據(jù)庫的概念對應(yīng)關(guān)系Tab.2 The conceptual correspondence between relational databases and JSON databases
云函數(shù)、即在云端(服務(wù)器端)運行的函數(shù),其寫法與在本地定義的JavaScript 方法相同,代碼運行在云端Node.js 中。小程序內(nèi)提供了專用于云函數(shù)調(diào)用的API,可以在云函數(shù)中使用wx-server-sdk 提供的方法獲取到每次調(diào)用的上下文(、等),無需維護復(fù)雜的鑒權(quán)機制,即可獲取天然可信任的用戶登錄態(tài)()。
本設(shè)計的個人中心作為豐富用戶體驗的一大重點模塊,為滿足用戶的各種應(yīng)用需求,設(shè)計了如下功能模塊。
(1)“干飯實錄”功能。該功能主要通過云開發(fā)·云數(shù)據(jù)庫實現(xiàn)。首先獲取已被設(shè)為全局變量的用戶,再通過()()在云數(shù)據(jù)庫的對應(yīng)集合中獲取對應(yīng)用戶所錄入的菜品信息;通過(‘createdTime’,‘desc’)對菜品按錄入時間倒序排列以便于用戶查看最新的菜品錄入信息。同時,也運用了()生命周期函數(shù)以及()函數(shù)以便用戶實時獲取最新錄入的菜品信息,并能夠?qū)崿F(xiàn)下拉刷新。在“個人中心”界面通過調(diào)取獲取今日日期,再通過()()()獲取今日錄入的菜品個數(shù),從而完成在個人中心“干飯實錄”的前端頁面反饋。
(2)計算功能。本作品的設(shè)計旨在幫助用戶對自己的身體健康狀況有實時的了解。計算時通過獲取用戶輸入的身高、體重的值,在本文的研究中設(shè)置了()、()以 及()分別進行、標準體重以及身體狀況的計算。與此同時,本頁面還為用戶提供了標準對照表,以此讓用戶對所反映的自身的身體狀況有了一個全面的了解。
(3)意見反饋功能。本作品注重用戶體驗,重視收集用戶的使用意見,故將用戶反饋分為兩大板塊。第一大板塊設(shè)立在菜單搜索界面,用戶可在此輸入菜品名、對應(yīng)食堂以及數(shù)量來反饋菜品缺失;第二大板塊設(shè)立在個人中心界面,用戶可在此反饋當使用本程序時所遇到的問題和建議。當用戶輸入信息未輸入完整時,調(diào)用(())彈出框?qū)τ脩暨M行提示。用戶輸入完成后可點擊底部的反饋按鈕,通過()()在云數(shù)據(jù)庫的對應(yīng)集合中添加用戶的問題種類和具體情況,后臺開發(fā)人員將對集合中用戶反饋的問題進行解決。
(4)菜品收藏功能。該功能主要運用云函數(shù)·云數(shù)據(jù)庫來實現(xiàn)。云函數(shù)的獨特優(yōu)勢在于與微信登錄鑒權(quán)的無縫整合。當小程序端調(diào)用云函數(shù)時,云函數(shù)的傳入?yún)?shù)中會被注入小程序端用戶的,開發(fā)者無需校驗的正確性,直接使用該。對此擬給出剖析詳述如下。
①用戶在“菜品詳情”界面中點擊收藏圖標后,將會調(diào)用云函數(shù)判斷目前云數(shù)據(jù)庫的對應(yīng)集合中是否有對應(yīng)的菜品收藏信息。
②若對應(yīng)集合中沒有相對應(yīng)的收藏信息,將會使用云函數(shù)添加對應(yīng)的菜品信息至云數(shù)據(jù)庫中;若對應(yīng)集合中有相對應(yīng)的收藏信息,將會刪除云數(shù)據(jù)庫中相應(yīng)的菜品信息。
③在調(diào)用云函數(shù)的過程中會使用(())加載框,提示用戶正在進行加載。
④在判斷完畢后將會更改icon 圖標為已收藏或未收藏,這一過程中將會調(diào)用(())彈出框?qū)τ脩暨M行提示。
個人中心界面、收藏界面、及指數(shù)計算界面如圖10 所示。研究中,用戶將通過云函數(shù)在“個人中心”界面的“收藏的菜單”頁面中獲取到自己收藏的菜品信息,同時()生命周期函數(shù)以及()函數(shù)幫助用戶實時獲取收藏信息的更新。
圖10 個人中心界面、收藏界面、及BMI 指數(shù)計算界面Fig.10 Personal center interface,collection interface and BMI index calculation interface
本作品在前期走訪了校內(nèi)所有食堂,整理出各個食堂所包含的餐廳、菜品名稱,運用scroll-view 可滾動視圖組件清晰地將食堂與菜品的所屬關(guān)系展示給用戶。通過后文的基于百度AI 的菜品識別功能得到這些菜品的卡路里值,并將名稱、所屬餐廳、卡路里值顯示在菜單詳情頁面供用戶參考。
將云數(shù)據(jù)庫讀取并調(diào)用的部分程序放在生命周期函數(shù)中,以此減少用戶等待時間。菜單界面的卡路里錄入及收藏功能示意如圖11 所示。研究中,點擊菜品名稱可根據(jù)頁面參數(shù),跳轉(zhuǎn)至對應(yīng)的菜單詳情頁面,在該頁面用戶可以實現(xiàn)菜品收藏功能和卡路里錄入功能,能夠在個人中心查看,菜品收藏功能和卡路里錄入功能均主要通過云函數(shù)實現(xiàn),詳細算法將會在后文個人中心與可視化進行闡述,在進行上述操作均有明顯的(())提示用戶操作。為照顧到用戶需求,在頂部放置搜索欄,可實現(xiàn)模糊搜索功能,原理是使用()方法來構(gòu)造正則對象,然后將用戶輸入與數(shù)據(jù)庫該集合內(nèi)的所有菜品名稱做字符串匹配,匹配成功則顯示在頁面上。
圖11 菜單界面的卡路里錄入及收藏功能示意圖Fig.11 Schematic diagram of calorie entry and collection functions in the menu interface
本作品的微信步數(shù)功能基于微信官方API 改造實現(xiàn),獲取流程如圖12 所示。具體流程如下:
圖12 今日步數(shù)顯示功能流程圖Fig.12 Flow chart of today′s steps count display function
(1)調(diào)用(())接口以HTTPS 協(xié)議形式,以GET 請求方式,發(fā)送code,登錄憑證校驗接口,調(diào)用成功后微信接口服務(wù)會反饋、_等信息。
(2)通過(())請求用戶開啟微信步數(shù)權(quán)限,并通過(())判斷用戶是否關(guān)注微信步數(shù)以便于獲取信息。
(3)通過()請求微信官方接口來獲取用戶近30 天的微信步數(shù)信息,微信接口服務(wù)反饋小程序端、、等信息。
(4)通過(())調(diào)用云函數(shù)__,將獲取到的信息解密后以微信步數(shù)和時間戳的形式反饋給小程序端。
(5)在完成微信步數(shù)的基本流程后用生命周期函數(shù)(())獲取code 的自動更新步數(shù)信息,以此來保證微信步數(shù)信息的時效性,并服務(wù)于步數(shù)信息的可視化。
(6)微信步數(shù)的可視化是在js 中將今日步數(shù)參數(shù)定義在__上,直接通過wxml 中的text 實現(xiàn)顯示,并利用生命周期函數(shù)()實現(xiàn)數(shù)據(jù)的實時更新。
該功能通過云函數(shù)·云數(shù)據(jù)庫·ec-canva 組件實現(xiàn)。其大致流程如圖13 所示,具體步驟如下:
圖13 卡路里曲線獲取和顯示流程圖Fig.13 Flow chart of calorie curve acquisition and display
(1)用戶登錄后,自動調(diào)用云函數(shù)判斷云數(shù)據(jù)庫中記錄的數(shù)據(jù)日期是否與用戶登錄日期一致,若不一致則在云數(shù)據(jù)庫的相應(yīng)集合中新增一條卡路里為0 的數(shù)據(jù)。
(2)在“菜品識別”頁面設(shè)置錄入數(shù)據(jù)圖標與“詳細菜品”頁面中設(shè)置icon 符號。通過讀取對應(yīng)的菜品信息,使用()將菜品信息及卡路里數(shù)據(jù)添加至云數(shù)據(jù)庫中。
(3)將獲取到的對應(yīng)卡路里數(shù)據(jù)通過()轉(zhuǎn)化為整數(shù)型、從而調(diào)取云函數(shù)對卡路里數(shù)據(jù)進行相加,然后對數(shù)據(jù)庫對應(yīng)集合的數(shù)據(jù)進行更新。
(4)調(diào)用(())彈出框?qū)τ脩暨M行提示。
(5)將數(shù)據(jù)庫中的數(shù)據(jù)反饋到“個人中心”界面前端顯示。
(6)在“今日卡路里”頁面中調(diào)用ec-canva 組件獲取折線圖的模板,再通過調(diào)用云函數(shù)獲取云數(shù)據(jù)庫相對應(yīng)集合中的數(shù)據(jù)在折線圖中顯示,以便用戶更直觀地看到自己近一周內(nèi)卡路里攝取情況。
本作品貼合時代潮流,以學校為試點,旨在建立一個能夠監(jiān)控自身良好飲食習慣的小程序,能夠?qū)崿F(xiàn)菜譜推薦與健康分析兩大功能。例如通過用戶選擇自身當前的狀態(tài)進行菜譜推薦、拍照識別菜品及卡路里、動態(tài)顯示近一周卡路里攝入變化曲線連同記錄在內(nèi)的歷史錄入菜品、微信步數(shù)歷史記錄等功能。在開發(fā)方面,多使用云函數(shù)、云數(shù)據(jù)庫等云資源,部署于線上,簡化開發(fā)步驟,減少程序代碼量;在菜譜推薦功能上,采用基于TensorFlow 搭建的神經(jīng)網(wǎng)絡(luò),并上傳部署至SCF 騰訊云函數(shù),設(shè)置其為API網(wǎng)關(guān)觸發(fā),以減少小程序端的調(diào)用時間。