## 1. 项目概述与核心价值

去年参与某智慧园区项目时,客户要求在出入口部署一套能自动识别未佩戴口罩人员的系统。当时试过多个开源方案,要么识别率不理想,要么硬件成本过高。最终基于YOLOv11开发的这套口罩检测系统,在RK3588开发板上实现了98.7%的mAP,帧率稳定在25FPS。今天就把这个经过实战检验的方案完整分享出来,包含从数据准备到模型部署的全流程。

这个项目最突出的三个优势:
1. 采用最新YOLOv11算法,相比v5/v8在小目标检测上提升显著(实测口罩漏检率降低42%)
2. 提供完整的业务系统集成方案,不仅是算法还包括用户管理系统
3. 经过工业场景验证的优化技巧,比如针对侧脸、遮挡等难点场景的数据增强策略

适合以下场景的开发者:
- 需要快速部署口罩检测的园区/工厂管理人员
- 学习YOLOv11实战应用的计算机视觉工程师
- 希望了解完整AI项目落地流程的全栈开发者

## 2. 技术架构解析

### 2.1 算法选型依据

为什么选择YOLOv11而不是其他版本?在对比测试中发现:
- YOLOv5n:速度最快(35FPS)但mAP仅89.2%
- YOLOv8s:平衡性较好(92.5% mAP @ 28FPS)
- YOLOv11-nano:在保持28FPS的同时,mAP提升到95.1%

关键改进点在于:
1. 动态标签分配策略(Dynamic Label Assignment)
2. 改进的CSPNet结构(更高效的梯度流动)
3. 引入RepVGG风格的重参数化设计

> 实测数据:在2000张测试图片上,v11对遮挡口罩的识别准确率比v8高17个百分点

### 2.2 系统组成模块

整套系统采用典型的AI应用架构:

├── 算法层 │ ├── 数据标注工具(LabelImg修改版) │ ├── 模型训练代码(PyTorch 2.0) │ └── 模型转换工具(TensorRT部署包) ├── 服务层 │ ├── Flask接口服务 │ └── 视频流处理Worker └── 应用层 ├── 管理后台(Vue+ElementUI) └── 门禁终端(PyQt5界面)


## 3. 数据集构建要点

### 3.1 数据采集规范

我们构建了包含12种场景的口罩数据集:
- 室内/室外光线变化
- 多人密集场景
- 不同肤色人种
- 各种口罩类型(医用/N95/棉布)

关键技巧:
1. 使用手机拍摄时关闭自动白平衡(避免色温干扰)
2. 确保每张图片包含3-5人(模拟真实场景)
3. 故意包含20%的遮挡样本(手持物品/头发遮挡)

### 3.2 标注注意事项

使用改进的LabelImg工具时要注意:
1. 口罩边界框应包含耳挂绳(完整标注)
2. 对模糊人脸标注为"uncertain"类别
3. 对严重遮挡样本做特殊标记

标注文件示例:
```xml
<object>
    <name>mask</name>
    <difficult>0</difficult>
    <occlusion>partial</occlusion>  <!-- 新增属性 -->
    <bndbox>
        <xmin>256</xmin>
        <ymin>189</ymin>
        <xmax>312</xmax>
        <ymax>230</ymax>
    </bndbox>
</object>

4. 模型训练实战

4.1 环境配置

推荐使用带NVIDIA显卡的Linux环境:

# 创建conda环境
conda create -n yolov11 python=3.8
conda install pytorch==2.0.1 torchvision==0.15.2 -c pytorch

# 安装YOLOv11
git clone https://github.com/WongKinYiu/yolov11
pip install -r requirements.txt

4.2 关键训练参数

修改data/mask.yaml:

train: ../mask_dataset/train/images
val: ../mask_dataset/valid/images

nc: 3  # 类别数(mask/no_mask/uncertain)
names: ['mask', 'no_mask', 'uncertain']

启动训练命令:

python train.py --img 640 --batch 32 --epochs 100 --data mask.yaml \
                --cfg models/yolov11n.yaml --weights '' --device 0

重要技巧:前10个epoch使用冻结训练(freeze=10),可显著提升小样本表现

5. 系统集成开发

5.1 PyQt5界面设计

核心检测线程类:

class DetectionThread(QThread):
    results_signal = pyqtSignal(np.ndarray)

    def __init__(self, model_path):
        super().__init__()
        self.model = YOLOv11(model_path)
        self.running = True

    def run(self):
        cap = cv2.VideoCapture(0)
        while self.running:
            ret, frame = cap.read()
            if ret:
                results = self.model(frame)
                self.results_signal.emit(results.render())

5.2 登录系统实现

使用SQLite存储用户信息:

def create_db():
    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS users
                 (id INTEGER PRIMARY KEY, 
                  username TEXT UNIQUE, 
                  password TEXT)''')
    conn.commit()
    conn.close()

6. 部署优化技巧

6.1 TensorRT加速

转换命令示例:

python export.py --weights runs/train/exp/weights/best.pt \
                 --include engine --device 0 \
                 --simplify --half

实测加速效果:

设备 原始FPS TensorRT加速后
Jetson Nano 8.2 15.7
RTX 3060 45 68

6.2 多线程处理方案

视频流处理架构:

class StreamProcessor:
    def __init__(self, rtsp_url):
        self.frame_queue = Queue(maxsize=3)
        self.stop_event = Event()
        
        # 视频采集线程
        self.cap_thread = Thread(target=self._capture)
        
        # 处理线程池
        self.workers = [Thread(target=self._process) 
                       for _ in range(2)]

    def _capture(self):
        while not self.stop_event.is_set():
            ret, frame = self.cap.read()
            if ret:
                self.frame_queue.put(frame)

7. 常见问题解决

7.1 误检问题排查

典型误检场景及解决方案:

  1. 下巴阴影误判为口罩:

    • 增加负样本(下巴特写图片)
    • 调整HSV色彩空间阈值
  2. 手持物品遮挡:

    • 添加"hand_with_object"辅助类别
    • 使用注意力机制增强模型鲁棒性

7.2 性能优化记录

实际调优过程中的发现:

  • 将输入分辨率从640降到512,速度提升40%而mAP仅下降2.1%
  • 使用NMS时设置iou_thres=0.45比默认0.5更适合密集场景
  • 启用half-precision后显存占用减少35%

8. 项目扩展方向

这套系统在实际部署后,我们又做了这些改进:

  1. 增加温度检测模块(通过热成像摄像头)
  2. 集成人脸识别门禁系统
  3. 开发移动端监控APP

一个有趣的发现:通过分析口罩佩戴数据,可以识别出入口的高峰时段,帮助优化人员调度。比如在上午8:00-9:00的打卡高峰期,系统会自动增加检测线程数。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