训练好的yolov8-seg裂缝分割模型包含裂缝分割数据集4000张 (配置环境后,项目可自己跑)
[1]训练了yolov8n-seg,yo lov8m-seg,yolov8x- -seg三个模型,训练了100epoch
[2]训练任务为分割
segment
[3]训练数据集和检测结果如图1,4000张yo|o格式的裂缝分割数据
文件包含:
[1] yolo源码,
[2]裂缝分割数据集(4000张)
[3]训练好的权重(yol ov8n-seg, yolov8m-seg, yo lov8x-seg)
YOLOv8-Seg裂缝分割模型项目介绍
项目名称
YOLOv8-Seg裂缝分割模型 (YOLOv8-Seg Crack Segmentation Model)
项目概述
本项目提供了一个基于YOLOv8-Seg的裂缝分割模型,用于对图像中的裂缝进行精确分割。项目包含训练好的YOLOv8n-seg、YOLOv8m-seg和YOLOv8x-seg三个模型,每个模型都经过100个epoch的训练。数据集包含4000张标注了裂缝的图像,格式为YOLO格式。配置好环境后,用户可以直接运行项目并使用这些预训练模型进行裂缝分割。
项目特点
- 多种模型选择:提供了三种不同大小的YOLOv8-Seg模型(YOLOv8n-seg, YOLOv8m-seg, YOLOv8x-seg),以适应不同的性能需求。
- 完整数据集:包含4000张带有裂缝标注的图像,格式为YOLO格式。
- 预训练权重:提供了三个模型的预训练权重,可以直接用于推理或进一步微调。
- 易于使用:配置好环境后,可以直接运行项目进行训练、评估和推理。
项目结构
yolov8_seg_crack_detection/
├── src/ # 源代码目录
│ ├── train.py # 训练脚本
│ ├── val.py # 验证脚本
│ ├── detect.py # 推理脚本
│ ├── utils.py # 辅助函数
├── data/ # 数据目录
│ ├── images/ # 图像文件
│ │ ├── train/ # 训练集图像
│ │ ├── val/ # 验证集图像
│ │ └── test/ # 测试集图像
│ ├── labels/ # 标注文件
│ │ ├── train/ # 训练集标注
│ │ ├── val/ # 验证集标注
│ │ └── test/ # 测试集标注
├── weights/ # 权重文件
│ ├── yolov8n-seg.pt # YOLOv8n-seg预训练权重
│ ├── yolov8m-seg.pt # YOLOv8m-seg预训练权重
│ └── yolov8x-seg.pt # YOLOv8x-seg预训练权重
├── configs/ # 配置文件
│ ├── yolov8n-seg.yaml # YOLOv8n-seg配置文件
│ ├── yolov8m-seg.yaml # YOLOv8m-seg配置文件
│ └── yolov8x-seg.yaml # YOLOv8x-seg配置文件
├── README.md # 项目说明
└── requirements.txt # 依赖库文件
主要模块及功能
-
train.py
- 功能:训练YOLOv8-Seg模型。
- 内容:
train_model
函数:训练模型的主要逻辑。main
函数:主入口点,负责调用上述函数并管理整个训练过程。
-
val.py
- 功能:验证YOLOv8-Seg模型。
- 内容:
validate_model
函数:在验证集上评估模型性能。main
函数:主入口点,负责调用上述函数并管理整个验证过程。
-
detect.py
- 功能:使用预训练的YOLOv8-Seg模型进行裂缝分割。
- 内容:
detect_cracks
函数:在测试集上进行裂缝分割。main
函数:主入口点,负责调用上述函数并管理整个推理过程。
-
utils.py
- 功能:提供辅助函数。
- 内容:
get_device
函数:获取可用的计算设备(CPU或GPU)。set_seed
函数:设置随机种子以保证实验的可重复性。load_data
函数:加载数据集。preprocess_data
函数:预处理数据。
-
configs/
- 功能:存放模型配置文件。
- 内容:
yolov8n-seg.yaml
:YOLOv8n-seg模型配置文件。yolov8m-seg.yaml
:YOLOv8m-seg模型配置文件。yolov8x-seg.yaml
:YOLOv8x-seg模型配置文件。
-
data/
- 功能:存放数据集。
- 内容:
images/
:图像文件。labels/
:标注文件。
-
weights/
- 功能:存放预训练权重。
- 内容:
yolov8n-seg.pt
:YOLOv8n-seg预训练权重。yolov8m-seg.pt
:YOLOv8m-seg预训练权重。yolov8x-seg.pt
:YOLOv8x-seg预训练权重。
详细代码示例
1. 训练脚本 (train.py
)
import torch
from ultralytics import YOLO
from utils import get_device, set_seed, load_data, preprocess_data
def train_model(model, data_loader, epochs=100):
device = get_device()
model.to(device)
for epoch in range(epochs):
model.train()
for batch_idx, (images, targets) in enumerate(data_loader):
images, targets = images.to(device), targets.to(device)
loss = model(images, targets)
loss.backward()
optimizer.step()
optimizer.zero_grad()
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}')
def main():
set_seed(42)
data_loader = load_data('data/images/train', 'data/labels/train')
data_loader = preprocess_data(data_loader)
# 选择一个模型进行训练
model = YOLO('yolov8n-seg.yaml') # 可以替换为其他模型
train_model(model, data_loader, epochs=100)
# 保存模型权重
torch.save(model.state_dict(), 'weights/yolov8n-seg.pt')
if __name__ == '__main__':
main()
2. 验证脚本 (val.py
)
import torch
from ultralytics import YOLO
from utils import get_device, load_data, preprocess_data
def validate_model(model, data_loader):
device = get_device()
model.to(device)
model.eval()
total_loss = 0.0
with torch.no_grad():
for batch_idx, (images, targets) in enumerate(data_loader):
images, targets = images.to(device), targets.to(device)
loss = model(images, targets)
total_loss += loss.item()
avg_loss = total_loss / len(data_loader)
print(f'Validation Loss: {avg_loss:.4f}')
def main():
data_loader = load_data('data/images/val', 'data/labels/val')
data_loader = preprocess_data(data_loader)
# 加载预训练权重
model = YOLO('yolov8n-seg.yaml')
model.load_state_dict(torch.load('weights/yolov8n-seg.pt'))
validate_model(model, data_loader)
if __name__ == '__main__':
main()
3. 推理脚本 (detect.py
)
import torch
from ultralytics import YOLO
from utils import get_device, load_data, preprocess_data
def detect_cracks(model, data_loader):
device = get_device()
model.to(device)
model.eval()
with torch.no_grad():
for batch_idx, (images, _) in enumerate(data_loader):
images = images.to(device)
outputs = model(images)
# 处理输出结果,例如绘制边界框和掩码
# 这里可以根据需要进行后处理
def main():
data_loader = load_data('data/images/test', 'data/labels/test')
data_loader = preprocess_data(data_loader)
# 加载预训练权重
model = YOLO('yolov8n-seg.yaml')
model.load_state_dict(torch.load('weights/yolov8n-seg.pt'))
detect_cracks(model, data_loader)
if __name__ == '__main__':
main()
4. 辅助函数 (utils.py
)
Python
深色版本
import torch
from torch.utils.data import DataLoader
from torchvision.transforms import ToTensor
from PIL import Image
import os
def get_device():
return torch.device("cuda" if torch.cuda.is_available() else "cpu")
def set_seed(seed=42):
torch.manual_seed(seed)
if torch.cuda.is_available():
torch.cuda.manual_seed_all(seed)
def load_data(image_dir, label_dir):
class CrackDataset:
def __init__(self, image_dir, label_dir):
self.image_dir = image_dir
self.label_dir = label_dir
self.images = [os.path.join(image_dir, img) for img in os.listdir(image_dir)]
self.labels = [os.path.join(label_dir, lbl) for lbl in os.listdir(label_dir)]
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
image_path = self.images[idx]
label_path = self.labels[idx]
image = Image.open(image_path).convert('RGB')
label = Image.open(label_path).convert('L')
image = ToTensor()(image)
label = ToTensor()(label)
return image, label
dataset = CrackDataset(image_dir, label_dir)
data_loader = DataLoader(dataset, batch_size=32, shuffle=True)
return data_loader
def preprocess_data(data_loader):
# 可以在这里添加数据预处理步骤,例如归一化等
return data_loader
使用说明
-
环境准备
- 安装依赖库:
pip install -r requirements.txt
- 安装依赖库:
-
数据准备
- 确保数据文件位于
data/
目录下,具体路径如下:- 训练集图像:
data/images/train/
- 训练集标注:
data/labels/train/
- 验证集图像:
data/images/val/
- 验证集标注:
data/labels/val/
- 测试集图像:
data/images/test/
- 测试集标注:
data/labels/test/
- 训练集图像:
- 确保数据文件位于
-
训练模型
- 运行训练脚本:
python train.py
- 运行训练脚本:
-
验证模型
- 运行验证脚本:
python val.py
- 运行验证脚本:
-
推理模型
- 运行推理脚本:
python detect.py
- 运行推理脚本:
注意事项
- 数据预处理:确保数据预处理步骤正确无误,特别是图像和标注文件的格式。
- 超参数调整:根据实际情况调整学习率、批大小等超参数,以获得最佳训练效果。
- 硬件要求:建议使用GPU进行训练,以加快训练速度。如果没有足够的计算资源,可以考虑使用云服务提供商的GPU实例。
- 平衡数据:注意数据集中各类别之间的不平衡问题,可以通过过采样、欠采样或使用类别权重等方式来解决。
通过上述步骤,你可以成功地使用预训练的YOLOv8-Seg模型进行裂缝分割。这个项目不仅适用于裂缝检测任务,还可以应用于其他类似的图像分割任务。希望这个项目能帮助你更好地理解和应用YOLOv8-Seg模型。