2025-03-18 08:46:36 +08:00

5.0 KiB
Raw Blame History

title createTime permalink icon tags
啥时候吃饭 2025/03/08 06:52:55 /project-docs/when2eat/ line-md:loading-alt-loop
PGuide OAuth
计算机视觉
YOLO
ECharts

哈哈,这个项目是一个科学决策什么时候去食堂吃饭的项目,让你合理避开重医吃饭高峰期。

::: echarts 重医食堂实时人数示例动态折线图

const oneDay = 86400000
const data = []
let now = new Date(1997, 9, 3)
let value = Math.random() * 1000

function randomData() {
  now = new Date(+now + oneDay)
  value = value + Math.random() * 21 - 10
  return {
    name: now.toString(),
    value: [
      [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
      Math.round(value),
    ],
  }
}

for (let i = 0; i < 1000; i++) data.push(randomData())

const option = {
  tooltip: {
    trigger: 'axis',
    formatter(params) {
      params = params[0]
      const date = new Date(params.name)
      return (
        `${date.getDate()
        }/${
          date.getMonth() + 1
        }/${
          date.getFullYear()
        } : ${
          params.value[1]}`
      )
    },
    axisPointer: {
      animation: false,
    },
  },
  xAxis: {
    type: 'time',
    splitLine: {
      show: false,
    },
  },
  yAxis: {
    type: 'value',
    boundaryGap: [0, '100%'],
    splitLine: {
      show: false,
    },
  },
  toolbox: {
    show: true,
    feature: {
      mark: {
        show: true,
      },
      dataView: {
        show: true,
        readOnly: false,
      },
      restore: {
        show: true,
      },
      saveAsImage: {
        show: true,
      },
    },
  },
  series: [
    {
      name: 'Fake Data',
      type: 'line',
      showSymbol: false,
      data,
    },
  ],
}
const timeId = setInterval(() => {
  if (myChart._disposed)
    return clearInterval(timeId)

  for (let i = 0; i < 5; i++) {
    data.shift()
    data.push(randomData())
  }
  myChart.setOption({
    series: [
      {
        data,
      },
    ],
  })
}, 1000)

:::

项目简介

使用YOLO、OpenCV等计算机视觉识别框架检测画面中人数在网页端、APP端显示实时人流量通过机器学习算法推测最合理的吃饭时间区间。

项目重点

  • 高精度识别实时人数
    • 30FPS以上的识别帧
  • 网络传输json数据
    • 后端跨域访问
    • 身份验证
  • 前端设计
    • 组件、UI设计
  • 机器学习推测
    • 数据采集
    • 算法选型
  • 通知配置
    • SMTP邮件通知
    • QQ机器人

项目进度

  • 完成基础的人类识别
  • 前端UI设计
  • 前端页面开发
  • 完成一周的数据采集
  • 机器学习推测

项目结构

:::file-tree

  • when2eat/
    • backend/ # Flask后端核心

      • app/
        • api/ # API路由
          • v1/ # API版本控制
        • common/ # 通用工具
        • models/ # 数据库模型
        • services/ # 业务逻辑层
        • init.py
      • ml_models/ # 训练好的模型文件
        • yolo_v5s/ # 不同版本模型
      • scripts/ # 数据库迁移及其他脚本
      • tests/ # 后端测试
        • unit/ # 单元测试
        • integration/ # 集成测试
      • requirements/
        • dev.txt # 开发依赖
        • prod.txt # 生产依赖
    • frontend/ # Vue 3前端

      • public/ # 公开资源
      • src/
        • assets/ # 静态资源
        • components/ # 通用组件
        • views/ # 页面视图
        • services/ # API服务层
        • utils/ # 前端工具
    • cv_processing/ # 计算机视觉模块

      • detectors/ # 检测算法实现
      • utils/ # OpenCV工具
      • calibration/ # 摄像头校准数据
    • infrastructure/ # 基础设施配置

      • docker/ # Docker配置
        • nginx/ # Nginx配置
        • flask/ # Flask配置
      • k8s/ # Kubernetes配置
      • terraform/ # 基础设施即代码配置
    • docs/ # 项目文档

      • api-spec/ # OpenAPI规范
      • architecture/ # 架构设计图
      • deployment.md # 部署文档
    • notebooks/ # Jupyter分析笔记

    • .github/ # CI/CD配置

      • workflows/ # 工作流配置
    • Makefile # 构建自动化

    • docker-compose.yml # Docker Compose配置

    • .env.sample # 环境变量模板 :::

其他可能会遇到的问题

  • 如何进行数据采集
    • python写一个定时任务调用摄像头抓拍
    • 注意数据脱敏,不要上传任何人脸数据
  • 光线较暗时如何进行算法优化
    • 红外可能效果并不理想
  • 机器学习比较陌生
    • 可以采用现有大模型调用其API即可
    • 不不不,我就要学机器学习