摘要:
合集:AI案例-CV-建筑业
数据集:Roboflow2023安全帽数据集
数据集价值:检测和识别工人佩戴安全帽的情况
AI问题:目标检测
解决方案:Yolo8
一、问题描述
Roboflow 提供的安全帽数据集是一种用于计算机视觉任务的开源数据集,专注于检测和识别工人佩戴安全帽的情况,主要用于工业安全和建筑场景。该数据集通常包含了多种场景下不同姿势、角度和光照条件下的安全帽图像。这些图像已标注,有助于机器学习模型学习如何识别和区分佩戴和未佩戴安全帽的情况。
基于Yolo8(YOLOv8)算法的安全帽识别是一种利用深度学习技术来检测图像中是否有人佩戴安全帽的方法。YOLO(You Only Look Once)系列算法以其高效、实时的目标检测能力而闻名。
二、数据集内容
关键信息
创建人:Roboflow是一家总部位于德国柏林的初创公司,成立于2018年。Roboflow是一个基于云端的自动化标注平台,专为机器学习项目提供高质量的数据标注服务。
发布时间:2023年2月
图像样本:数据集中包括各种工人佩戴或不佩戴安全帽的场景,覆盖了不同环境、天气和光照条件。
标注信息:每张图片中的安全帽和工人头部都被标注了位置框和类别标签,以表明是否佩戴了安全帽。
类别:一般有两个类别 - “佩戴安全帽”和“未佩戴安全帽”,有的版本还会细分安全帽颜色,以区分不同岗位。
应用场景:
1)建筑工地:实时监测工人是否佩戴安全帽,保障施工安全。
2)工业生产:在制造车间或工厂中,确保员工按照规定佩戴安全装备。
3)智能监控:结合安全帽检测技术,用于智能监控系统的危险预警。
数据结构
safehat.yaml配置三个路径,分别对应训练数据、验证数据、测试数据的地址
# 模型训练时使用的yam1配置文件。该文件说明了数据的地址和待训练的类别
# 配置三个路径,分别对应训练数据、验证数据、测试数据的地址
# 项目路径为工程文件当前路径: ./datasets/ai_data/css-data
# 训练数据:用于模型的训练
train: ./ai_data/css-data/train/images
# 验证数据:用于模型训练过程中的评估和参数调试
val: ./ai_data/css-data/valid/images
# 测试数据:用于模型预测
test: ./ai_data/css-data/test/images
# number of classes 训练检测类型总数
nc: 10
# class names
# ames:['0','1','2','3','4','5','6','7','8','9’]
# Hardhat-安全帽
# Mask-口罩
# No-Hardhat-无安全帽
# No-Mask-无口罩
# No-Safety Vest-无安全背心人
# Safety Cone-交通锥或警示锥
# Safety Cone
# Safety Vest-安全背心
# machinery -机械(挖掘机)
# vehicle-车辆
names: ['Hardhat', 'Mask', 'No-Hardhat', 'No-Mask', 'No-Safety Vest', 'Safety Cone', 'Safety Cone', 'Safety Vest', 'machinery', 'vehicle']
训练数据:用于模型的训练 train: ./ai_data/css-data/train/images 验证数据:用于模型训练过程中的评估和参数调试。验证数据在模型训练过程中用于调整模型参数和防止过拟合。它帮助评估模型在未见过的数据上的表现,并根据需要进行调整。 val: ./ai_data/css-data/valid/images 测试数据:用于模型预测 test: ./ai_data/css-data/test/images
训练数据标注定义:
第0列: class_id: 类型编号
第1列: x_center: 边界框中心点x坐标
第2列: y_center: 边界框中心点y坐标
第3列: width: 边界框的宽度
第4列: height: 边界框的高度
标注数据样例:
8 0.790625 0.6828125 0.17421875 0.2625
9 0.7421875 0.1984375 0.125 0.29296875
0 0.58046875 0.38203125 0.01640625 0.0140625
5 0.5828125 0.45390625 0.03515625 0.15859375
7 0.3015625 0.49296875 0.02421875 0.05625
7 0.20234375 0.60859375 0.02421875 0.0390625
7 0.16171875 0.628125 0.02734375 0.06015625
7 0.1875 0.67421875 0.028125 0.06171875
0 0.16171875 0.57890625 0.01640625 0.01796875
0 0.203125 0.56953125 0.0171875 0.021875
0 0.3015625 0.44375 0.01484375 0.0203125
5 0.3015625 0.5203125 0.03125 0.178125
5 0.20234375 0.64375 0.02734375 0.17109375
5 0.18828125 0.703125 0.05 0.1703125
5 0.159375 0.66015625 0.0359375 0.1828125


