{RoboCafé}

 

智慧咖啡廳設計提案

"team 4":[

    {"leader":"徐子越",

     "mem1":"毛鼎言",

     "mem2":"劉安昇",

     "mem3":"許哲偉",

     "mem4":"劉安華",

     "mem5":"陳惠龍"}

​ ]

{Concepts}

 

設計理念

設計理念/


Concepts

 

目的

期望能利用人工智慧的各項技術,搭配上互動式的空間設計,帶給顧客有別於現有餐廳的使用者體驗。

 

管理人員能用更有效率的方式管控原物料的庫存,並透過演算法來預測原物料的價格,藉此控制成本。

流程簡介/

Concepts

 

{Features}

 

設計特色

&  ​進度規劃

中文情緒辨識/

 

Features

 

Features

 

  • 關於英文文本情緒辨識,已有人做了不少(Google, Amazon, MS...),但中文文本情緒辨識做的人較少。​
  • 本組利用貝式分類演算法實作機器學習,做出中文的情緒辨識​。
  • 可利用在客戶意見分析,即時判斷客戶情緒,對滿意/不滿意的客人做出不同反應。

動機

中文情緒辨識/

 

Features

 

  • 蒐集資料:利用爬蟲爬下Trip Adviser的正/負評論,以供機器學習​​。
  • 機器學習模型:實作簡單的貝式分類器。​
  • 訓練完成:連上LINE 聊天機器人,接收客人意見並丟出適當回應。

  

實作步驟

中文情緒辨識/

 

Features

 

爬蟲過程

中文情緒辨識/

 

Features

 

中文情緒辨識/

 

機器學習模型(貝氏分類器)

'use strict';
const
    bodyParser = require('body-parser'),
    config = require('config'),
    express = require('express'),
    request = require('request');

var app = express();
var port = process.env.PORT || process.env.port || 5000;
app.set('port',port);
app.use(bodyParser.json());
app.use(express.static('public'));

const SHEETDB_PRODUCTINFO_ID = config.get('productinfo_id');

// 主程式運作邏輯
app.post('/webhook',function(req,res){
    console.log("[WebHook] In");
    let data = req.body;
    let queryCategory = data.queryResult.parameters["Category"];
    var thisQs={};
    if(queryCategory=="熱門")
    {
        thisQs.IsHot = "True";
    }else
    {
        thisQs.Category = queryCategory;
    }
    thisQs.casesensitive = false;

    request({
        // uri:"https://sheetdb.io/api/v1/"+SHEETDB_PRODUCTINFO_ID,
        uri:"http://54.255.249.25/api/product/",
        json:true,
        // method:"PUT",
        method:"GET",
        headers:{"Content-Type":"application/json"},
        // qs:thisQs
        body:{"data":[thisQs]}
    // body:{"categoryname":lightStatus}
    },function(error,response,body) {
        if(!error && response.statusCode == 200){
            console.log(response.statusCode);
            console.log("[SheetDB API] Success");
            sendCards(body, res);
        }else{
            console.log(response.statusCode);
            console.log("[SheetDB API] failed");
        }
    });
});
app.listen(app.get('port'),function(){
    console.log("[app.listen] Node app is running on port", app.get('port'));
      });
module.exports = app;

function sendCards(body,res){
    console.log("[sendCarsoulCards] In");
    var thisFulfillmentMessages = [];

    for(var x=0; x<body.length; x++)
    {
        var thisObject={};
        thisObject.card={};
        thisObject.card.title=body[x].modelname;
        thisObject.card.subtitle=body[x].modelnumber;
        thisObject.card.imageUri=body[x].productimage;
        thisObject.card.buttons=[
            {
                "text":"看大圖",
                "postback":body[x].productimage,
            }
        ];
        thisFulfillmentMessages.push(thisObject);
        console.log(thisObject)
        var responseObject={
        fulfillmentMessages : thisFulfillmentMessages
        }
    }
    res.json(responseObject);
}

Features

 

中文情緒辨識/

 

測試結果

Features

 

  • 嘗試用word2vec做另一個語意分析機器模型,比較準確率​
  • ​嘗試用其他演算法增加準確率​​
  • 想出其他應用

代辦事項

中文情緒辨識/

 

預約bot及網站設計/

 

Features

 

概念

  • 讓使用者透過手機APP,以節省人力的方式來預約訂位。
  • APP可以讓使用者即時看見咖啡廳的預約情況,若該時段無空位則無法預訂。

預約流程

從資料庫get預約狀況資料,傳送給bot讓使用者看到。

->輸入完各項資料後post回資料庫

->查詢預約紀錄、取消預約以及再次預約其他日子

Features

 

預約bot/

 

Features

 

預約bot/

 

預約流程圖

Features

 

var restify = require('restify');
var builder = require('botbuilder');
var menu = require('./menuConfig.json')


//create web server
var server = restify.createServer();

server.listen(process.env.port||process.env.port||"3978",function(){
    console.log('$s listening to %s', server.name, server.url);
});

//create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

//listen for messages from users
server.post('/api/messages', connector.listen());

