计算机系统应用教程网站

网站首页 > 技术文章 正文

基于yolov8,训练一个安全帽佩戴的目标检测模型

btikc 2024-12-29 01:43:54 技术文章 24 ℃ 0 评论

大家好,今天要讲的内容是,基于yolov8,训练一个安全帽佩戴的目标检测模型。

在本节课中,我们将使用yolov8提供的python接口,训练一个佩戴安全帽的目标检测模型。

完成模型的训练后,使用这个模型,识别图像和视频中的人物,是否佩戴了安全帽。


1.训练数据的准备

首先需要准备训练数据。

最简单的方法,就是在kaggle平台搜索相关的数据:

打开kaggle平台,搜索Safety Helmet或者worker safety等等,可以找到相应的训练数据。

这里要注意数据格式:

例如,Safety Helmet 这份数据的格式是PASCAL VOC,而Site Safety这份数据的格式是YoloV8。

前者需要将数据转换为Yolo格式,后者可以直接使用。

我们选择Site Safety这份数据,下载后可以直接使用。

将下载的数据解压,在css-data文件夹中:

train保存了2605个训练数据,valid保存了114个验证数据,test保存了82个测试数据。

打开train文件夹,其中image文件夹保存了图片数据:

labels文件夹保存了数据的标记结果,标记格式为yolo格式:

同一个数据的数据名和标记名是相同的,可以对应上。


2.训练数据的格式说明

我们随意打开一个数据图片和对应的标记数据:

简单来说,每一行表示一个目标物体。

在标记数据中包括了14行,因此对这个图片数据,会标记14个目标物体:

每一行的数据格式如下:

第1列是class_id,代表类别的编号。

第2列和第3列是x_center和y_center,代表物体边界框中心点的坐标。

第4列和第5列是width和height,代表物体边界框的宽度和高度。

这4个值的取值都在0到1之间。

我们以图片中的第1个目标物体来说明,也就是红框标记的蓝色安全帽:

它的标记数据是第1行,0、0.498、0.110等等。

这里的编号0,对应类别安全帽。

边界框中心点的坐标,是相对于图像宽度和高度的比例。

边界框的宽度和高度,同样是相对于图像的宽度和高度的比例。

例如,这个蓝色安全帽边界框中心点的x坐标,是0.498 * image_width。

中心点的y坐标,是0.110 * image_height。

物体边界框的宽度和高度,分别为 0.021 * image_width 和 0.062 * image_height:

另外,从这张图片可以看出,每个图片可以分为多张子图,每个子图也包括了多个目标物体。

因此,这份数据虽然只有2605张图片,但实际上可以有20000多个标记结果。


3.搭建环境和编写配置文件

使用conda create创建一个名为safehat的新python环境:

其中python版本选择3.10。

创建后激活环境,并输入pip install ultralytics,安装yolo。

完成安装后,需要编写一个模型训练使用的yaml配置文件,文件取名为safehat.yaml:

该文件说明了数据的地址和待训练的类别。

数据的地址有三个路径,train对应训练数据、val对应验证数据、test对应测试数据。

接着定义模型的类别数量nc: 10,代表10个待检测的类别。

这10个类别的名称保存在names中。

这里我们重点关注Hardhat带安全帽和NO-Hardhat未带安全帽这两个类别。


4.模型训练和测试

编写模型的训练代码yolo_train.py:

第一行,表示导入Yolo模块。

第2行加载yolo的预训练模型yolov8n.pt,这个模型使用了coco数据集训练,是通用的目标检测模型。

我们将它作为基础模型,在该模型的基础上,训练安全帽模型。

第3行代码,表示训练自定义的数据集,数据的配置保存在safehat.yaml中,epochs等于100表示100轮迭代。

最后train.val表示使用验证集验证效果。

完成训练代码的编写后,运行训练程序yolo_train.py:

从运行后打印的调试信息中可以看到,我当前的环境是ultralytics yolov8版本,python3.10.12,CPU环境进行训练。

训练需要持续一段时间,每个epoch可能要训练3-5分钟:

整体训练一个下午,基本就可以完成了。

完成训练后,会在当前目录下的runs/detect/train路径下,保存训练过程中的数据和模型文件:

其中weights文件夹中保存了模型文件,接下来我们使用best.pt进行测试:

编写测试代码yolo_test.py:

首先导入训练好的模型best.pt。

这里我们可以随意找一些测试数据,也可以自己构造一些数据。

图片数据和视频数据都是可以的,直接将数据传入接口就可以了。

另外,在识别我自己构造的数据时,传入了classes = [0, 2],它代表只输出0和2这两个类别,也就是只识别安全帽是否佩戴。

line_width = 30表示指定识别框的字体大小为30。

运行测试程序,可以看到模型识别数据的过程,视频会一帧一帧的识别:

识别结果会保存在当前目录下的runs/detect/predict中。

打开结果文件夹,可以看到图片和视频的识别结果。

其中视频会将每一帧都识别好:

从视频中可以看到,人物、安全帽、安全衣、挖掘机都被识别出来了。

另外,在识别时,可以只选择一部分需要识别的类型:

例如,在我自己构造的数据中,只识别是否佩戴安全帽这两个类别,我们可以看到模型准确的将结果识别出来了。

那么到这里,基于yolov8,训练一个安全帽佩戴的目标检测模型,就讲完了,感谢大家的观看,我们下节课再会。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表