数据集使用许可协议
非商业性使用的公共版权许可协议 CC BY 4.0(Creative Commons Attribution 4.0 International) 提供方: Roboflow (Roboflow is an end-to-end computer vision platform)
三、安全帽识别方案
注释:源码和数据集已经集成并支持运行。
主要AI框架:Ultralytics-Yolo8
运行环境要求
- python3.10
- conda
- yolo8.2
安装开发包
参考文章《安装深度学习框架PyTorch》,安装ultralytics的CPU版本或GPU版本。
conda create -n safehat python=3.10
conda init
conda activate safehat
# 安装PyTorch的CPU版或GPU版本
# 安装ultralytics
pip install ultralytics
# 通过 conda list 查询到 ultralytics 版本号
ultralytics 8.2.87 pypi_0 pypi
Ultralytics 是一个提供预训练 YOLO 模型、数据集和训练工具的开源框架,它简化了在 Python 环境中使用 YOLO 进行目标检测的过程。通过安装 Ultralytics,用户可以访问 YOLO 模型,包括 YOLOv8 等,并使用提供的工具进行模型的训练、验证和推理。
预训练模型
加载yolov8的预训练模型,这个模型是yolov8使用了coco数据集训练的通用目标检测模型, 我们将它作为基础模型,在该模型的基础上,训练安全帽模型: model = YOLO(‘yolov8n.pt’)
Ultralytics配置
在Ultralytics配置文件中配置AI训练数据集工作路径/datasets_dir,修改为本工程的数据集存储路径。
文件:C:\Users\<user>\AppData\Roaming\Ultralytics\settings.yaml
settings_version: 0.0.5
datasets_dir: D:\Dev\dev-Python\CV\AiS-Safety-Helmet-Detection\datasets
weights_dir: weights
runs_dir: runs
uuid: 74d596783a8aa93a07b24601104e0e69b7bea4c29b7e528db4196ed55900f3b2
sync: true
api_key: ''
openai_api_key: ''
clearml: true
comet: true
dvc: true
hub: true
mlflow: true
neptune: true
raytune: true
tensorboard: true
wandb: true
vscode_msg: true
训练数据
源码:yolo_train.py
from ultralytics import YOLO
def train_model():
# 加载yolov8的预训练模型,这个模型是yolov8使用了coco数据集训练的通用目标检测模型
# 我们将它作为基础模型,在该模型的基础上,训练安全帽模型
# 从 https://github.com/ultralytics/assets/releases 获取
model = YOLO('yolov8n.pt')
# 检查设备
print(f"Model is using device: {model.device}")
# 训练用户自定义的数据集,数据的配置保存在safehat.yaml中,epochs等于100表示100轮迭代
model.train(data='safehat.yaml', epochs=100)
# 使用验证集验证效果
model.val()
if __name__ == '__main__':
train_model()
在项目路径下执行: python yolo_train.py
CPU版运行结果
Model is using device: cpu
Ultralytics YOLOv8.2.87 🚀 Python-3.10.14 torch-2.3.1+cpu CPU (11th Gen Intel Core(TM) i5-1130G7 1.10GHz)
engine\trainer: task=detect, mode=train, model=yolov8n.pt, data=safehat.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1,
...
from n params module arguments
0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2]
1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2]
2 -1 1 7360 ultralytics.nn.modules.block.C2f [32, 32, 1, True]
3 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2]
4 -1 2 49664 ultralytics.nn.modules.block.C2f [64, 64, 2, True]
5 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2]
6 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True]
7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2]
8 -1 1 460288 ultralytics.nn.modules.block.C2f [256, 256, 1, True]
9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5]
10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1]
12 -1 1 148224 ultralytics.nn.modules.block.C2f [384, 128, 1]
13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1]
15 -1 1 37248 ultralytics.nn.modules.block.C2f [192, 64, 1]
16 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2]
17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1]
18 -1 1 123648 ultralytics.nn.modules.block.C2f [192, 128, 1]
19 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]
20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1]
21 -1 1 493056 ultralytics.nn.modules.block.C2f [384, 256, 1]
22 [15, 18, 21] 1 753262 ultralytics.nn.modules.head.Detect [10, [64, 128, 256]]
Model summary: 225 layers, 3,012,798 parameters, 3,012,782 gradients, 8.2 GFLOPs
Transferred 319/355 items from pretrained weights
Freezing layer 'model.22.dfl.conv.weight'
train: Scanning .\datasets\ai_data\css-data\train\labels... 2605 images, 6 backgrounds, 0 corrupt: 100%|██████████| 2605/2605
train: WARNING ⚠️ .\datasets\ai_data\css-data\train\images\004720_jpg.rf.afc486560a4004c7cfd67910af31a29c.jpg: 1 duplicate labels removed
train: WARNING ⚠️ .\datasets\ai_data\css-data\train\images\construction-813-_jpg.rf.b085952261fd98f2e76b8065de149b5f.jpg: 1 duplicate labels removed
train: New cache created: .\datasets\ai_data\css-data\train\labels.cache
val: Scanning .\datasets\ai_data\css-data\valid\labels... 114 images, 10 backgrounds, 0 corrupt: 100%|██████████| 114/114 [00:
val: New cache created: .\datasets\ai_data\css-data\valid\labels.cache
Plotting labels to runs\detect\train2\labels.jpg...
optimizer: 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically...
optimizer: AdamW(lr=0.000714, momentum=0.9) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.0005), 63 bias(decay=0.0)
Image sizes 640 train, 640 val
Using 0 dataloader workers
Logging results to runs\detect\train2
Starting training for 100 epochs…
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/100 0G 1.567 3.845 1.579 316 640: 7%|▋ | 11/163 [03:38<47:43, 18.84s/it]
GPU版运行结果
参考《安装PyTorch框架》安装CUDA12.1和GPU版本的pytorch2.4.1的运行结果:
(pytorch241-gpu) C:\AiSelect1\CV\Fire\AiS-DataSet-App-Yolo8-Safety-Helmet-Detection-2023>python yolo_train.py
Creating new Ultralytics Settings v0.0.6 file ✅
View Ultralytics Settings with 'yolo settings' or at 'C:\Users\86138\AppData\Roaming\Ultralytics\settings.json'
Update Settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings.
Model is using device: cpu
Ultralytics 8.3.28 🚀 Python-3.10.15 torch-2.4.1 CUDA:0 (NVIDIA GeForce MX150, 2048MiB)
engine\trainer: task=detect, mode=train, model=yolov8n.pt, data=safehat.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train7, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train7
Downloading https://ultralytics.com/assets/Arial.ttf to 'C:\Users\86138\AppData\Roaming\Ultralytics\Arial.ttf'...
100%|███████████████████████████████████████████████████████████████████████████████| 755k/755k [00:00<00:00, 5.48MB/s]
Overriding model.yaml nc=80 with nc=10
from n params module arguments
0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2]
1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2]
2 -1 1 7360 ultralytics.nn.modules.block.C2f [32, 32, 1, True]
3 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2]
4 -1 2 49664 ultralytics.nn.modules.block.C2f [64, 64, 2, True]
5 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2]
6 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True]
7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2]
8 -1 1 460288 ultralytics.nn.modules.block.C2f [256, 256, 1, True]
9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5]
10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1]
12 -1 1 148224 ultralytics.nn.modules.block.C2f [384, 128, 1]
13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1]
15 -1 1 37248 ultralytics.nn.modules.block.C2f [192, 64, 1]
16 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2]
17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1]
18 -1 1 123648 ultralytics.nn.modules.block.C2f [192, 128, 1]
19 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]
20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1]
21 -1 1 493056 ultralytics.nn.modules.block.C2f [384, 256, 1]
22 [15, 18, 21] 1 753262 ultralytics.nn.modules.head.Detect [10, [64, 128, 256]]
Model summary: 225 layers, 3,012,798 parameters, 3,012,782 gradients
Transferred 319/355 items from pretrained weights
Freezing layer 'model.22.dfl.conv.weight'
AMP: running Automatic Mixed Precision (AMP) checks...
Downloading https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt to 'yolo11n.pt'...
100%|█████████████████████████████████████████████████████████████████████████████| 5.35M/5.35M [00:00<00:00, 5.94MB/s]
AMP: checks passed ✅
...
Image sizes 640 train, 640 val
Using 8 dataloader workers
Logging results to runs\detect\train7
Starting training for 100 epochs...
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/100 2.44G 1.553 3.866 1.574
训练期间,可使用nvidia-smi查看GPU工作状态:
C:\Users\86138>nvidia-smi
Fri Nov 8 09:48:50 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 538.18 Driver Version: 538.18 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce MX150 WDDM | 00000000:02:00.0 Off | N/A |
| N/A 46C P8 N/A / ERR! | 776MiB / 2048MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 12924 C ...nda3\envs\pytorch241-gpu\python.exe N/A |
+---------------------------------------------------------------------------------------+
输出训练结果
输出到目录: runs/detect/train
测试
加载yolov8的预训练模型,这个模型是yolov8使用了coco数据集训练的通用目标检测模型 我们将它作为基础模型: model = YOLO(‘runs/detect/train15/weights/best.pt’)
输出测试结果
输出到目录:
runs/detect/predict
源码开源协议
开源协议: MIT License
Copyright (c) 2024 Dollarkillerx