下面的介绍是AI生成的,看看就好,主要以护目镜为例,项目的拉取链接放在文末
想要的直接取拿就行


用 YOLO11 + 自建数据集,打造一个「护目镜佩戴检测」AI 模型(从零到上线)

  • 实时检测现场人员是否佩戴护目镜

这篇文章完整展示:如何从零开始,构建一个 YOLO11 护目镜检测模型,包括:

  1. 数据集准备与划分
  2. YOLO 格式标注说明
  3. 模型训练(含 CPU 环境配置)
  4. 模型评估(Precision / Recall / mAP)
  5. 实际图片 & 视频推理演示思路


一、项目场景与目标

场景设定:

  • 现场监控视频/摄像头画面中,有人进入危险区域;
  • 要求这些人员必须佩戴护目镜;
  • 我们希望能自动检测画面中是否有人佩戴护目镜,如果检测到,给出框选提示(如画面上叠加检测框)。

本项目目标:

  • 只检测一个类别:护目镜(goggles)
  • 输入:任意现场图片或视频帧
  • 输出:标框 + 置信度

在实现上,我们采用 YOLO11 的 Nano 模型(yolo11n),原因是:

  • 模型足够轻量,方便在 CPU 上训练和推理
  • Ultralytics 接口统一、易于上手
  • 生态成熟,有大量文档与工具

二、数据集准备:自建护目镜检测数据集

项目中,我们将护目镜的数据集统一放在:

D:\数据集标注\护目镜\
├── images\
│   ├── 0001.jpg
│   ├── 0002.jpg
│   └── ...
└── labels\
    ├── 0001.txt
    ├── 0002.txt
    └── ...
  • images/:存放所有图片(原始采集的现场画面、截图等)
  • labels/:对应 YOLO 格式的标注文件
  • 命名规则:0001.jpg 对应 0001.txt,一一对应

YOLO 标注格式回顾

YOLO 的每一行标注格式为:

<class_id> <x_center> <y_center> <width> <height>
  • 坐标全部是 相对值(0~1),不是像素
  • 对于护目镜,我们只有一个类别,所以 class_id = 0
  • 若一张图上有多副护目镜,就写多行,每行一个框

