1. 项目概述:STM32与深度学习结合的口罩检测系统
这个毕业设计项目构建了一套完整的口罩佩戴检测系统,创新性地将嵌入式硬件与深度学习技术相结合。系统采用双核心架构:上位机负责运行基于YOLOv5的口罩检测算法,下位机使用STM32F103RCT6开发板实现检测结果的显示与报警功能。整套系统通过WiFi模块建立通信链路,实现了从图像采集、AI识别到硬件响应的全流程自动化处理。
从技术实现角度来看,这个项目完美融合了当前热门的三个技术方向:嵌入式开发(STM32)、物联网通信(WiFi模块)和计算机视觉(YOLOv5)。这种组合不仅符合当下智能硬件的发展趋势,也为毕业设计提供了足够的创新点和展示空间。项目整体难度适中但完整度高,包含硬件设计、软件编程和算法训练等多个环节,能够全面锻炼学生的工程实践能力。
2. 系统架构与硬件设计
2.1 整体系统框架
系统采用典型的客户端-服务器架构,上位机(PC端)作为TCP客户端运行口罩检测算法,下位机(STM32)作为TCP服务器接收检测结果。这种设计有以下几个优势:
- 将计算密集型的图像处理任务交给性能更强的PC端处理
- STM32专注于硬件控制和实时响应
- 通过WiFi实现灵活部署,不受有线连接限制
系统工作流程如下:
- PC端摄像头采集实时视频流
- YOLOv5模型进行口罩佩戴检测
- 检测结果通过WiFi传输至STM32
- STM32解析数据并控制外设:
- OLED显示检测状态
- 蜂鸣器在未戴口罩时报警
2.2 关键硬件选型与原理
2.2.1 主控芯片:STM32F103RCT6
选择这款芯片主要基于以下考虑:
- 72MHz主频,256KB Flash,48KB RAM,性能足够处理通信和显示任务
- 丰富的外设接口:5个USART、2个SPI、2个I2C,方便连接各类模块
- 成本低廉且开发资源丰富,适合学生项目
提示:在实际焊接时,建议先测试所有GPIO引脚是否正常工作,有些开发板的个别引脚可能存在虚焊问题。
2.2.2 通信模块:ESP-01S WiFi模块
这个模块的核心优势在于:
- 内置TCP/IP协议栈,简化网络编程
- 支持AT指令控制,与STM32通过串口通信
- 体积小巧(18mm×20mm),功耗低(工作电流约80mA)
硬件连接示意图:
code复制STM32 USART2_TX --> ESP01S_RX
STM32 USART2_RX --> ESP01S_TX
STM32 3.3V --> ESP01S_VCC
STM32 GND --> ESP01S_GND
2.2.3 显示模块:1.44寸SPI接口LCD
选用这款屏幕的考虑因素:
- SPI接口只需4线连接,节省IO资源
- 128×128分辨率足够显示检测状态
- 自带控制器(ST7735),减轻主控负担
实际使用中发现的一个坑:部分廉价屏幕的背光电路设计不合理,长时间工作可能导致STM32复位。解决方法是在背光引脚串联一个100Ω电阻限流。
3. 软件系统设计与实现
3.1 下位机软件架构
STM32程序采用模块化设计,主要包含以下几个功能模块:
3.1.1 通信协议处理
c复制// WiFi数据接收状态机
typedef enum {
WAIT_HEADER,
RECEIVING_DATA,
CHECK_SUM
} RecvState;
void USART2_IRQHandler(void) {
static RecvState state = WAIT_HEADER;
static uint8_t buffer[32], index = 0;
uint8_t data = USART_ReceiveData(USART2);
switch(state) {
case WAIT_HEADER:
if(data == 0xAA) { // 帧头检测
buffer[index++] = data;
state = RECEIVING_DATA;
}
break;
case RECEIVING_DATA:
buffer[index++] = data;
if(index >= sizeof(buffer)-1) {
state = CHECK_SUM;
}
break;
case CHECK_SUM:
if(VerifyChecksum(buffer, index)) {
ProcessDetectionResult(buffer);
}
state = WAIT_HEADER;
index = 0;
break;
}
}
3.1.2 显示驱动设计
OLED显示采用分层架构:
- 底层硬件驱动层:实现SPI通信和基本绘图函数
- 中间件层:提供文本显示、图形绘制等API
- 应用层:根据检测结果更新界面
显示内容布局示例:
code复制+-------------------+
| 口罩检测系统 |
| 状态: [检测中] |
| 结果: 已佩戴√ |
| 人数: 12 |
| 警告: 无 |
+-------------------+
3.2 上位机软件实现
3.2.1 基于YOLOv5的检测系统
模型训练关键参数配置:
yaml复制# data/mask.yaml
train: ../train/images
val: ../valid/images
nc: 3 # 类别数
names: ['with_mask', 'without_mask', 'mask_weared_incorrect']
# models/yolov5s.yaml
depth_multiple: 0.33
width_multiple: 0.50
anchors:
- [10,13, 16,30, 33,23]
- [30,61, 62,45, 59,119]
- [116,90, 156,198, 373,326]
3.2.2 TCP通信服务实现
Python实现的核心代码片段:
python复制import socket
import threading
class DetectionServer:
def __init__(self, host='0.0.0.0', port=8888):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((host, port))
self.server_socket.listen(5)
def handle_client(self, client_socket):
try:
while True:
# 获取检测结果
result = self.detector.get_result()
# 发送给STM32
client_socket.send(result.encode())
time.sleep(0.1)
except Exception as e:
print(f"Client disconnected: {e}")
def start(self):
print("Server started...")
while True:
client_sock, addr = self.server_socket.accept()
print(f"Accepted connection from {addr}")
client_thread = threading.Thread(
target=self.handle_client,
args=(client_sock,)
)
client_thread.start()
4. 深度学习模型训练与优化
4.1 数据集构建与增强
原始数据集包含8535张图片,分为三类:
- 正确佩戴口罩:2978张
- 未佩戴口罩:2995张
- 错误佩戴口罩:2994张
为提高模型鲁棒性,采用了以下数据增强策略:
- 随机水平翻转(概率0.5)
- 随机旋转(-15°~+15°)
- 亮度调整(0.8~1.2倍)
- 添加高斯噪声(σ=0.01)
数据标注使用LabelImg工具,生成YOLO格式的标注文件。每个标注文件包含:
code复制<object-class> <x_center> <y_center> <width> <height>
其中x_center、y_center、width、height都是相对于图片宽高的归一化值。
4.2 模型训练细节
训练环境配置:
- GPU: NVIDIA GTX 1660 Ti (6GB显存)
- 框架: PyTorch 1.8.0
- CUDA: 11.1
关键训练参数:
bash复制python train.py --img 640 --batch 16 --epochs 50 --data mask.yaml --cfg yolov5s.yaml --weights yolov5s.pt
训练过程中的关键指标变化:
| Epoch | mAP@0.5 | Precision | Recall | Loss |
|---|---|---|---|---|
| 10 | 0.782 | 0.85 | 0.72 | 0.45 |
| 20 | 0.865 | 0.89 | 0.83 | 0.32 |
| 30 | 0.912 | 0.93 | 0.89 | 0.21 |
| 40 | 0.934 | 0.95 | 0.92 | 0.15 |
| 50 | 0.947 | 0.96 | 0.94 | 0.12 |
4.3 模型量化与部署
为提升在PC端的推理速度,对训练好的模型进行了FP16量化:
python复制model = torch.load('best.pt')
model.half() # 转换为FP16
torch.save(model, 'best_fp16.pt')
量化前后性能对比:
| 指标 | FP32模型 | FP16模型 |
|---|---|---|
| 推理速度(FPS) | 45 | 68 |
| 模型大小(MB) | 14.5 | 7.8 |
| mAP@0.5 | 0.947 | 0.942 |
5. 系统集成与调试
5.1 通信协议设计
为保证数据传输可靠性,自定义了简单的应用层协议:
帧格式:
code复制+--------+--------+--------+--------+--------+--------+
| 帧头 | 长度 | 命令字 | 数据 | 校验和 | 帧尾 |
| 0xAA | 1字节 | 1字节 | N字节 | 1字节 | 0x55 |
+--------+--------+--------+--------+--------+--------+
命令字定义:
- 0x01:检测结果通知
- 0x02:心跳包
- 0x03:报警控制
5.2 常见问题与解决方案
5.2.1 WiFi连接不稳定
现象:ESP01S经常断开连接
解决方法:
- 在STM32端实现心跳机制(每5秒发送一次心跳包)
- 增加WiFi信号强度检测,低于-70dBm时提示
- 在ESP01S固件中设置自动重连
5.2.2 检测延迟过高
优化措施:
- 限制检测帧率(15FPS)
- 使用多线程处理:
python复制import threading class DetectorThread(threading.Thread): def __init__(self): super().__init__() self.result = None def run(self): while True: self.result = detect_mask(frame)
5.2.3 误报问题处理
通过以下方式降低误报率:
- 设置检测结果滤波(连续3帧检测到未戴口罩才报警)
- 增加人脸检测置信度阈值(从0.5提高到0.7)
- 对同一人脸采用跟踪算法,避免频繁切换状态
6. 项目扩展与改进方向
6.1 硬件层面的改进
- 替换为性能更强的STM32H7系列,实现边缘端推理
- 增加红外测温模块,实现体温和口罩双重检测
- 使用工业级WiFi模块(如ESP32-WROVER),提高通信稳定性
6.2 算法层面的优化
-
改进数据集:
- 增加不同人种、光照条件下的样本
- 收集各种口罩类型(N95、外科口罩、布口罩等)
-
模型优化:
- 使用知识蒸馏技术压缩模型
- 尝试更轻量的网络如YOLOv5n
6.3 系统功能扩展
-
增加数据统计功能:
- 每日人流量统计
- 口罩佩戴率分析
-
实现云端管理:
- 通过MQTT协议上传数据至云平台
- 提供Web管理界面
在实际部署中发现,系统的响应速度很大程度上取决于WiFi网络的稳定性。建议在正式场合使用时,可以考虑使用有线网络转WiFi的方案,或者选择更高性能的无线模块。另外,模型的准确率虽然达到了97%,但在强逆光环境下性能会明显下降,这需要通过增加更多样的训练数据来改善。