var bot = new builder.UniversalBot(connector, [
    //default dialog
    function(session){
        session.send("歡迎來到趣味小試題");
        session.beginDialog('booking');
    },
    // function(session, results){
    //     session.dialogData.orders = results.response;
    //     session.beginDialog('customer info');
    // },
    function(session, results){
        // var customer = session.dialogData.customer = results.response;
        var orders = session.dialogData.orders = results.response;
        // var checkinTaipeiZone = session.dialogData.orders.checkin.toLocaleString('en-us', {
        //     timeZone: 'Asia/Taipei'
        // });
        // var checkoutTaipeiZone = session.dialogData.orders.checkout.toLocaleString('en-us', {
        //     timeZone: 'Asia/Taipei'
        // });
        session.endDialog(
            `
            您的大名:${orders.name}<br />
            您的成績:<br />
            第一題答案:HTML,你的回答是:${orders.question1}<br />
            第二題答案:${orders.question2}<br />
            第三題答案:${orders.question3}<br />
            第四題答案:${orders.question4}<br />
            第五題答案:${orders.question5}<br />
            第六題答案:${orders.question6}<br />`
        );
    },
]);

bot.dialog('booking', [
    function(session){
        session.dialogData.orders = {}; //給一個初始化的值
    //     builder.Prompts.time(session, "請問您的入住時間? (例如: 明天下午5點)");
    // },
    // function(session, results){
    //     session.dialogData.orders.checkin = builder.EntityRecognizer.resolveTime([results.response]);
    //     builder.Prompts.time(session, "請問您的退房時間? (例如: 後天早上11點)");
    // },
    // function(session, results){
    //     session.dialogData.orders.checkout = builder.EntityRecognizer.resolveTime([results.response]);
        // session.endDialog(`退房時間:${dateTaipeiZone}`);
        builder.Prompts.text(session, "大大的名字?");
    },
    function(session, results){
        session.dialogData.orders.name = results.response;
        builder.Prompts.choice(session, "以下哪個是屬於前端的技術?", "HTML|Python|MySQL|Web Crawler(網路爬蟲)",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question1 = results.response.entity;
        if(session.dialogData.orders.question1 == "HTML"){
            session.send("答對囉!")
        }else{
            session.send("答錯囉! 答案是 HTML 才對")
        }
        builder.Prompts.choice(session, "想要顯示出'Hello World'的正確JavaScripts的語法是?", "print('Hello World')|response.write('Hello World')|document.write('Hello World')|對不起,這題我不會",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question2 = results.response.entity;
        if(session.dialogData.orders.question2 == "document.write('Hello World')"){
            session.send("答對囉!")
        }else if(session.dialogData.orders.question2 == "對不起,這題我不會"){
            session.send("沒關係! 不過答案是 document.write('Hello World') 才對喔")
        }
        else{
            session.send("答錯囉! 答案是 document.write('Hello World') 才對")
        }
        builder.Prompts.choice(session, "下面哪個是HTML5中出現的新出現的網頁元素?", "<hr>|<fieldset>|<pre>|<nav>",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question3 = results.response.entity;
        if(session.dialogData.orders.question3 == "<nav>"){
            session.send("答對囉!")
        }else{
            session.send("答錯囉! 答案是 <nav> 才對")
        }
        builder.Prompts.choice(session, "以下哪個平台'不是'使用webhook跟Dialogflow串連的?", "Facebook Messenger|LINE|Amazon Alexa|Microsoft Cortana",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question4 = results.response.entity;
        if(session.dialogData.orders.question4 == "Amazon Alexa"){
            session.send("答對囉!")
        }else{
            session.send("答錯囉! 答案是 Amazon Alexa 才對,因為Alexa是用import的方式跟Dialogflow串連的!")
        }
        builder.Prompts.choice(session, "請問以下幾位誰最帥?", "金城武|林俊傑|周杰倫|徐子越",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question5 = results.response.entity;
        if(session.dialogData.orders.question5 == "徐子越"){
            session.send("答對囉!你真有眼光!")
        }else{
            session.send("答錯囉! 答案是 徐子越 才對喔!")
        }
        builder.Prompts.choice(session, "你覺得這份測驗:", "太簡單,浪費我的時間|有點簡單,可以再難一點|難度適中,有些選項不太確定|太難啦,都忘光光啦",{listStyle: builder.ListStyle.button});
    },
    function(session, results){
        session.dialogData.orders.question6 = results.response.entity;
    
        session.endDialogWithResult({
            response: session.dialogData.orders
        });
    },
]);

預約bot/

 

Bot Framework 平台

Features

 

Bot Framework 平台

預約bot/

 

Features

 

'use strict';
const
    bodyParser = require('body-parser'),
    config = require('config'),
    express = require('express'),
    request = require('request');

var app = express();
var port = process.env.PORT || process.env.port || 5000;
app.set('port',port);
app.use(bodyParser.json());
app.use(express.static('public'));

const SHEETDB_PRODUCTINFO_ID = config.get('productinfo_id');

// 主程式運作邏輯
app.post('/webhook',function(req,res){
    console.log("[WebHook] In");
    let data = req.body;
    let queryCategory = data.queryResult.parameters["Category"];
    var thisQs={};
    if(queryCategory=="熱門")
    {
        thisQs.IsHot = "True";
    }else
    {
        thisQs.Category = queryCategory;
    }
    thisQs.casesensitive = false;

    request({
        // uri:"https://sheetdb.io/api/v1/"+SHEETDB_PRODUCTINFO_ID,
        uri:"http://54.255.249.25/api/product/",
        json:true,
        // method:"PUT",
        method:"GET",
        headers:{"Content-Type":"application/json"},
        // qs:thisQs
        body:{"data":[thisQs]}
    // body:{"categoryname":lightStatus}
    },function(error,response,body) {
        if(!error && response.statusCode == 200){
            console.log(response.statusCode);
            console.log("[SheetDB API] Success");
            sendCards(body, res);
        }else{
            console.log(response.statusCode);
            console.log("[SheetDB API] failed");
        }
    });
});
app.listen(app.get('port'),function(){
    console.log("[app.listen] Node app is running on port", app.get('port'));
      });
module.exports = app;

function sendCards(body,res){
    console.log("[sendCarsoulCards] In");
    var thisFulfillmentMessages = [];

    for(var x=0; x<body.length; x++)
    {
        var thisObject={};
        thisObject.card={};
        thisObject.card.title=body[x].modelname;
        thisObject.card.subtitle=body[x].modelnumber;
        thisObject.card.imageUri=body[x].productimage;
        thisObject.card.buttons=[
            {
                "text":"看大圖",
                "postback":body[x].productimage,
            }
        ];
        thisFulfillmentMessages.push(thisObject);
        console.log(thisObject)
        var responseObject={
        fulfillmentMessages : thisFulfillmentMessages
        }
    }
    res.json(responseObject);
}

預約bot/

 

Dialogflow + RestAPI

Features

 

Dialogflow + RestAPI

預約bot/

 

概念

  • 網站包含咖啡廳特色介紹、餐點品項、店址、聯絡方式等(簡易版)
  • 若有時間,另外會加入一頁Demo用的分頁,顯示店內的座位情況。

Features

 

網站設計/

 

概念

  • 使用opencv,透過webcam辨識攝影機視角內的人數,以此做為判斷店內帶位的依據(例如一組有3~4個客人,系統就會分配到4人座的區域,1~2人的話則為單獨座位或吧台區)
  • 店內的座位使用圖用瀏覽器的方式模擬。

Features

 

人數辨識/

 

概念圖

Features

 

人數辨識/

 

Features

 

送餐機器人/


送餐機器人/


Features

 

  • 利用送餐機器人,經由影像辨識確認餐點,再透過人臉辨識為顧客送達餐點。

服務

  • 節省人力、減輕部分工作負擔。
  • 利用機器人的特性,在出餐前重複確認餐點,避免送錯或忘記送餐點的窘境。

目的

送餐機器人/


Features

 

自走車組裝及安裝ubuntu在RPiG上

->跑道設計、影像校正

->道路辨識學習

->道路辨識與影像辨識整合

->道路辨識與影像辨識整合debug

    (提升道路及影像識別率)

進度流程表

送餐機器人/


Features

 

小鴨車的組裝以及在Rpi上安裝ubuntu,並解決樹莓派安裝ubuntu mate的bugs,接下來調校鏡頭及跑道設計。

目前進度

送餐機器人/


Features

 

目前進度

庫存管理與價格預測/


Features

 

Features

 

  • 原料的庫存管理,當庫存商品數量低於一定量會自動通知業主,並聯繫合作商家訂貨。
  • 原料的價格預測。

服務

目的

庫存管理與價格預測/


  • 透過庫存管理系統來檢視原物料的保存期限與存量。
  • 原物料(如咖啡豆)價格波動大,藉由價格預測來控制成本。

目的

Features

 

  • TensorFlow、MySQL、爬蟲

技術

  • 影響原物料的價格因素種類繁多(如政治、氣候、季節性...etc.)

困難

庫存管理與價格預測/


Features

 

系統架構與流程

物件辨識庫存管理/

 

Features

 

物體辨識實作

物件辨識庫存管理/

 

Features

 

利用webcam監視庫存區,使用物件辨識定時檢查庫存量,並記錄於資料庫。

庫存管理

衛生管理

物件辨識庫存管理/

 

同時也兼負著衛生管理的功能,如拍攝到有蟑螂老鼠進入庫存區,會自動拍攝照片並傳給店家。

Features

 

目前進度

價格預測/

 

VMware+Ubuntu+Node.js+Python+Opencv

平台串聯測試

Features

 

咖啡價格序列、氣象、股市...等資料前處理

-> 咖啡豆價格ML預測

​-> 咖啡豆價格DL預測

進度規劃

價格預測/

 

{Thank you!}

 

請不吝指教,謝謝!

by-Team 4

RoboCafé/

 

RoboCafé - 2nd proposal - KenHsu

By Ken Hsu

RoboCafé - 2nd proposal - KenHsu

無人咖啡廳設計提案

  • 412