一个示例标注(0001.txt

0 0.432125 0.515224 0.163451 0.087532

表示:

  • 类别 0(护目镜)
  • 中心点在整张图片相对坐标 (0.432, 0.515)
  • 宽度约 0.163,高度约 0.087

三、数据集划分:train / val / test

为了避免训练和测试混在一起,我们需要把数据集划分为:

  • 训练集(train):用于模型学习
  • 验证集(val):用于调参 & Early Stop
  • 测试集(test):用于最终评估

我们编写了一个小脚本,自动将 images/ 和 labels/ 按 7:2:1 划分为 train/val/test,并保持图像与标注文件一一对应。

# split_goggles_dataset.py
import shutil
from pathlib import Path
from sklearn.model_selection import train_test_split


def split_goggles_dataset(
    images_dir=r"D:\数据集标注\护目镜\images",
    labels_dir=r"D:\数据集标注\护目镜\labels",
    output_root=r"D:\数据集标注\护目镜_yolo_format",
    train_ratio=0.7,
    val_ratio=0.2,
    test_ratio=0.1,
    random_state=42,
):
    images_dir = Path(images_dir)
    labels_dir = Path(labels_dir)
    output_root = Path(output_root)

    assert abs(train_ratio + val_ratio + test_ratio - 1.0) < 1e-6

    # 收集所有图像文件
    exts = {".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff"}
    images = [p for p in images_dir.iterdir() if p.suffix.lower() in exts]
    print(f"共找到 {len(images)} 张图片")

    # 过滤有标注的
    valid_images = []
    for img in images:
        label = labels_dir / f"{img.stem}.txt"
        if label.exists():
            valid_images.append(img)
        else:
            print(f"⚠️ 无对应标注,跳过: {img.name}")

    print(f"可用图片: {len(valid_images)}")

    # 划分 train / temp
    train_imgs, temp_imgs = train_test_split(
        valid_images, train_size=train_ratio, random_state(random_state), shuffle=True
    )
    # 在 temp 中再划分 val / test
    val_ratio_adjusted = val_ratio / (val_ratio + test_ratio)
    val_imgs, test_imgs = train_test_split(
        temp_imgs, train_size=val_ratio_adjusted, random_state=random_state, shuffle=True
    )

    splits = {
        "train": train_imgs,
        "val": val_imgs,
        "test": test_imgs,
    }

    # 创建目录并拷贝文件
    for split_name, split_imgs in splits.items():
        img_out = output_root / "images" / split_name
        lbl_out = output_root / "labels" / split_name
        img_out.mkdir(parents=True, exist_ok=True)
        lbl_out.mkdir(parents=True, exist_ok=True)

        for img_path in split_imgs:
            label_path = labels_dir / f"{img_path.stem}.txt"
            shutil.copy2(img_path, img_out / img_path.name)
            shutil.copy2(label_path, lbl_out / label_path.name)

        print(f"{split_name}: {len(split_imgs)} 张图片")

    # 生成 YOLO data.yaml
    yaml_path = output_root / "data.yaml"
    yaml_content = f"""path: {output_root.as_posix()}
train: images/train
val: images/val
test: images/test

nc: 1
names:
  0: goggles
"""
    with open(yaml_path, "w", encoding="utf-8") as f:
        f.write(yaml_content)

    print(f"✅ 数据集划分完成,配置文件: {yaml_path}")


if __name__ == "__main__":
    split_goggles_dataset()

执行:

python split_goggles_dataset.py

执行后,你会得到:

D:\数据集标注\护目镜_yolo_format\
├── images\
│   ├── train\
│   ├── val\
│   └── test\
├── labels\
│   ├── train\
│   ├── val\
│   └── test\
└── data.yaml

这就是 YOLO 官方推荐的数据集组织结构。


四、模型训练:基于 YOLO11 Nano(yolo11n)

我们使用 Ultralytics 的 YOLO11 接口进行训练。为了照顾大多数没有 GPU 的环境,特别准备了 CPU 训练版本

安装依赖

pip install ultralytics

训练脚本

# train_goggles_model.py
from ultralytics import YOLO
from pathlib import Path


def train_goggles_model():
    data_yaml = r"D:\数据集标注\护目镜_yolo_format\data.yaml"
    if not Path(data_yaml).exists():
        print(f"❌ data.yaml 未找到: {data_yaml}")
        return

    print("🚀 开始训练护目镜检测模型...")

    # 加载 YOLO11 Nano 预训练模型
    model = YOLO("yolo11n.pt")

    results = model.train(
        data=data_yaml,
        epochs=80,          # 视数据量/硬件可调整
        imgsz=640,
        batch=8,           # CPU 可适当调小
        device="cpu",      # 若有 GPU 可改为 0
        workers=2,
        name="goggles_detection",
        project="runs/detect",

        # 适度数据增强
        hsv_h=0.015,
        hsv_s=0.7,
        hsv_v=0.4,
        translate=0.1,
        scale=0.5,
        fliplr=0.5,
        mosaic=1.0,
        mixup=0.0,

        patience=20,       # 早停
        save=True,
        plots=True,
        verbose=True,
    )

    print("\n✅ 训练完成!")
    print("最佳模型保存路径:runs/detect/goggles_detection/weights/best.pt")
    return results


if __name__ == "__main__":
    train_goggles_model()

运行:

python train_goggles_model.py

训练过程中,YOLO 会自动输出损失曲线、PR 曲线、混淆矩阵等图表,保存在 runs/detect/goggles_detection/ 目录下。


五、模型评估:Precision、Recall、mAP

训练完成后,我们需要在 测试集 上评估模型质量,而不是用训练集自嗨。

# eval_goggles_model.py
from ultralytics import YOLO
from pathlib import Path


def eval_goggles_model():
    model_path = r"runs/detect/goggles_detection/weights/best.pt"
    data_yaml = r"D:\数据集标注\护目镜_yolo_format\data.yaml"

    if not Path(model_path).exists():
        print(f"❌ 模型文件不存在: {model_path}")
        return

    model = YOLO(model_path)

    print("📊 在测试集上评估模型性能...")
    metrics = model.val(
        data=data_yaml,
        split="test",  # 使用我们划分好的 test 集
        imgsz=640,
        batch=8,
        device="cpu",  # GPU 则改为 0
    )

    print("\n📈 评估结果(test 集):")
    print(f"mAP50:      {metrics.box.map50:.4f}")
    print(f"mAP50-95:   {metrics.box.map:.4f}")
    print(f"Precision:  {metrics.box.mp:.4f}")
    print(f"Recall:     {metrics.box.mr:.4f}")

    print("\n详细评估图表保存在:runs/detect/val/(或训练对应目录下)")


if __name__ == "__main__":
    eval_goggles_model()

执行:

python eval_goggles_model.py

你会得到类似这样的指标(举例):

mAP50:      0.93
mAP50-95:   0.78
Precision:  0.91
Recall:     0.89
  • 若需要尽量避免误报(宁愿漏检也不要误检),就关注 Precision
  • 若需要尽量不漏掉没有戴护目镜的人,就关注 Recall
  • mAP50-95 反映整体检测能力,可以作为综合指标

六、实际推理:图片 & 视频上的护目镜检测

训练好的模型不仅可以评估,还可以直接用于推理。

1. 图片推理示例

# demo_infer_images.py
from ultralytics import YOLO
from pathlib import Path


def demo_infer_images():
    model_path = r"runs/detect/goggles_detection/weights/best.pt"
    model = YOLO(model_path)

    source_dir = Path(r"D:\数据集标注\护目镜\demo_images")  # 放一些待测试图片
    output_dir = Path("runs/detect/goggles_demo_images")

    for img in source_dir.glob("*.jpg"):
        print(f"检测:{img.name}")
        model.predict(
            source=str(img),
            save=True,
            project=str(output_dir),
            name="",
            exist_ok=True,
            conf=0.25,    # 置信度阈值
        )

    print(f"✅ 结果已保存到:{output_dir}")


if __name__ == "__main__":
    demo_infer_images()

输出的图片会自动叠加检测框和置信度,非常适合演示和效果展示。

2. 视频推理示例(比如监控画面或现场视频)

# demo_infer_video.py
from ultralytics import YOLO
from pathlib import Path


def demo_infer_video():
    model_path = r"runs/detect/goggles_detection/weights/best.pt"
    model = YOLO(model_path)

    video_path = r"D:\数据集标注\护目镜\demo_video\scene1.mp4"
    output_dir = Path("runs/detect/goggles_demo_video")

    model.predict(
        source=video_path,
        save=True,
        project=str(output_dir),
        name="scene1",
        exist_ok=True,
        conf=0.25,
    )

    print(f"✅ 视频检测结果保存在:{output_dir / 'scene1'}")


if __name__ == "__main__":
    demo_infer_video()

这一步就把模型从“论文里走出来”,变成真正可用的工具。


七、可以落地在哪些场景?

这个护目镜检测模型,本质上是一个 “单类别目标检测” 模型,适合在以下场景中扩展和复用:

  • 工业现场:检测护目镜、安全帽、反光衣等 PPE(Personal Protective Equipment)
  • 实验室:实验人员是否佩戴护目镜、手套、口罩
  • 建筑工地:识别安全防护用品的佩戴情况
  • 学校/培训:用于教学演示,帮助学生理解计算机视觉项目从零到一的全过程

仅需替换数据集,就可以很快构建出新的安全检测模型。


八、总结:从「数据」到「模型」的闭环

这次护目镜检测项目,完整走了一遍:

  1. 收集 & 标注护目镜数据(YOLO 格式)
  2. 按 7:2:1 划分 train/val/test
  3. 使用 YOLO11 Nano 在 CPU 上训练
  4. 在测试集上评估 Precision / Recall / mAP
  5. 在图片、视频上实际推理验证效果


具体项目的细节参见我项目中发布的readme文档

前端页面展示如下




项目地址

https://github.com/kyf666plus/yolo11-.git

主页还有其他个人制作的小工具
kyf666plus

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