人脸口罩检测:使用YOLOv5检测公共场所是否佩戴口罩

## 1. 准备工作

首先,我们需要安装YOLOv5和相关库。请参考以下步骤:

1. 创建一个虚拟环境并激活它:

python -m venv venv
source venv/bin/activate

2. 克隆YOLOv5仓库并安装相关库:

git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

## 2. 数据收集和标注

为了训练YOLOv5模型,我们需要收集一些佩戴和未佩戴口罩的人脸照片。您可以从网络上下载相关数据集,也可以使用手机或相机拍摄照片。

收集完数据后,我们需要对图像进行标注。使用[labelImg](https://github.com/tzutalin/labelImg)等标注工具,对人脸和口罩进行标注。在标注过程中,请确保为每个目标分配一个唯一的类别ID(例如,0表示未佩戴口罩的人脸,1表示佩戴口罩的人脸)。

## 3. 训练YOLOv5模型

请按照以下步骤训练YOLOv5模型:

1. 将标注好的数据集按照YOLOv5的数据格式整理,并创建一个`dataset.yaml`文件,包含类别信息和数据集路径。

2. 选择一个YOLOv5模型(例如YOLOv5s)作为基本模型,并创建一个模型配置文件(例如`yolov5s_mask.yaml`)。

3. 运行以下命令进行模型训练:

python train.py --img 640 --batch 16 --epochs 300 --data dataset.yaml --cfg yolov5s_mask.yaml --weights yolov5s.pt

4. 在训练过程中,关注mAP等性能指标,并在训练完成后对模型进行评估和优化。

## 4. 人脸口罩检测

要实现人脸口罩检测,我们可以使用训练好的YOLOv5模型检测图像或视频中的人脸和口罩。以下是一个Python代码示例:

import cv2
import numpy as np
from yolov5 import YOLOv5

# 加载模型
model = YOLOv5("runs/train/exp/weights/best.pt")

# 读取图像
image = cv2.imread("test.jpg")

# 进行目标检测
results = model.detect(image)

# 在图像上绘制检测结果
for result in results:
    class_id = result["class_id"]
    bbox = result["bbox"]
    confidence = result["confidence"]

    if class_id == 0:  # 未佩戴口罩
        color = (0, 0, 255)
        label = f"未佩戴口罩: {confidence * 100:.1f}%"
    elif class_id == 1:  # 佩戴口罩
        color = (0, 255, 0)
        label = f"佩戴口罩: {confidence * 100:.1f}%"
    
    x1, y1, x2, y2 = bbox
    cv2.rectangle(image, (x1, y1), (x2, y2), color, 2)
    cv2.putText(image, label, (x1, y1 - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

# 显示结果图像
cv2.imshow("Mask Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于实时视频检测,可以将上述代码与OpenCV的VideoCapture一起使用,逐帧处理视频流。以下是一个实时视频检测的代码示例:

import cv2
import numpy as np
from yolov5 import YOLOv5

# 加载模型
model = YOLOv5("runs/train/exp/weights/best.pt")

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取一帧图像
    ret, frame = cap.read()

    # 进行目标检测
    results = model.detect(frame)

    # 在图像上绘制检测结果
    for result in results:
        class_id = result["class_id"]
        bbox = result["bbox"]
        confidence = result["confidence"]

        if class_id == 0:  # 未佩戴口罩
            color = (0, 0, 255)
            label = f"未佩戴口罩: {confidence * 100:.1f}%"
        elif class_id == 1:  # 佩戴口罩
            color = (0, 255, 0)
            label = f"佩戴口罩: {confidence * 100:.1f}%"
        
        x1, y1, x2, y2 = bbox
        cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)
        cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

    # 显示结果图像
    cv2.imshow("Mask Detection", frame)

    # 按'q'键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

至此,我们已经完成了一个基于YOLOv5的人脸口罩检测系统。通过此系统,我们可以检测公共场所中人们是否佩戴口罩。

## 5. 总结

本文介绍了如何使用YOLOv5实现人脸口罩检测。我们首先训练了一个YOLOv5模型来检测人脸和口罩,然后使用该模型处理图像和实时视频。这个系统可以帮助我们确保公共场所的人们保持社交距离和佩戴口罩。在未来的工作中,我们可以进一步优化模型性能,以提高检测精度和速度。

猜你喜欢

转载自blog.csdn.net/a871923942/article/details/130780349