基于Django与TensorFlow的实时口罩检测系统设计与实现

基于Django与TensorFlow的实时口罩检测系统设计与实现

1. 项目概述

这个基于Django+TensorFlow的实时口罩检测系统是我在疫情期间完成的一个毕业设计项目。当时观察到公共场所人工检查口罩佩戴情况效率低下,于是萌生了用深度学习技术解决这个问题的想法。系统通过摄像头实时捕捉人脸图像,使用训练好的CNN模型判断是否佩戴口罩,并将结果反馈给管理人员。

整套系统采用B/S架构,前端负责视频流采集和结果展示,后端处理图像识别请求,数据库记录检测日志。相比传统人工检查方式,这套系统可以实现7×24小时不间断工作,单次检测耗时仅需200ms左右,准确率达到96%以上。

提示:项目完整代码已开源,文末附获取方式。建议先通读全文了解实现原理再动手实践。

2. 系统架构设计

2.1 整体技术栈选择

系统采用分层架构设计,主要包含以下组件:

  1. 前端界面:基于HTML5+JavaScript实现

    • 使用Video.js处理视频流
    • Canvas实现实时检测框绘制
    • Bootstrap保证响应式布局
  2. 后端服务:Django框架搭建

    • 采用RESTful API设计规范
    • 使用Django Channels支持WebSocket
    • Redis作为消息队列和缓存
  3. AI模型:TensorFlow 2.x实现

    • MobileNetV2作为基础网络
    • 自定义顶层分类器
    • OpenCV进行图像预处理
  4. 数据存储:MySQL数据库

    • 存储用户上传记录
    • 记录检测结果统计
    • 支持历史查询功能

2.2 核心工作流程

系统运行时的主要数据流如下:

  1. 前端通过浏览器获取摄像头权限,持续采集视频流
  2. 按固定间隔(默认200ms)截取视频帧发送到后端
  3. 后端接收图像后调用TensorFlow模型进行推理
  4. 模型返回检测结果(戴口罩/未戴口罩/置信度)
  5. 结果通过WebSocket实时推送到前端展示
  6. 同时将检测记录存入数据库备查

3. 数据准备与处理

3.1 数据集构建

优质的数据集是模型准确性的基础。我收集了以下来源的数据:

  1. 公开数据集

    • MAFA(Masked Faces)数据集
    • WiderFace人脸检测数据集
    • 自爬取的网络图片(约1.2万张)
  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作为基础网络:

  1. 选择理由

    • 轻量级设计适合实时检测
    • 深度可分离卷积计算效率高
    • 预训练权重加速收敛
  2. 改进措施

    • 移除原始分类层
    • 添加全局平均池化层
    • 自定义二分类输出层

模型结构示意图:

Input → MobileNetV2 → GAP → Dropout(0.5) → Dense(1, sigmoid)

4.2 训练参数配置

关键训练参数如下表所示:

参数项设置值说明
优化器Adamβ1=0.9, β2=0.999
学习率1e-4使用余弦退火调度
Batch Size32根据GPU显存调整
Epochs50早停策略监控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 模型优化技巧

  1. 迁移学习策略

    • 前15epoch冻结基础网络
    • 后逐步解冻顶层卷积层
    • 最后5epoch全网络微调
  2. 类别不平衡处理

    • 计算类别权重
    • 采用Focal Loss
    • 过采样少数类样本
  3. 推理速度优化

    • 模型量化(FP16)
    • OpenCV DNN模块部署
    • 输入尺寸调整为160×160

5. 系统实现细节

5.1 Django后端开发

关键实现要点:

  1. 异步处理设计

    • 使用Celery处理耗时推理任务
    • Redis作为消息代理
    • WebSocket实时推送结果
  2. 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)})
  1. 性能优化措施
    • 启用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
Python3.8虚拟环境隔离
TensorFlow2.6GPU加速版
Django3.2
数据库MySQL 8.0

使用Docker-compose编排服务:

version: '3' services: web: build: . ports: - "8000:8000" depends_on: - redis redis: image: redis:alpine

6.2 性能测试结果

在不同硬件环境下的表现:

设备推理耗时FPS显存占用
GTX 1080Ti45ms221.8GB
RTX 207032ms311.5GB
Jetson Xavier NX68ms141.2GB
CPU(i7-10700)210ms4-

注意:实际部署时应根据硬件条件调整输入图像尺寸和batch size以达到最佳性能平衡。

7. 常见问题与解决方案

7.1 模型准确率问题

问题表现

  • 对侧面人脸检测不准
  • 特殊口罩类型识别错误
  • 光照强烈时误判

解决方案

  1. 增加困难样本
  2. 使用Hard Example Mining
  3. 添加光照归一化预处理

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 其他实用技巧

  1. 多人脸检测优化

    • 先用MTCNN检测所有人脸
    • 再对每个ROI单独分类
    • 使用NMS去除重复框
  2. 模型监控方案

    • 记录预测置信度分布
    • 设置异常检测阈值
    • 定期评估模型衰减

8. 项目扩展方向

在实际使用过程中,我发现系统还可以进一步优化:

  1. 多模态检测

    • 结合温度传感器数据
    • 添加语音提示功能
    • 集成身份证识别模块
  2. 边缘计算部署

    • 移植到树莓派平台
    • 使用TFLite转换模型
    • 开发Android端APP
  3. 管理功能增强

    • 添加区域入侵检测
    • 实现人流量统计
    • 生成防疫报表

这个项目从构思到实现共耗时3个月,期间遇到过无数坑点,比如TensorFlow版本兼容问题、Django静态文件配置错误、跨域访问限制等。最大的收获是深刻理解了从算法研究到工程落地的完整流程。建议想复现的同学先从简化版开始,逐步添加功能模块。