)
最近给某三甲医院做了一套AI智慧餐线改造,核心是小碗菜自动识别刷脸扣餐补。改造过程踩了不少坑,把整体技术方案和Python调用示例整理出来,供同行参考。一、整体架构整个系统分三层:# 系统架构图(简化) [打菜窗口] ├── AI识别摄像头 → 图像采集 边缘推理 ├── 显示屏幕 → 菜名/单价/总价实时展示 └── 刷脸终端 → 人脸识别 餐补扣款 [边缘网关] ├── 菜品识别服务(Flask) ├── 人脸识别SDK(本地) └── 订单/扣款服务(REST) [后端服务] ├── 食堂运营管理后台 ├── 餐补账户系统 ├── 员工身份库 └── 数据分析报表二、AI识别小碗菜的核心实现菜品识别走的是图像分类,模型采用预训练的ResNet50微调。识别服务用Flask暴露HTTP接口,边缘摄像头采集图片后调用推理:from flask import Flask, request, jsonify import torch from torchvision import transforms from PIL import Image import io app Flask(__name__) # 加载微调后的菜品识别模型 model torch.load(dish_classifier_v3.pt, map_locationcpu) model.eval() # 菜品类别(医院食堂常见) DISH_CLASSES [ 宫保鸡丁, 清炒时蔬, 红烧肉, 番茄炒蛋, 土豆烧牛肉, 白米饭, 馒头, 小米粥, 葱油拌面, 紫菜蛋花汤 ] # 推理前处理 transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) DISH_PRICES { 宫保鸡丁: 18, 清炒时蔬: 12, 红烧肉: 22, 番茄炒蛋: 14, 土豆烧牛肉: 20, 白米饭: 3, 馒头: 2, 小米粥: 4, 葱油拌面: 15, 紫菜蛋花汤: 8 } app.route(/recognize_dish, methods[POST]) def recognize_dish(): if image not in request.files: return jsonify({code: 1, msg: 缺少图片}), 400 img_file request.files[image] img Image.open(io.BytesIO(img_file.read())).convert(RGB) img_tensor transform(img).unsqueeze(0) with torch.no_grad(): outputs model(img_tensor) probs torch.softmax(outputs, dim1) confidence, predicted torch.max(probs, 1) dish_name DISH_CLASSES[predicted.item()] confidence_score confidence.item() # 置信度阈值 if confidence_score 0.85: return jsonify({ code: 0, msg: 识别置信度不足,请阿姨手动选择, confidence: round(confidence_score, 3) }) return jsonify({ code: 0, dish_name: dish_name, price: DISH_PRICES[dish_name], confidence: round(confidence_score, 3) }) if __name__ __main__: app.run(host0.0.0.0, port5001)三、刷脸扣餐补的流程刷脸扣餐补的核心是人脸1:1比对 餐补账户扣款,调用方是边缘刷脸终端:import requests FACE_RECOGNITION_API https://canteen.example.com/api/v1/face_match MEAL_ACCOUNT_API https://canteen.example.com/api/v1/meal_account def face_payment(user_id, face_token, amount): 刷脸扣餐补 # 1. 人脸1:1比对 match_resp requests.post(FACE_RECOGNITION_API, json{ user_id: user_id, face_token: face_token }).json() if match_resp[data][similarity] 0.92: return {code: 1, msg: 人脸比对失败} # 2. 餐补扣款 deduct_resp requests.post( f{MEAL_ACCOUNT_API}/deduct, json{ user_id: user_id, amount: amount, source: face_recognition } ).json() if deduct_resp[code] ! 0: return {code: 1, msg: 扣款失败} return { code: 0, user_name: match_resp[data][user_name], balance: deduct_resp[data][balance_after], amount_deducted: amount } # 边缘刷脸终端调用 result face_payment( user_idN20240901, face_tokenxxxxx, amount33 ) print(result)四、踩坑经验1.识别准确率:模型微调时一定要覆盖医院食堂真实菜品,不能直接用公开数据集。建议采集至少500张/菜的真实图片做微调。2.置信度阈值:实测下来,0.85的阈值能保证九成五以上的识别率,同时把误识别压到很低。3.阿姨手动纠偏:AI再准也不到100%,界面必须留阿姨手动选择入口,否则一线会抵触。4.临时人员兼容:医院人员流动复杂(实习生、进修医生、送餐员),必须支持临时人脸录入或刷卡扫码兼容,不能一刀切。5.数据安全:人脸数据加密存储,只用于食堂扣款,权限最小化,定期安全审计。五、改造成效这套方案由好伙狮数字食堂提供,医院员工餐厅中午高峰单位时间通过的份数明显增加,排队长度缩短,等太久算错价投诉基本归零。AI干苦力,刷脸干结算,让打菜阿姨回归手艺,可能是医院食堂近些年最实用的升级之一。