网站首页 > 技术文章 正文
大家好,今天要讲的内容是,基于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,训练一个安全帽佩戴的目标检测模型,就讲完了,感谢大家的观看,我们下节课再会。
猜你喜欢
- 2024-12-29 国内首个非Attention大模型发布!训练效率是Transformer的7倍
- 2024-12-29 AI大模型探索之路 - 训练篇8:Transformer库预训练全流程实战指南
- 2024-12-29 从零手搓中文大模型计划|Day06|预训练代码汇总和梳理
- 2024-12-29 YOLOv8姿态估计模型训练简明教程 姿态估计heatmap
- 2024-12-29 首次!用合成人脸数据集训练的识别模型,性能高于真实数据集
- 2024-12-29 风控模型应聘,80%会被问到的面试题
- 2024-12-29 快乐8第24271期训练与验证 快乐八2021248期
- 2024-12-29 AI系列:怎么对模型进行测试 ai模拟量
- 2024-12-29 QAF2D:利用2D检测引导查询3D anchor来增强BEV远距离目标检测
- 2024-12-29 小麦头小麦穗目标检测数据集yolo格式(txt标签)4000张左右
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)