目標:把系統從「能跑」升級成「能長跑」。今天交付可直接上台的監控儀表板、A/B 測試腳本模板、成本 vs 成效腦補表、上線檢核清單。
LINE_CHANNEL_ACCESS_TOKEN、DEFAULT_PERIOD_SEC、ALWAYS_NOTIFY 等,便於排程與節流。(A) 24h 系統健康(抓取/比對/推播)
時段 | 上傳成功 | 比對OK | 推播次數 | 失敗重試
00-03 | 720 | 708 | 8 | 2
03-06 | 720 | 716 | 6 | 1
06-09 | 720 | 703 | 12 | 5
09-12 | 720 | 711 | 18 | 3
12-15 | 720 | 705 | 21 | 6
15-18 | 720 | 709 | 17 | 2
18-21 | 720 | 713 | 24 | 3
21-24 | 720 | 710 | 9 | 2
(B) 推播漏斗(一天)
偵測到人臉/向量候選: 312
相似度過門檻(高/中): 176
品類/偏好匹配通過 : 152
冷卻/頻控通過 : 134
→ 實際推播 : 134 (漏斗通過率 42.9%)
(C) 高機率觸發時段(迷你圖)
時段 | 觸發數 | 迷你圖
10-12 | 32 | ▃▃▃▃
12-14 | 48 | ██████
18-21 | 55 | ███████
21-23 | 12 | ▂▂
儀表板的原始事件來自:ESP32-CAM 上傳影像、Flask 後端持續收檔與比對、再把決策與素材 URL 回寫資料庫,支撐日/週報視圖。
事件表(events)範例欄位
ts(UTC ISO) | cam_id | img_path | decision(match/unknown) | score(相似度/距離)
asset_url(素材頁) | latency_ms | push_channel(signage/app) | error_code
資料流回寫
[ESP32-CAM] → [Flask /upload] → [比對引擎(雲端API)]
↘ [SQLite/日誌寫入] ↘ [asset_url 決策] → [Kiosk/APP]
A/B 設計表
| 維度 | 版本 A | 版本 B | 指標 |
|---|---|---|---|
| 文案語氣 | 熱情直白(今日 85 折) | 理性比較(同價位對比) | 看板互動率、轉換率 |
| 價格帶 | $59–79 | $89–109 | 成交率、客單 |
| 版位 | 靜圖 + 大字 | 動態倒數 + 小字 | 觀看時長、再互動 |
冷卻與頻控
同一人(向量近似) 15 分鐘內不重推
同一品項 30 分鐘內不重推
尖峰時段提高門檻(只推高信心或高分商品)
假設:每店一台、每 5 秒 1 張、每日 12 小時、30 天 ≈ 259,200 張/月。
| 方案 | 定價規則(摘錄) | 月張數 | 概算月費 |
|---|---|---|---|
| AWS Rekognition | 0–100萬:US$0.001/張;>100萬:US$0.0008/張 | 259,200 | ≈ US$259.2 |
| Azure Face(參考) | 0–100萬:US$1/千;餘額 US$0.8/千 | 259,200 | ≈ US$259.2 |
實際金額依官網與合約為準。
重點:先用雲端 API 快速起飛;待成效穩定,再評估「混合:高隱私點位改走地端;其餘走雲端」,文件亦描述過地端/雲端雙線策略。
Cloud Run/VM 常用套件(節錄)
Flask==3.0.3, gunicorn==21.2.0
requests==2.32.3, beautifulsoup4==4.12.3, lxml>=5.3
line-bot-sdk>=3.11,<4
google-cloud-firestore==2.16.0, grpcio>=1.74
重要環境變數(文件列示)
LINE_CHANNEL_ACCESS_TOKEN, LINE_CHANNEL_SECRET
DEFAULT_PERIOD_SEC # 預設監看間隔(秒)
ALWAYS_NOTIFY # 0=僅變化才通知, 1=每次都通知
MAX_PER_TICK # 同步執行任務數上限
TICK_SOFT_DEADLINE_SEC # 一輪排程截止秒
(A) 通知成效(週)
日 曝光 互動(%) 推播 轉換(%) 熱門品類
Mon 4120 8.5 305 14.9 甜點/健康飲品
Tue 3980 8.2 291 15.4 甜點/早餐穀物
Wed 4350 8.8 327 15.1 健康飲品/咖啡
Thu 4210 8.1 310 14.7 甜點/飲品
Fri 5020 9.1 366 15.8 甜點/咖啡
Sat 5330 9.4 392 16.1 甜點/親子
Sun 4880 8.9 355 15.6 飲品/甜點
(B) 觸發熱區(門市樓層 × 時段)
樓層\時段 | 10-12 | 12-14 | 18-21
B1(餐飲) | ▃▃ | ████ | █████
1F(精品) | ▂ | ▃▃ | ███
2F(生活) | ▃▃ | ▃▃▃ | ███
商機驗證 → MVP(ESP32-CAM→雲端比對→Kiosk) → A/B 測試
→ 週報/Dashboard → 混合架構(地端 + 雲端) → 多平台支援(tixCraft/KKTIX)
匯出
events.csv後,用下列腳本產生每小時推播次數的 ASCII 長條圖(可貼在週報)。
# ascii_chart.py
import pandas as pd
df = pd.read_csv("events.csv") # 欄位含 ts, decision
df["ts"] = pd.to_datetime(df["ts"])
s = (df[df["decision"]=="match"]
.set_index("ts")
.resample("1H")
.size())
for ts, v in s.items():
bar = "█" * int(v/2) if v>0 else ""
print(ts.strftime("%m-%d %H:00"), f"{v:3d}", "|", bar)
小結:把「偵測→比對→推播→回寫」的閉環跑順後,報表就會說話。接下來,只要沿著 A/B 與成本監控持續優化,你們的「你的專屬折扣」就能在更多據點穩定拓展。
參考:ESP32-CAM 能以 HTTP 上傳影像、Flask 後端與 Rekognition/向量比對、Kiosk 顯示與 SQLite 回寫。