这是一个针对电影院场景的AI行为检测系统。核心想法很简单:用计算机视觉(YOLO)检测影院里的人和物体,然后用大模型看这些检测结果并分析是否有违规行为(比如抽烟、拍照等)。
为什么要这样搞?因为影院违规行为(吸烟、录视频等)对其他观众体验影响很大,传统的监控员巡查效率太低。这个系统可以自动检测并告警,让管理员快速处理。
核心技术栈:
- 后端:Flask + SQLAlchemy + JWT认证
- 检测:YOLOv8x(自动识别人、手机、烟雾等)
- 分析:大语言模型(支持OpenAI、智谱、千问、ModelScope)
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0
上传视频 / 本地摄像头录制上传
↓
按采样间隔抽帧(frame_interval)
↓
YOLOv8先做人物检测(仅人)
↓
将命中帧交给大模型分析是否违规
↓
保存识别结果与样本帧
↓
前端实时轮询任务状态并展示违规摘要
- Python 3.8+
- MySQL 5.7+ 或 MySQL 8.0(推荐)
- Node.js 14+(仅当需要修改前端时)
# 1. 创建并激活虚拟环境(首次执行)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# 2. 安装依赖
pip install -r requirements.txt
# 3. 初始化数据库(确保 MySQL 已启动)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS cinema_detection CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 4. 配置环境变量
Copy-Item .env.example .env
# 按实际情况修改 DB_HOST/DB_USER/DB_PASSWORD
# 5. 初始化并启动
python init_db.py
python app.py# 1. 创建并激活虚拟环境(首次执行)
python3 -m venv .venv
source .venv/bin/activate
# 2. 安装依赖
pip install -r requirements.txt
# 3. 初始化数据库(确保 MySQL 已启动)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS cinema_detection CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 4. 配置环境变量
cp .env.example .env
# 按实际情况修改 DB_HOST/DB_USER/DB_PASSWORD
# 5. 初始化并启动
python init_db.py
python app.py启动成功后访问 http://localhost:9500
- 用户名:
admin - 密码:
admin123
讲道理,YOLOv8检测对象已经不难了,难的是理解这些检测结果代表什么。比如:
- 检测到"phone"不一定违规(可能是工作人员)
- 检测到"person"和"smoke"一起,才是违规
所以我们集成了大语言模型来做这个"理解"的工作。核心流程是:
- YOLO检测:在采样视频帧中先检测人形目标
- 帧数据准备:将命中帧编码后发送给LLM
- LLM分析:大模型结合帧画面判断是否存在违规行为
- 返回分析:得到自然语言的分析结果
在 .env 里配置,选一个就行:
# ModelScope - 国内推荐(免费配额,响应快)
LLM_PROVIDER=modelscope
MODELSCOPE_API_KEY=你的key
# OpenAI - 效果最好(需要付费)
LLM_PROVIDER=openai
OPENAI_API_KEY=你的key
# 其他...
LLM_PROVIDER=zhipu # 智谱
LLM_PROVIDER=qwen # 通义千问不配置的话会自动用本地规则分析(但效果不如LLM)。
project/
├── api/ # API端点(Flask蓝图)
│ ├── auth.py # 登录、用户管理
│ ├── cinema.py # 影院、影厅管理
│ ├── camera.py # 摄像头管理
│ ├── detect.py # 检测API(这是核心)
│ ├── alarm.py # 报警管理
│ ├── dashboard.py # 仪表盘数据
│ └── role.py # 权限管理
├── models/ # 数据库模型
├── services/
│ └── detection.py # YOLO检测引擎
├── utils/
│ └── llm.py # LLM分析(核心逻辑)
├── frontend/ # Vue 3前端
│ ├── src/views/ # 各个页面
│ ├── src/layouts/ # 布局
│ └── dist/ # 编译好的文件
├── config.py # 配置
├── app.py # 入口
└── requirements.txt # Python依赖
| 页面 | 干什么 | 谁能用 |
|---|---|---|
| 视频识别 | 上传视频或本地摄像头录制上传,查看识别任务与LLM分析 | 所有人 |
| 报警管理 | 查看系统发现的违规事件 | 所有人 |
| 仪表盘 | 数据统计、系统状态 | 所有人 |
| 影院管理 | 配置影院、影厅、座位 | 系统管理员 |
| 用户管理 | 增删改查用户账号 | 系统管理员/影院经理(仅本影院) |
| 角色管理 | 配置权限 | 系统管理员 |
就按上面"快速开始"的步骤来。前端已经编译好了,不用自己再build。
# 1. 安装Gunicorn
pip install gunicorn
# 2. 启动Flask应用(后台运行)
gunicorn -w 4 -b 0.0.0.0:5000 app:app &
# 3. Nginx配置(/etc/nginx/sites-enabled/default)
upstream cinema_app {
server 127.0.0.1:5000;
}
server {
listen 80;
server_name your-domain.com;
# 增大文件上传限制(检测API会上传视频)
client_max_body_size 200M;
location / {
proxy_pass http://cinema_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# 4. 重启Nginx
sudo systemctl restart nginx项目根目录有 docker-compose.yml,一键启动MySQL + Flask:
# 启动
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止
docker-compose down创建 /etc/systemd/system/cinema-detection.service:
[Unit]
Description=Cinema Detection System
After=network.target
[Service]
Type=notify
User=www-data
WorkingDirectory=/home/www-data/cinema-detection
Environment="PATH=/usr/local/bin"
ExecStart=/usr/local/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
KillSignal=SIGTERM
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target然后:
sudo systemctl daemon-reload
sudo systemctl start cinema-detection
sudo systemctl enable cinema-detection # 开机自启用Let's Encrypt免费SSL证书:
sudo apt install certbot python3-certbot-nginx
sudo certbot certonly --nginx -d your-domain.comNginx配置改成:
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# ... 其他配置
}
# 80端口重定向到443
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}编辑 .env 文件(复制 .env.example 改改就行):
# Flask配置
FLASK_ENV=development
SECRET_KEY=生成一个随机字符串
JWT_SECRET_KEY=生成另一个随机字符串
# MySQL
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=你的密码
DB_NAME=cinema_detection
# LLM提供商(选一个)
LLM_PROVIDER=modelscope
MODELSCOPE_API_KEY=你的key
# YOLO模型配置
YOLO_MODEL_PATH=yolov8x.pt
YOLO_DEVICE=cpu # 改成cuda用GPU
YOLO_CONFIDENCE=0.5 # 置信度阈值
ENABLE_YOLO=trueError: MySQL Connection refused
原因:MySQL没启动或密码错了
解决:
# 检查MySQL运行状态
sudo systemctl status mysql # Linux
brew services list | grep mysql # macOS
# 测试连接
mysql -u root -p -h localhost cinema_detection
# 如果还是不行,检查.env里的DB_PASSWORD是否正确{"success": true, "detections": [], "llm_description": "..."}这不是错误,说明图片里没检测到YOLOv8的目标对象。LLM会自动生成描述。
Cannot GET /
可能原因:
- 后端没启动
- 前端资源没编译
解决:
# 确保后端启动
python3 app.py
# 重新编译前端(如有修改)
cd frontend
npm install && npm run build
cd ..# 查看占用进程
lsof -i :9500
# 杀死它
kill -9 <PID>
# 或改端口(app.py最后一行)
socketio.run(app, host='0.0.0.0', port=8080, debug=True)ModelScope API 调用失败: ...
原因:API Key配置错了
解决:
- 检查.env文件中MODELSCOPE_API_KEY是否正确
- 换个LLM提供商试试(改LLM_PROVIDER)
- 不配置LLM_PROVIDER的话系统会自动用本地规则分析
# 完全重置数据库
mysql -u root -p cinema_detection < /dev/null
# 然后重启app.py
python3 app.py-
数据库备份:定期备份MySQL
mysqldump -u root -p cinema_detection > backup.sql -
文件存储:检测图片保存在
static/alarms/,建议定期清理或用对象存储(阿里OSS等) -
LLM成本控制:OpenAI会收费,建议用国内免费的ModelScope或智谱
-
监控日志:生产环境改成
FLASK_ENV=production # 不显示详细错误 DEBUG=False
-
反向代理缓存:Nginx可以缓存静态资源加快速度
POST /api/detect/video
Content-Type: multipart/form-data
Authorization: Bearer <token>
返回:
{
"success": true,
"task_id": "xxx",
"message": "视频识别任务已创建"
}POST /api/auth/login
{"username": "admin", "password": "admin123"}
返回:
{"access_token": "..."}完整的API文档启动后访问 http://localhost:9500/api-test.html
系统有4个内置角色,不同用户有不同权限与作用域:
- 系统管理员(admin):全局权限,负责用户、角色、影院与设备策略
- 影院经理(manager):仅可管理
token.cinema_id对应影院的用户账号,并可查看监控与处置告警 - 监控员(operator):监控与告警处置,不做配置变更
- 运维(maintenance):摄像头和视频流维护,可处置告警,不参与用户/角色管理
可通过接口查看统一角色关系矩阵:
GET /api/auth/role-relations
Authorization: Bearer <token>第一次运行时,系统会自动下载YOLOv8x模型(~130MB)到 ~/.yolov8/。需要科学上网或换镜像。
用了紫粉色系(#7c3aed主色),响应式设计,PC和手机都好用。
所有API都需要JWT Token。登录后得到Token,在HTTP Header里加:
Authorization: Bearer <your_token>
MIT License - 随便用
当前版本:1.0.0 | 最后更新:2026-03-13
有问题或建议?欢迎反馈!