图像分割之数据训练

标签: 无 分类: 未分类 创建时间:2024-12-22 08:11:48 更新时间:2025-01-17 10:39:23

1.前言

图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割。

一幅图像通常是由代表物体的图案与背景组成,简称物体与背景。若想从一幅图像中“提取”物体,可以设法用专门的方法标出属于该物体的点,如把物体上的点标为“1”,而把背景点标为“0”,通过分割以后,可得一幅二值图像。

数据训练,首先就是要准备自己的数据集,可以通过 label studio 进行标注,也可以使用其他的标注工具,

2.训练

参考文章:
【1】.YOLOv8 训练自己的分割数据集 1.数据格式,2.配置环境,3.训练模型,4.评估模型,5.推理模型,6.分割怎么改进。
【2】.YOLO数据格式说明与转换 yolo标注格式保存在.txt文件中,一共5个数据,用空格隔开,举例说明如下图所示:label,中心横坐标与图像宽度笔直,中心纵坐标与图像高度笔直,bbox宽度与图像宽度笔直,bbox高度与图像高度比值。

1.编写yml

编写训练配置,这里我只有一个类别,于是就这么写了。

1
2
3
4
5
6
train: D:/zlc/drone/drone-train/data/segment-yolo/images/train
val: D:/zlc/drone/drone-train/data/segment-yolo/images/val

# Classes
names:
0: land

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
2
3
4
5
6
7
8
from ultralytics import YOLO
import multiprocessing

if __name__ == "__main__":
multiprocessing.freeze_support()
model = YOLO("model/yolo11l-seg.pt") # load a pretrained model (recommended for training)
# Train the model
results = model.train(task="segment",data="data/2021LoveDA/data.yml", epochs=100, imgsz=1024, workers=16, device=0,batch=4)
参考文章:
【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
2
3
4
5
6
train: D:/zlc/drone/drone-train/data/segment-yolo/images/train
val: D:/zlc/drone/drone-train/data/segment-yolo/images/val

# Classes
names:
1: land

我改成了这样的写法,可以启动,但是无法训练,就报了格式错误。

1
2
3
4
5
train: D:/zlc/drone/drone-train/data/segment-yolo/images/train
val: D:/zlc/drone/drone-train/data/segment-yolo/images/val

# Classes
names: ['1']

【尝试方案】
(1)最后我只能是从0开始,不能从 1开始。我本意其实因为我定义了 一个分类,id号只有一个1,所以我才这么写。

1
2
3
4
5
6
train: D:/zlc/drone/drone-train/data/segment-yolo/images/train
val: D:/zlc/drone/drone-train/data/segment-yolo/images/val

# Classes
names:
0: land

(2)最后我还是没有解决这个问题,后来我经过不断的尝试,我发现在 ArcPro 中导出的 voc 格式,是用于图像分类的,而不是用于 图像分割的数据集。比如下面其实是一个标注,里面分为了两类,一类是 1,一类是 2,就是这么简单,只有 最大最小范围罢了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0"?>
<annotation>
<filename>000000000001.tif</filename>
<source>
<annotation>ESRI ArcGIS Pro</annotation>
</source>
<size>
<width>1919</width>
<height>1080</height>
<depth>4</depth>
</size>
<object>
<name>1</name>
<bndbox>
<xmin>414.57</xmin>
<ymin>332.91</ymin>
<xmax>511.61</xmax>
<ymax>433.94</ymax>
</bndbox>
</object>
<object>
<name>128</name>
<bndbox>
<xmin>965.49</xmin>
<ymin>501.69</ymin>
<xmax>1325.41</xmax>
<ymax>792.06</ymax>
</bndbox>
</object>
<object>
<name>128</name>
<bndbox>
<xmin>1196.90</xmin>
<ymin>135.03</ymin>
<xmax>1508.09</xmax>
<ymax>368.36</ymax>
</bndbox>
</object>
</annotation>

【解决方案】
其实这个问题如果是1分类的话,其实要增加一个0 分类

1
2
3
4
5
6
7
train: D:/zlc/drone/drone-train/data/land/yolo/images/train
val: D:/zlc/drone/drone-train/data/land/yolo/images/val

# Classes
names:
0: 0
1: 1 # Class 1

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。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。