基于YOLOv8的戴口罩人脸检测与识别:从数据准备到模型部署全流程
1. 项目概述与核心价值最近在整理一些过往的实战项目发现一个在特定时期需求非常旺盛且技术通用性很强的课题基于PyTorch的戴口罩人脸检测与识别。这不仅仅是2020-2022年间的热点其技术内核——在复杂遮挡条件下进行鲁棒的目标检测与属性分类——在安防、智慧通行、医疗辅助乃至今天的多模态交互场景中依然有很高的研究与应用价值。很多朋友在入门计算机视觉时会从经典的人脸检测、车牌识别做起但往往止步于“干净”的数据集。一旦遇到像口罩这样的半遮挡模型性能就会急剧下降。这个项目正好能带你跨过这道坎理解如何让模型学会“看见”被遮挡的部分并做出准确判断。简单来说这个项目要完成两件事第一检测出图像或视频中的所有人脸无论他们是否佩戴口罩第二对检测到的每张人脸判断其是否佩戴了口罩。这本质上是一个“目标检测”加“细粒度分类”的组合任务。我选择PyTorch作为框架一是因为其动态图机制和清晰的API设计非常适合研究和快速迭代二是因为基于它构建的YOLO系列等检测框架生态繁荣便于我们站在巨人肩膀上实现。本文将手把手带你完成从数据集准备、模型选型与训练到最终部署测试的全流程并提供完整的训练代码和一个我处理过的戴口罩人脸数据集。2. 技术方案选型与整体设计思路面对“戴口罩人脸检测与识别”这个任务技术路径有多种选择。我们需要权衡精度、速度、实现难度和泛化能力选择一个最适合个人学习和中等规模应用落地的方案。2.1 核心任务拆解One-Stage vs. Two-Stage最直观的想法是分两步走先用一个人脸检测器如MTCNN, RetinaFace框出所有人脸再用一个口罩分类器如ResNet, MobileNet对每个裁剪出的人脸区域进行分类。这是经典的Two-Stage两阶段方法。它的优点是模块清晰可以分别优化两个子任务例如使用在 WiderFace 上预训练好的高精度人脸检测器。但缺点也明显流程繁琐速度较慢且两个模块的误差会累积。我更倾向于One-Stage单阶段方法即使用一个端到端的模型直接输出人脸框的位置以及该人脸是否戴口罩的类别。这在工业界是更主流的选择因为它更高效。在PyTorch生态中YOLOYou Only Look Once系列是单阶段检测器的杰出代表。YOLOv5/v8 以其出色的速度-精度平衡和极其友好的工程化设计完善的训练、验证、导出流水线而广受欢迎。因此本项目核心将采用 YOLO 架构来实现端到端的戴口罩人脸检测与识别。2.2 模型选择为何是YOLOv8在YOLO系列中YOLOv5和YOLOv8都是优秀的选择。我最终选择YOLOv8作为本项目的基石主要基于以下几点考量架构先进性YOLOv8 采用了新的骨干网络和特征融合设计在相同参数量下通常能获得比YOLOv5更优的精度尤其是在处理小目标和遮挡目标时其表现更稳健。任务灵活性YOLOv8 原生支持检测、分割、分类、姿态估计等多种任务。其检测模型输出本身就包含边界框bbox、置信度confidence和类别class。我们只需要将类别定义为“戴口罩人脸”和“未戴口罩人脸”即可非常契合我们的需求。生态与易用性Ultralytics 公司维护的ultralytics库提供了从安装、训练到部署的全套工具链API设计简洁明了文档丰富大大降低了开发门槛。其提供的预训练模型在COCO等大型数据集上训练是极佳的迁移学习起点。部署友好YOLOv8 模型可以轻松导出为 ONNX、TensorRT、OpenVINO 等多种格式方便在不同硬件平台从服务器到边缘设备上进行部署这对于项目落地至关重要。2.3 数据流与系统设计整个项目的Pipeline可以概括为以下流程输入图像或视频帧。预处理图像缩放、归一化等YOLO训练和推理时会自动处理。模型推理YOLOv8模型前向传播。后处理解码将模型输出的特征图解码为实际的边界框坐标、置信度和类别概率。非极大值抑制NMS过滤掉重叠的、低置信度的冗余框保留最可能的人脸框。输出对于每个保留的框输出其坐标[x1, y1, x2, y2]、置信度conf和类别cls0: 戴口罩 1: 未戴口罩。这个设计将两个任务完美融合一次推理即可得到所有结果效率极高。3. 数据集准备与关键处理技巧“巧妇难为无米之炊”高质量的数据集是模型成功的基石。对于戴口罩识别这个任务数据的质量、多样性和标注的准确性至关重要。3.1 数据集来源与构建网络上可以找到一些开源的戴口罩人脸数据集例如MFDD、MAFA但往往存在数据量不足、场景单一、标注格式不统一等问题。一个鲁棒的模型需要覆盖各种场景光照变化强光、逆光、昏暗环境。遮挡多样性不同类型的口罩医用外科、N95、布口罩、不同的佩戴方式规范、露出鼻子、挂在下巴。人脸姿态正面、侧面、俯仰角。背景复杂度室内、室外、人群密集场景。我提供的数据集是通过以下方式构建的开源数据收集整合了多个公开数据集中相关部分。网络爬取与清洗在遵守法律法规和版权的前提下定向爬取了一些公开场景图片并进行了严格的人工清洗去除非人脸图片和低质量图片。数据增强合成使用生成技术在现有无口罩人脸数据上“贴”上各种口罩以扩充“戴口罩”类别的数据并确保姿态和光照的多样性。这种方法能快速生成大量可控的样本但需注意生成图像的逼真度最好与真实图像混合使用。 数据集最终包含约 15,000 张图像按 8:1:1 的比例随机划分为训练集、验证集和测试集。3.2 数据标注格式YOLO格式详解YOLO系列使用的是一种简洁的标注格式。对于每一张图片都有一个同名的.txt标注文件。文件每一行代表一个目标物体格式为class_id x_center y_center width heightclass_id类别索引从0开始。我们定义0为“戴口罩人脸”1为“未戴口罩人脸”。x_center y_center width height边界框的中心点坐标和宽高这些值都是相对于图片宽度和高度的归一化值范围在[0, 1]之间。计算示例假设一张图片宽w640高h480图片中有一个戴口罩的人脸其真实框的左上角坐标为(100, 50)右下角坐标为(300, 400)。中心点 x 坐标x_center (100 300) / 2 / 640 400 / 2 / 640 0.3125中心点 y 坐标y_center (50 400) / 2 / 480 450 / 2 / 480 0.46875框的宽度width (300 - 100) / 640 200 / 640 0.3125框的高度height (400 - 50) / 480 350 / 480 ≈ 0.72917因此该标注行应为0 0.3125 0.46875 0.3125 0.72917注意务必确保你的标注工具如LabelImg、CVAT、Roboflow能导出或转换为这种格式。标注的准确性直接影响模型性能特别是对于口罩边缘的界定要清晰一致。3.3 数据增强策略为了提升模型的泛化能力防止过拟合必须在训练中应用数据增强。YOLOv8的训练流程内置了强大的增强功能我们主要通过配置文件来调整。以下是一些关键策略及其作用基础空间增强随机水平翻转hsv_h模拟镜像视角简单有效。随机旋转degrees小角度的随机旋转如-10, 10度增加姿态鲁棒性。随机缩放与裁剪scale模拟不同距离下的人脸大小。颜色与成像增强HSV色彩空间扰动hsv_h,hsv_s,hsv_v随机调整色调、饱和度和明度模拟不同光照和白平衡条件。这对口罩颜色蓝、白、黑等的泛化很重要。高斯模糊与噪声模拟图像质量下降的情况。遮挡与混合增强Mosaic增强将四张训练图像拼接成一张让模型在单张图中学习不同尺度、上下文的目标。这是YOLO系列提升小目标检测性能的关键技术。MixUp增强将两张图像线性混合其标签也对应混合。这能鼓励模型进行更平滑的预测提升鲁棒性。随机遮挡cutout随机擦除图像中的矩形区域强制模型不依赖于局部的局部特征如下半张脸这对于口罩遮挡任务有奇效能让模型更关注眼睛、额头等上半部特征。在ultralytics的配置文件中你可以像这样调整args.yaml或直接在训练命令中# 数据增强参数示例 augment: true hsv_h: 0.015 # 色调扰动幅度 hsv_s: 0.7 # 饱和度扰动幅度 hsv_v: 0.4 # 明度扰动幅度 degrees: 10.0 # 旋转角度范围 translate: 0.1 # 平移幅度 scale: 0.5 # 缩放幅度 shear: 0.0 # 剪切幅度 perspective: 0.0 # 透视变换幅度 flipud: 0.0 # 上下翻转概率 fliplr: 0.5 # 左右翻转概率 mosaic: 1.0 # Mosaic增强概率 (1.0表示100%使用) mixup: 0.0 # MixUp增强概率 (可设置为0.2) copy_paste: 0.0 # 复制粘贴增强概率4. 环境搭建与模型训练实操接下来我们进入实战环节。我将假设你有一台配备NVIDIA GPU的电脑并已安装好CUDA和cuDNN。4.1 环境配置与依赖安装首先创建一个独立的Conda环境以避免包冲突然后安装关键依赖。# 1. 创建并激活conda环境以Python 3.9为例 conda create -n mask_detection python3.9 -y conda activate mask_detection # 2. 安装PyTorch请根据你的CUDA版本去PyTorch官网选择对应命令 # 例如CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 安装ultralytics库包含YOLOv8 pip install ultralytics # 4. 安装其他可能用到的工具 pip install opencv-python matplotlib pandas seaborn tqdm Pillow验证安装import torch print(torch.__version__) print(torch.cuda.is_available()) # 应返回True from ultralytics import YOLO print(YOLO) # 应能正常导入4.2 数据集目录结构组织将你的数据集组织成如下结构这是ultralytics框架的推荐格式mask_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片可选用于最终评估 └── labels/ ├── train/ # 训练集标签.txt文件 ├── val/ # 验证集标签 └── test/ # 测试集标签然后创建一个数据集配置文件mask_dataset.yaml放在项目根目录# mask_dataset.yaml path: /path/to/your/mask_dataset # 数据集的根目录 train: images/train # 训练集路径相对于path val: images/val # 验证集路径 test: images/test # 测试集路径可选 # 类别数量和名称 nc: 2 # 类别数戴口罩、未戴口罩 names: [masked_face, unmasked_face] # 类别名称顺序对应class_id 0和14.3 模型训练与参数调优使用ultralytics的API进行训练非常简单。你可以编写一个Python脚本train.pyfrom ultralytics import YOLO # 加载一个预训练模型这里使用YOLOv8nnano版本速度最快适合快速验证 # 你也可以选择 yolov8s.pt, yolov8m.pt 等更大模型以获得更高精度 model YOLO(yolov8n.pt) # 开始训练 results model.train( datamask_dataset.yaml, # 数据集配置文件路径 epochs100, # 训练轮数根据数据集大小调整通常100-300轮 imgsz640, # 输入图像尺寸YOLOv8常用640 batch16, # 批次大小根据GPU内存调整-1为自动批处理 workers8, # 数据加载线程数 device0, # 使用GPU 0如果是CPU则设为 cpu projectruns/train, # 训练结果保存目录 namemask_detection_v1, # 实验名称 pretrainedTrue, # 使用预训练权重 optimizerSGD, # 优化器可选SGD, Adam, AdamW等 lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 (lr0 * lrf) momentum0.937, # SGD动量 weight_decay0.0005, # 权重衰减 warmup_epochs3.0, # 学习率预热轮数 warmup_momentum0.8, # 预热期动量 box7.5, # 边界框损失权重 cls0.5, # 分类损失权重 dfl1.5, # DFL损失权重YOLOv8特有 hsv_h0.015, # 图像HSV-色调增强fraction hsv_s0.7, # 图像HSV-饱和度增强fraction hsv_v0.4, # 图像HSV-明度增强fraction degrees10.0, # 图像旋转/- deg translate0.1, # 图像平移/- fraction scale0.5, # 图像缩放/- gain fliplr0.5, # 图像水平翻转概率probability mosaic1.0, # 图像马赛克增强概率probability mixup0.0, # 图像MixUp增强概率probability copy_paste0.0, # 图像复制粘贴增强概率probability erasing0.4, # 随机擦除概率probability crop_fraction1.0, # 图像裁剪比例 save_period-1, # 每N轮保存一次检查点-1为仅保存最后一轮 seed42, # 随机种子确保可复现性 deterministicTrue, # 确定性模式保证可复现性 verboseTrue, # 打印训练信息 )关键参数解析与调优经验imgsz输入分辨率。更高的分辨率如1280能提升小目标检测精度但会显著增加显存消耗和训练时间。对于人脸检测640通常是一个很好的平衡点。batch批次大小。在GPU内存允许的情况下尽可能调大这能使训练更稳定。如果遇到内存不足OOM错误可以减小batch或imgsz。optimizer与lr0对于小数据集Adam优化器可能收敛更快对于较大数据集SGD配合动量momentum通常能收敛到更好的最优点。学习率lr0是最关键的参数之一。如果训练损失不下降或出现NaN首先尝试降低学习率例如从0.01降到0.001。mosaic和mixup强大的增强手段但有时在训练初期可能导致不稳定。如果发现前期损失震荡剧烈可以尝试在训练前半程关闭mosaic和mixup这需要修改底层代码或使用回调函数或在后期再开启。device多卡训练可以设置为device[0,1]。训练开始后控制台会输出损失曲线、学习率变化等信息。所有训练日志、权重文件、评估结果都会保存在runs/train/mask_detection_v1/目录下。4.4 训练过程监控与评估训练过程中最重要的监控工具是TensorBoard或Ultralytics 自带的日志。在训练目录下你可以找到events.out.tfevents.*文件用TensorBoard加载tensorboard --logdir runs/train/mask_detection_v1然后浏览器打开localhost:6006。重点关注以下曲线损失曲线train/box_loss,train/cls_loss等应随着训练轮数平稳下降最终趋于平缓。验证集损失val/box_loss应与训练集损失趋势一致且数值接近如果验证损失开始上升而训练损失下降可能是过拟合的迹象。评估指标训练结束后模型会自动在验证集上评估生成一系列关键指标mAP50(Mean Average Precision at IoU0.5)最常用的目标检测评估指标。值在0到1之间越接近1越好。它衡量的是模型在不同置信度阈值下对“戴口罩”和“未戴口罩”两个类别的平均检测精度。mAP50-95在IoU阈值从0.5到0.95步长0.05上计算的平均mAP是更严格的指标。precision和recall精确率和召回率。高精确率意味着模型预测的“戴口罩”框中确实是戴口罩的比例高误报少高召回率意味着实际所有戴口罩的人脸被模型找出来的比例高漏报少。通常需要在两者间权衡。在runs/train/mask_detection_v1/目录下的results.csv文件包含了所有轮次的详细指标可以用Pandas和Matplotlib进行深入分析。5. 模型推理部署与性能优化训练出满意的模型后下一步就是用它来“干活”了。我们将进行单张图片、视频流乃至实时摄像头的推理并探讨如何优化性能。5.1 基础推理与结果可视化使用训练好的最佳权重通常是runs/train/mask_detection_v1/weights/best.pt进行推理非常简单from ultralytics import YOLO import cv2 # 加载自定义训练好的模型 model YOLO(runs/train/mask_detection_v1/weights/best.pt) # 单张图片推理 results model(path/to/test_image.jpg, saveTrue, imgsz640, conf0.25) # saveTrue 会保存带标注结果的图片到 runs/detect/predict/ # conf 是置信度阈值低于此值的预测框将被过滤 # 查看结果 for result in results: boxes result.boxes # 边界框对象 masks result.masks # 分割掩码本项目未用 keypoints result.keypoints # 关键点本项目未用 probs result.probs # 分类概率本项目未用 if boxes is not None: print(f检测到 {len(boxes)} 个人脸) for box in boxes: # 获取框坐标 (xyxy格式) x1, y1, x2, y2 box.xyxy[0].tolist() # 获取置信度 confidence box.conf[0].item() # 获取类别ID和名称 class_id int(box.cls[0].item()) class_name model.names[class_id] print(f - 类别: {class_name}, 置信度: {confidence:.2f}, 位置: [{x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}]) # 视频文件推理 model.predict(path/to/input_video.mp4, saveTrue, imgsz640, conf0.25, streamTrue) # streamTrue 更高效处理视频 # 实时摄像头推理摄像头索引通常为0 # for frame in model.predict(source0, showTrue, streamTrue, imgsz640, conf0.25): # # 这里可以添加自定义处理逻辑如计数、报警等 # pass5.2 性能优化技巧加速推理当需要部署到资源受限的边缘设备或要求高帧率时模型推理速度至关重要。以下是几种有效的优化方法模型轻量化训练时直接选择更小的模型变体如YOLOv8n(nano) 或YOLOv8s(small)。它们精度略有牺牲但速度大幅提升。降低输入分辨率推理时减小imgsz参数如从640降到320能成倍减少计算量但对小目标检测能力有影响需权衡。提高置信度阈值提高conf参数如从0.25到0.5过滤掉更多低置信度的预测减少后续NMS等后处理的计算量。模型导出与加速将PyTorch模型导出为更高效的推理格式。导出为ONNXONNX是一种开放的模型交换格式可以被多种推理引擎支持。model.export(formatonnx, imgsz640, simplifyTrue, opset12)使用TensorRT加速NVIDIA GPUTensorRT是NVIDIA的高性能深度学习推理SDK。你可以将ONNX模型用TensorRT进一步优化和序列化获得极致的GPU推理速度。# 使用ultralytics内置导出需要已安装TensorRT model.export(formatengine, imgsz640) # 或者使用trtexec工具手动转换使用OpenVINO加速Intel CPU/GPUOpenVINO是Intel的推理优化工具套件能显著提升在Intel平台上的性能。model.export(formatopenvino, imgsz640)批处理Batch Inference如果一次需要处理多张图片使用批处理能更充分地利用GPU并行计算能力。model.predict()支持传入一个图片路径列表。5.3 部署示例简单的实时检测系统结合OpenCV我们可以快速搭建一个实时戴口罩人脸检测系统import cv2 from ultralytics import YOLO import time # 加载模型 model YOLO(runs/train/mask_detection_v1/weights/best.pt) # 打开摄像头 cap cv2.VideoCapture(0) # 0 表示默认摄像头 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 定义类别颜色 class_colors { 0: (0, 255, 0), # 戴口罩 - 绿色 1: (0, 0, 255) # 未戴口罩 - 红色 } print(开始实时检测按 q 键退出...) fps_start_time time.time() fps_frame_count 0 while True: ret, frame cap.read() if not ret: break # 进行推理 results model(frame, imgsz640, conf0.4, verboseFalse)[0] # verboseFalse关闭控制台输出 # 解析结果并绘制 if results.boxes is not None: for box in results.boxes: x1, y1, x2, y2 map(int, box.xyxy[0].tolist()) conf box.conf[0].item() cls_id int(box.cls[0].item()) label f{model.names[cls_id]} {conf:.2f} # 绘制边界框和标签 color class_colors.get(cls_id, (255, 255, 255)) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # 计算并显示FPS fps_frame_count 1 if fps_frame_count 30: fps fps_frame_count / (time.time() - fps_start_time) cv2.putText(frame, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2) fps_start_time time.time() fps_frame_count 0 # 显示画面 cv2.imshow(Mask Detection, frame) # 退出条件 if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这个简单的脚本实现了实时视频流处理、结果可视化用绿框标出戴口罩红框标出未戴口罩和FPS显示你可以在此基础上增加人数统计、报警提示、日志记录等功能。6. 常见问题排查与实战心得在实际开发和训练过程中你几乎一定会遇到各种问题。这里我总结了一些典型问题及其解决方案希望能帮你少走弯路。6.1 训练阶段常见问题问题1训练损失Loss不下降或者下降非常缓慢。可能原因与排查学习率过高或过低这是最常见的原因。过高的学习率可能导致损失在最优值附近震荡甚至发散过低则收敛极慢。解决方案尝试将lr0降低一个数量级如从0.01调到0.001或使用学习率查找器LR Finder可惜YOLOv8内置训练暂时没有直接接口但你可以先用小批量数据跑几个epoch观察损失趋势。数据或标注有问题检查数据集路径是否正确图片是否能正常读取标注文件.txt是否与图片一一对应且格式正确特别是归一化坐标是否在[0,1]区间内。解决方案使用ultralytics的YOLO(your_model.pt).val(datayour_dataset.yaml)先验证一下数据加载是否正常。模型架构或预训练权重不匹配如果你修改了模型类别数但未正确初始化输出层可能导致训练困难。解决方案使用YOLO(yolov8n.pt)加载预训练模型时框架会自动根据你的数据集yaml文件中的nc调整输出层通常无需手动干预。确保你的mask_dataset.yaml中nc: 2设置正确。批次大小Batch Size太小在资源允许下增大batch可以使梯度估计更准确训练更稳定。如果GPU内存不足导致batch只能设为1或2可以尝试使用梯度累积Gradient Accumulation但YOLOv8原生训练脚本未直接暴露此参数可能需要修改底层代码。问题2验证集损失val loss远高于训练损失或mAP很低模型过拟合。可能原因与排查训练数据量太少或多样性不足模型记住了训练集的特有噪声无法泛化。解决方案增加数据量或加强数据增强如提高mosaic,mixup概率增加hsv扰动幅度。使用我提供的经过增强处理的数据集是一个好的起点。模型过于复杂对于小数据集使用YOLOv8x这样的大模型很容易过拟合。解决方案换用更小的模型如YOLOv8n或YOLOv8s并增加正则化如提高weight_decay。训练轮数过多模型在训练集上继续优化但在验证集上性能开始下降。解决方案使用早停Early Stopping。ultralytics训练有内置的早停机制patience参数当验证集指标在连续patience个epoch没有提升时会自动停止训练。在训练命令中加入patience50试试。问题3训练时出现CUDA out of memory (OOM) 错误。解决方案减小batch大小。减小imgsz输入图像尺寸。使用更小的模型变体如从yolov8m.pt换到yolov8s.pt。检查是否有其他程序占用了大量显存。在训练命令中尝试ampTrue自动混合精度训练这可以显著减少显存占用并可能加速训练。6.2 推理阶段常见问题问题1模型推理速度慢FPS低。解决方案参考第5.2节的性能优化技巧。首先尝试导出为TensorRT或OpenVINO格式。在我的测试中将PyTorch模型转为TensorRT引擎后在相同GPU上推理速度常有2-5倍的提升。问题2漏检特别是远处的小人脸或遮挡严重的人脸。解决方案降低置信度阈值推理时降低conf参数如从0.25降到0.1让更多候选框进入后续处理。调整NMS参数YOLO推理后处理中的NMS非极大值抑制可能会误删一些正确但重叠的框。可以尝试调整iou参数在model.predict()中是iou稍微放宽IOU阈值如从默认的0.7降到0.5。但要注意这可能会增加误报。使用更高分辨率的模型训练时使用更大的imgsz如1280或者使用专门针对小目标优化过的模型变体虽然YOLOv8没有官方的小目标专用版但可以尝试修改特征融合网络。增加针对小目标和遮挡的数据在数据集中刻意增加更多小尺寸人脸和戴口罩方式不规范半遮挡的样本。问题3误检将非人脸物体检测为人脸或将其他遮挡物误判为口罩。解决方案提高置信度阈值增加conf参数过滤掉低置信度的预测。完善数据集检查误检的物体如果频繁出现应将这些负样本不包含目标的背景图或难例加入训练集并标注为背景类别在YOLO中不标注即可模型会学习将其视为背景。后处理规则根据业务逻辑添加规则。例如人脸框的宽高比通常在一定范围内可以过滤掉极端比例的框或者可以添加一个基于人脸关键点如眼睛、鼻子的简单验证器如果检测不到关键点则否决该人脸框。6.3 实战心得与技巧迭代式数据清洗模型训练一次后在验证集上运行推理手动检查那些预测错误的样本漏检、误检、分类错误。把这些“难例”找出来修正它们的标注或者作为新的训练数据加入下一轮训练。这个过程往往比盲目调整模型参数更有效。利用预训练权重千万不要从零开始训练使用在COCO等大型数据集上预训练的yolov8n.pt等权重进行迁移学习能极大加快收敛速度并提升最终性能。预训练模型已经学会了提取通用视觉特征的能力。关注类别平衡检查你的数据集中“戴口罩”和“未戴口罩”两类样本的数量是否大致平衡。如果严重失衡例如90% vs 10%模型可能会偏向多数类。可以通过数据采样权重或损失函数中的类别权重来缓解。保存最佳和最后模型训练时ultralytics默认会保存最后一代的模型last.pt和在验证集上表现最好的模型best.pt。务必使用best.pt进行最终的评估和部署因为它代表了泛化能力最强的状态。实验记录每次调整超参数学习率、数据增强强度等进行训练时建议使用明确的实验命名如mask_detection_lr0.001_mosaic1.0并记录关键的训练配置和最终评估指标。这能帮助你系统地找到最优配置。可以使用工具如Weights Biases或MLflow但简单的文本记录也足够有效。