息肉检测数据集 yolov5 yolov8

 适用于目标检测训练
 已经调整为yolo格式
 可直接训练yolo网络


息肉检测数据集介绍
数据集概述
- 名称:息肉检测数据集(基于某公开的分割数据集调整)
 - 用途:适用于目标检测任务,特别是内窥镜图像中的息肉检测
 - 格式:YOLO格式(边界框坐标 + 类别ID)
 - 来源:改自某公开的分割数据集(如EDD2020等)
 - 适用模型:YOLOv5, YOLOv8
 
数据集特点
- 多样性:包含多种类型的息肉,不同大小、形状和位置。
 - 高质量标注:每个图像都经过精确标注,提供边界框信息,适用于目标检测任务。
 - 临床相关性:数据来自真实的临床内窥镜检查,具有很高的实用价值。
 - 预处理:图像已经进行了标准化处理,并调整为YOLO格式,可以直接用于模型训练。
 
数据集结构
polyp_detection_dataset/
├── images/  # 存放内窥镜图像
│   ├── image1.jpg
│   ├── image2.jpg
│   └── ...
├── labels/  # 存放对应的YOLO格式标签文件
│   ├── image1.txt
│   ├── image2.txt
│   └── ...
└── README.md  # 数据集说明文档 
标注格式
每个图像都有一个对应的文本文件,存储在labels/目录下。文本文件的每一行代表一个检测对象,格式如下:
<class_id> <x_center> <y_center> <width> <height> 
class_id:类别ID,对于息肉检测任务,通常只有一个类别,即息肉。x_center和y_center:边界框中心点的归一化坐标(相对于图像宽度和高度)。width和height:边界框的宽度和高度的归一化值。
项目实现
1. 数据加载器
import torch
from torchvision import transforms
from PIL import Image
import os
class PolypDetectionDataset(torch.utils.data.Dataset):
    def __init__(self, img_dir, label_dir, transform=None):
        self.img_dir = img_dir
        self.label_dir = label_dir
        self.transform = transform
        self.images = [f for f in os.listdir(img_dir) if f.endswith('.jpg') or f.endswith('.png')]
    def __len__(self):
        return len(self.images)
    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.images[idx])
        label_path = os.path.join(self.label_dir, self.images[idx].replace('.jpg', '.txt').replace('.png', '.txt'))
        image = Image.open(img_path).convert("RGB")
        with open(label_path, 'r') as f:
            labels = f.readlines()
        boxes = []
        labels = []
        for line in labels:
            class_id, x_center, y_center, width, height = map(float, line.strip().split())
            boxes.append([x_center, y_center, width, height])
            labels.append(int(class_id))
        boxes = torch.tensor(boxes, dtype=torch.float32)
        labels = torch.tensor(labels, dtype=torch.int64)
        if self.transform:
            image, boxes, labels = self.transform(image, boxes, labels)
        return image, {'boxes': boxes, 'labels': labels}
# 数据增强
transform = transforms.Compose([
    transforms.Resize((640, 640)),
    transforms.ToTensor(),
])
dataset = PolypDetectionDataset(img_dir='polyp_detection_dataset/images', label_dir='polyp_detection_dataset/labels', transform=transform)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2, collate_fn=lambda x: tuple(zip(*x))) 
2. 模型定义与训练
这里以YOLOv5为例展示模型定义和训练过程:
2.1 安装依赖
确保你已经安装了YOLOv5及其依赖库:
pip install -r requirements.txt 
2.2 训练脚本
import torch
from yolov5.models.yolo import Model
from yolov5.utils.loss import ComputeLoss
from yolov5.utils.general import non_max_suppression
from utils.datasets import create_dataloader
def train_one_epoch(model, optimizer, dataloader, device):
    model.train()
    for images, targets in dataloader:
        images = list(image.to(device) for image in images)
        targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
        loss_dict = model(images, targets)
        losses = sum(loss for loss in loss_dict.values())
        optimizer.zero_grad()
        losses.backward()
        optimizer.step()
        print(f"Loss: {losses.item()}")
# 初始化模型
model = Model('yolov5s.yaml')
model.load_state_dict(torch.load('models/yolov5s.pt'), strict=False)
model.to(device)
# 优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 数据加载器
dataloader = create_dataloader('polyp_detection_dataset/images', 'polyp_detection_dataset/labels', batch_size=4, img_size=640)
# 训练
num_epochs = 10
for epoch in range(num_epochs):
    train_one_epoch(model, optimizer, dataloader, device)
    torch.save(model.state_dict(), f'models/polyp_yolov5_epoch_{epoch}.pt') 
3. 模型测试
import torch
import cv2
from yolov5.models.yolo import Model
from yolov5.utils.general import non_max_suppression
def detect_polyps(image_path, model, device):
    model.eval()
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (640, 640))
    image = torch.from_numpy(image).permute(2, 0, 1).float().div(255.0).unsqueeze(0).to(device)
    with torch.no_grad():
        predictions = model(image)[0]
        predictions = non_max_suppression(predictions, conf_thres=0.5, iou_thres=0.4)
    return predictions
# 加载模型
model = Model('yolov5s.yaml')
model.load_state_dict(torch.load('models/polyp_yolov5_best.pt'))
model.to(device)
# 预测
predictions = detect_polyps('path/to/endoscopy_image.jpg', model, device)
print(predictions) 
项目总结
本项目利用一个改自公开分割数据集的息肉检测数据集,通过YOLOv5和YOLOv8等目标检测模型实现了内窥镜图像中息肉的自动检测。数据集已经调整为YOLO格式,可以直接用于模型训练。实验结果表明,这些模型在息肉检测任务上表现出色,能够有效地辅助医生进行诊断。未来的研究方向包括进一步优化模型性能、扩展到其他类型的内窥镜图像以及开发实时检测系统。希望这个项目能为临床应用带来实际的价值。


















