YOLOv8私域数据实战(避免踩坑版)

gongzhonghao更名为“CV模型架构”
地址:https://docs.ultralytics.com/

YOLOv8是由ultralytics发布,V8可以做很多的任务,其中最常见的任务包括检测、分割、分类、追踪、OBB(图片角度矫正)。关于它的网络结构就不再赘述,网上有很多的详细介绍。我们主要实战它的使用和一些注意防止踩坑点。实战包括分类、检测、OBB。

下面从4点出发:1.环境的搭建,2.自制数据集制和格式,3.模型的训练,4.结果验证和测试。这是能成功复现和使用的最顺利情况。

1.环境搭建

YOLOV8环境集成非常友好,创建完虚拟环境后,直接pip install ultralytics。我用这种方式出现一个小问题,安装后找不到ultralytics的YOLOv8代码……如果出现这种情况,可以git clone方式解决,如图:

图片

2.数据集制作和格式

不同的任务,数据集处理方式不同,如果是在公开数据如coco IMAGENET,网上很多教程不在赘述。这里主要说如何用自己的数据去实现训练,任务有detect、OBB和classify。

Classify比较简单,创建文件夹如classification,然后在此文件夹内分出train、val文件夹,train/val里面存放分类文件夹,如ticket文件夹下放入ticket图片,格式如下:

图片

DETECT检测,它的数据格式和训练时候是读取TXT文件。每一个TXT文件对应一张图片(文件名一致)。

图片

主要是TXT格式需要理解,我们以网站给的例子讲解:

图片

有几个目标就几行(这里三行,两个类别0代表人,一个类别27代表领带;数字对应的类别可以自定义)。TXT总共有5列,第一列类别数字,第二列至第5列代表中心点坐标X,Y和它的width宽、height长。需要注意这些坐标都要经过归一化处理。也就是每个目标的X和width除以图片的宽度,Y和height除以图片的高度。

格式有了,下一步是处理自己的图片,推荐使用labelme去标注目标的坐标点和类别。然后去解析标注文件json,根据标注的坐标信息计算出对应的归一化后的中心点坐标和宽高。

OBB的数据格式同样也是选择TXT,不同于检测,他的TXT文件内部是分为了9列,第1列是类别,第2列到第9列是目标的左上、右上、左下、右下共八个点信息,同样也要做归一化的操作。如下:

图片

为什么是4坐标8个点呢?是因为在模型训练的时候,需要根据坐标得到这张图片倾斜的角度来训练(不需要自己计算角度,代码集成)。

同样,自制数据集时需要特别注意一点。标注的过程中左上一定是图片的起始位置,然后依次选择顺时针或者逆时针标注。否则是错的。如图:

图片

3.模型训练

模型训练建议以Python脚本方式。

classfily train.py如下:

图片

配置文件在cfg/models/v8/yolov8-cls.yaml

图片

nc改为自己需要训练的类别数量(其他任务也改)。

scales控制模型的大小是n、s、m、l、x,例如我选的是s,配置文件为名yolov8s-cls.yaml(其他任务都是如此)。

模型预训练PT对应yaml配置,如yolov8s-cls.yaml对应yolov8s-cls.pt(网站自己下载)。

数据集data读取到classification即可,代码会自己解析内部的train/val。这里特别注意一点,Linux系统会自动生成隐藏文件夹如.ipynb*这类的文件夹,一定要把classification内的删除,否则会出现图片和标签不对齐,训练指标异常情况(已踩坑)!

其他的训练参数如batch/imgsz等调整可以根据自己的需求,参数列表可在网站查看。

DETECT训练代码如下:

图片

配置文件这里选的yolov8s.yaml,nc改为自己的类别数量。预训练模型为yolov8s.pt,数据加载data的yaml文件建议自己写一个,如下:

图片

path是数据存储路径,这里是只检查一个类别所以names只有0。

OBB倾斜矫正代码实例:

图片

配置和data模式与DETECT一样。提一点,OBB只能做倾斜矫正不能做旋转矫正。比如190°的图片只能矫正到180°/270°(理想情况),不能转到0°。

下面就可以开始训练,当出现下面这些信息的时候去。代表成功。

图片

运行正常后,立马去看一下生成的runs文件。如DETECT任务,会出现detect文件夹,看其中的train_batch.jpg图片,这可以看到你的标注是否有问题。

图片

训练时会有缓存文件.cache生成,如果数据有扩充,需要删除旧的cache文件。否则训练读取的还是原来的cache。

4.模型测试

验证环节没有再去做指标的统计,训练完成时已经统计。我们是要用到实际场景,所以直接去预测了,预测脚本如下,以obb为例:

图片

预测结果都在result里面。Result后面有不同的后缀,比如说检测是需要用boxes,obb需要obb,不同的任务,他的结果信息是不一样的。建议是先把相应任务的结果打印,然后根据结果去取。

最后总结一下吧,YOLOv8能做的任务还是比较多的。在单阶段目标检测这一块非常强大,训练速度也非常快,几千张的图大概几个小时训练完成。当然,图片Size大,选择的模型越大,它速度也相应慢点。更重要的好处是少量的数据上,微调就能够训练出非常不错的效果。

不过,还有一个问题没有解决,也一直尝试处理中。在使用DETECT检测方法批量预测图片时,存在内存泄露情况,这一点很多人都遇到,目前采取的策略是在每次预测后清空显存,但显然不是很好的解决方案……如果有更好的方式解决,希望能互相交流。

欢迎留言/私信、互相讨论,感谢支持~

我是休柏,一颗向阳的种子。

图片

posted @ 2024-09-22 21:25  独傲沐年  阅读(349)  评论(0)    收藏  举报