基于Django与TensorFlow的实时口罩检测系统设计与实现
1. 项目概述
这个基于Django+TensorFlow的实时口罩检测系统是我在疫情期间完成的一个毕业设计项目。当时观察到公共场所人工检查口罩佩戴情况效率低下,于是萌生了用深度学习技术解决这个问题的想法。系统通过摄像头实时捕捉人脸图像,使用训练好的CNN模型判断是否佩戴口罩,并将结果反馈给管理人员。
整套系统采用B/S架构,前端负责视频流采集和结果展示,后端处理图像识别请求,数据库记录检测日志。相比传统人工检查方式,这套系统可以实现7×24小时不间断工作,单次检测耗时仅需200ms左右,准确率达到96%以上。
提示:项目完整代码已开源,文末附获取方式。建议先通读全文了解实现原理再动手实践。
2. 系统架构设计
2.1 整体技术栈选择
系统采用分层架构设计,主要包含以下组件:
前端界面:基于HTML5+JavaScript实现
- 使用Video.js处理视频流
- Canvas实现实时检测框绘制
- Bootstrap保证响应式布局
后端服务:Django框架搭建
- 采用RESTful API设计规范
- 使用Django Channels支持WebSocket
- Redis作为消息队列和缓存
AI模型:TensorFlow 2.x实现
- MobileNetV2作为基础网络
- 自定义顶层分类器
- OpenCV进行图像预处理
数据存储:MySQL数据库
- 存储用户上传记录
- 记录检测结果统计
- 支持历史查询功能
2.2 核心工作流程
系统运行时的主要数据流如下:
- 前端通过浏览器获取摄像头权限,持续采集视频流
- 按固定间隔(默认200ms)截取视频帧发送到后端
- 后端接收图像后调用TensorFlow模型进行推理
- 模型返回检测结果(戴口罩/未戴口罩/置信度)
- 结果通过WebSocket实时推送到前端展示
- 同时将检测记录存入数据库备查
3. 数据准备与处理
3.1 数据集构建
优质的数据集是模型准确性的基础。我收集了以下来源的数据:
公开数据集:
- MAFA(Masked Faces)数据集
- WiderFace人脸检测数据集
- 自爬取的网络图片(约1.2万张)
自采数据:
- 使用不同型号手机拍摄的室内外场景
- 多种光照条件下的样本
- 不同角度、遮挡情况的特写
最终构建的数据集包含3.5万张标注图像,正负样本比例控制在6:4。标注采用PASCAL VOC格式,包含人脸位置和口罩佩戴状态两类标签。
3.2 数据增强策略
为提高模型泛化能力,采用了多种数据增强技术:
from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest')具体增强方式包括:
- 随机旋转(±20度)
- 平移变换(20%幅度)
- 剪切变形
- 缩放变化
- 水平翻转
- 亮度/对比度调整
4. 模型设计与训练
4.1 网络架构选择
经过对比实验,最终采用MobileNetV2作为基础网络:
选择理由:
- 轻量级设计适合实时检测
- 深度可分离卷积计算效率高
- 预训练权重加速收敛
改进措施:
- 移除原始分类层
- 添加全局平均池化层
- 自定义二分类输出层
模型结构示意图:
Input → MobileNetV2 → GAP → Dropout(0.5) → Dense(1, sigmoid)4.2 训练参数配置
关键训练参数如下表所示:
| 参数项 | 设置值 | 说明 |
|---|---|---|
| 优化器 | Adam | β1=0.9, β2=0.999 |
| 学习率 | 1e-4 | 使用余弦退火调度 |
| Batch Size | 32 | 根据GPU显存调整 |
| Epochs | 50 | 早停策略监控val_loss |
| 损失函数 | BinaryCrossentropy | 带类别权重 |
训练脚本核心代码:
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224,224,3)) x = GlobalAveragePooling2D()(base_model.output) x = Dropout(0.5)(x) predictions = Dense(1, activation='sigmoid')(x) model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False model.compile(optimizer=Adam(1e-4), loss='binary_crossentropy', metrics=['accuracy'])4.3 模型优化技巧
迁移学习策略:
- 前15epoch冻结基础网络
- 后逐步解冻顶层卷积层
- 最后5epoch全网络微调
类别不平衡处理:
- 计算类别权重
- 采用Focal Loss
- 过采样少数类样本
推理速度优化:
- 模型量化(FP16)
- OpenCV DNN模块部署
- 输入尺寸调整为160×160
5. 系统实现细节
5.1 Django后端开发
关键实现要点:
异步处理设计:
- 使用Celery处理耗时推理任务
- Redis作为消息代理
- WebSocket实时推送结果
API接口设计:
# views.py class DetectAPIView(APIView): def post(self, request): img = request.FILES['image'] img = preprocess_image(img) result = model.predict(img) return Response({'status': result>0.5, 'confidence': float(result)})- 性能优化措施:
- 启用Gzip压缩
- 配置Nginx缓存
- 使用uvicorn替代WSGI
5.2 前端交互实现
核心功能代码示例:
// 视频流处理 const video = document.getElementById('video'); const canvas = document.getElementById('canvas'); navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => { video.srcObject = stream; setInterval(() => { canvas.getContext('2d').drawImage(video, 0, 0); const imageData = canvas.toDataURL('image/jpeg'); // 发送到后端API detectMask(imageData); }, 200); }); // WebSocket结果处理 const socket = new WebSocket('ws://localhost:8000/ws/detect/'); socket.onmessage = function(e) { const data = JSON.parse(e.data); drawDetectionBox(data); };6. 部署与性能测试
6.1 系统部署方案
推荐部署环境配置:
| 组件 | 版本 | 备注 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 LTS | |
| Python | 3.8 | 虚拟环境隔离 |
| TensorFlow | 2.6 | GPU加速版 |
| Django | 3.2 | |
| 数据库 | MySQL 8.0 |
使用Docker-compose编排服务:
version: '3' services: web: build: . ports: - "8000:8000" depends_on: - redis redis: image: redis:alpine6.2 性能测试结果
在不同硬件环境下的表现:
| 设备 | 推理耗时 | FPS | 显存占用 |
|---|---|---|---|
| GTX 1080Ti | 45ms | 22 | 1.8GB |
| RTX 2070 | 32ms | 31 | 1.5GB |
| Jetson Xavier NX | 68ms | 14 | 1.2GB |
| CPU(i7-10700) | 210ms | 4 | - |
注意:实际部署时应根据硬件条件调整输入图像尺寸和batch size以达到最佳性能平衡。
7. 常见问题与解决方案
7.1 模型准确率问题
问题表现:
- 对侧面人脸检测不准
- 特殊口罩类型识别错误
- 光照强烈时误判
解决方案:
- 增加困难样本
- 使用Hard Example Mining
- 添加光照归一化预处理
7.2 系统延迟问题
优化措施:
# 使用TensorRT加速 from tensorflow.python.compiler.tensorrt import trt_convert as trt converter = trt.TrtGraphConverter( input_saved_model_dir='saved_model', precision_mode='FP16') converter.convert() converter.save('trt_model')7.3 其他实用技巧
多人脸检测优化:
- 先用MTCNN检测所有人脸
- 再对每个ROI单独分类
- 使用NMS去除重复框
模型监控方案:
- 记录预测置信度分布
- 设置异常检测阈值
- 定期评估模型衰减
8. 项目扩展方向
在实际使用过程中,我发现系统还可以进一步优化:
多模态检测:
- 结合温度传感器数据
- 添加语音提示功能
- 集成身份证识别模块
边缘计算部署:
- 移植到树莓派平台
- 使用TFLite转换模型
- 开发Android端APP
管理功能增强:
- 添加区域入侵检测
- 实现人流量统计
- 生成防疫报表
这个项目从构思到实现共耗时3个月,期间遇到过无数坑点,比如TensorFlow版本兼容问题、Django静态文件配置错误、跨域访问限制等。最大的收获是深刻理解了从算法研究到工程落地的完整流程。建议想复现的同学先从简化版开始,逐步添加功能模块。
