图像分割之数据训练
1.前言
图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割。
一幅图像通常是由代表物体的图案与背景组成,简称物体与背景。若想从一幅图像中“提取”物体,可以设法用专门的方法标出属于该物体的点,如把物体上的点标为“1”,而把背景点标为“0”,通过分割以后,可得一幅二值图像。
数据训练,首先就是要准备自己的数据集,可以通过 label studio 进行标注,也可以使用其他的标注工具,
【1】.【深度学习总结_02】在自己的数据集微调SAM
【2】.Segment Anything Model (SAM)本地部署,及应用于自己的数据集完成分割
【3】.【入门教程】基于深度学习的遥感图像分割流程(附代码) 1.大致了解图像分割的基本流程。2.能够独立完成从拿到数据集到完成分割结果并评估的任务。
【4】.图像分割必备知识点 | Unet详解 理论+ 代码
2.训练
【1】.YOLOv8 训练自己的分割数据集 1.数据格式,2.配置环境,3.训练模型,4.评估模型,5.推理模型,6.分割怎么改进。
【2】.YOLO数据格式说明与转换 yolo标注格式保存在.txt文件中,一共5个数据,用空格隔开,举例说明如下图所示:label,中心横坐标与图像宽度笔直,中心纵坐标与图像高度笔直,bbox宽度与图像宽度笔直,bbox高度与图像高度比值。
1.编写yml
编写训练配置,这里我只有一个类别,于是就这么写了。
1 | train: D:/zlc/drone/drone-train/data/segment-yolo/images/train |
2.训练
(1)命令行参数重写
采用参数重写的方式最简单可以提前下载 yolov8n-seg.pt 放到当前目录下。
1 | yolo task=segment mode=train model=yolov8n-seg.pt data=data/segment-yolo/data.yml batch=4 epochs=100 imgsz=640 workers=16 device=0 |
(2)采用 python 脚本
也可以使用 py 脚本的方式进行。
1 | from ultralytics import YOLO |
【1】.YOLOv9:在自定义数据上进行图像分割训练 1.下载数据集,2.安装 Ultralytics,3.加载 YOLOv9-seg 预训练模型和推断,4.在自定义数据集上微调 YOLOv9-seg,5.加载自定义模型,6.对测试图像进行推断。我们将使用 Furniture BBox To Segmentation (SAM) 数据集进行本教程。您可以从 Kaggle 获取 Furniture BBox To Segmentation (SAM) 数据集,Kaggle 是一个流行的数据科学竞赛、数据集和机器学习资源平台。
【2】.yolo实现语义分割(cityscapes数据集)附源码 本文主要对darknet源码做了修改,这里使用的分割算法应用场景是车辆的语义分割,数据集选择了奔驰公司所开源的cityscapes数据集。 由于测试结果为34类,每类的class值就是像素值,所以图像结果都是一片黑,为了可视化为彩色图像,使用matlab写了一个脚本用以测试结果可视化。
【3】.基于YOLO和PSPNet的目标检测与语义分割系统 它的主要功能是通过YOLOv5进行目标检测,并使用PSPNet进行语义分割。
【4】.yolov8训练自己的数据集进行目标检测/实例分割(2) 如果需要用YOLOv8训练自己的数据集,首先需要使用标记软件,如labelme,labelimg等对图像进行标注,jpg/tif或其他图像格式标注后会转换为yolo格式或coco格式。(yolo对数据集有自己的规定,目标检测和实例分割的要求各不相同)。
问题
1.ignoring corrupt image/label: non-normalized or out of bounds coordinates
我在使用了 arcpro 进行了切片之后,然后进行训练,结果出现了这个问题,也就是说坐标范围超出了。
【尝试方案】
我在导出切片的时候,将原先的 “地理空间” 改为了 “像素空间” ,结果还是报错。
【解决方案】
解决方案就是,将 KITT 格式改为了 VOC 格式输出,然后使用转换工具,将 xml 改为了 txt,这样就解决了坐标的归一化问题。
【1】.从Labelme到COCO:数据集的转换与改良 在转换数据集时,需要将目标框坐标进行归一化处理。归一化坐标的计算公式为:(x / width, y / height, width / width, height / height),其中(x, y)是目标框的左上角坐标,width和height是图像的宽度和高度。
2.segment dataset incorrectly formatted or not a segment dataset
因为我只有一个分类,所以我编写了 data.yml 配置文件,但是这样会报错,无法启动。“1-class dataset requires class indices 0-0, but you have invalid class indices 1-1 defined in your dataset YAML.”
1 | train: D:/zlc/drone/drone-train/data/segment-yolo/images/train |
我改成了这样的写法,可以启动,但是无法训练,就报了格式错误。
1 | train: D:/zlc/drone/drone-train/data/segment-yolo/images/train |
【尝试方案】
(1)最后我只能是从0开始,不能从 1开始。我本意其实因为我定义了 一个分类,id号只有一个1,所以我才这么写。
1 | train: D:/zlc/drone/drone-train/data/segment-yolo/images/train |
(2)最后我还是没有解决这个问题,后来我经过不断的尝试,我发现在 ArcPro 中导出的 voc 格式,是用于图像分类的,而不是用于 图像分割的数据集。比如下面其实是一个标注,里面分为了两类,一类是 1,一类是 2,就是这么简单,只有 最大最小范围罢了。
1 |
|
【解决方案】
其实这个问题如果是1分类的话,其实要增加一个0 分类
1 | train: D:/zlc/drone/drone-train/data/land/yolo/images/train |
【1】.训练yolov5的那些事之解决:AssertionError: Label class x exceeds nc=x in data/yolov5.yaml. Possible class label
【2】.Yolov8-seg:制作并训练自己的数据集+提取并重建mask
3.OutOfMemoryError
总是出现内存泄漏的问题,我有RTX 3060 16G的显存,使用起来还是捉襟见肘,我把 batch 大小从8改到了2,最后还是不行,只能用1了,我的图片都尺寸比较大,使用的是 1024 的尺寸。
【尝试方案】
(1) 我的图片尺寸是 1024 的,于是我几只能把这个 batch 调成了1,希望能解决问题,结果没有用。
(2) 我把 workers 从 16 调成了 4,结果也没有效果
(3) 减少 imgsz 的大小,从1024改为了 512
(4) 降低图片的大小,因为我的一个图片的大小就是
【1】.排除常见问题YOLO 使用多个 GPU 训练,调整批处理大小。
【2】.pytorch: 四种方法解决RuntimeError: CUDA out of memory. Tried to allocate … MiB 1.调小batch_size,设到4基本上能解决问题,如果还不行,该方法pass。2.在报错处、代码关键节点(一个epoch跑完…)插入以下代码(目的是定时清内存)。3.在测试阶段和验证阶段前插入代码 with torch.no_grad()(目的是该段程序不计算参数梯度)。4.查看代码中是否存在一下代码(通常出现在main.py 或者数据加载的py文件中,将”pin_memory”: True改为False。
【3】.YOLO11 图像缩放 | 图像填充 | 自适应不同尺寸的图片 1.默认灰色填充,图像尺寸为640640。2.黑色填充,图像尺寸为640640。3.白色填充,图像尺寸为1280*1280。