脑部CT检测数据集是一个包含2,615张图像和2,643个标注,适用于脑部肿瘤检测和分类任务的数据集,支持VOC和YOLO两种标注格式。以下是详细介绍:
数据集概述- 名称:脑部CT检测数据集
- 用途:从脑部CT图像中检测和分类肿瘤
- 格式:提供VOC和YOLO两种标注格式
- 图像数量:2,615张
- 标注数量:2,643个
- 类别:主要包含肿瘤(tumor)这一类别
数据集特点- 多样性:包含不同类型的脑部肿瘤,肿瘤的大小、形状和位置各异。
- 高质量标注:每个图像都经过精确标注,提供边界框信息,适用于目标检测任务。
- 医学影像:基于CT扫描图像,具有高分辨率和详细的解剖结构信息。
- 专注性:专注于脑部肿瘤的检测,适合特定领域的研究和应用。
数据集结构数据集目录结构如下:
brain_ct_dataset/├── images/ # 存放CT图像│ ├── image1.jpg│ ├── image2.jpg│ └── ...├── labels_voc/ # 存放对应的VOC格式标签文件│ ├── image1.xml│ ├── image2.xml│ └── ...├── labels_yolo/ # 存放对应的YOLO格式标签文件│ ├── image1.txt│ ├── image2.txt│ └── ...└── README.md # 数据集说明文档标注格式VOC格式- 每个图像对应一个XML文件,存储在labels_voc/目录下。
- XML文件结构示例:
<annotation> <folder>images</folder> <filename>image1.jpg</filename> <size> <width>512</width> <height>512</height> <depth>3</depth> </size> <object> <name>tumor</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> </object> <!-- 更多对象 --></annotation>YOLO格式- 每个图像对应一个文本文件,存储在labels_yolo/目录下。
- 文本文件每行代表一个检测对象,格式为:
<class_id> <x_center> <y_center> <width> <height>类别统计- Tumor:
图片张数:2,615
标注个数:2,643
- 总数:
图片张数:2,615
标注个数:2,643
项目实现1. 数据加载器使用PyTorch实现数据加载器,支持VOC和YOLO格式的标签读取:
import torchfrom torchvision import transformsfrom PIL import Imageimport osclass BrainCTDataset(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 = [] class_ids = [] 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]) class_ids.append(int(class_id)) boxes = torch.tensor(boxes, dtype=torch.float32) class_ids = torch.tensor(class_ids, dtype=torch.int64) if self.transform: image, boxes, class_ids = self.transform(image, boxes, class_ids) return image, {'boxes': boxes, 'labels': class_ids}# 数据增强transform = transforms.Compose([ transforms.Resize((512, 512)), transforms.ToTensor(),])dataset = BrainCTDataset(img_dir='brain_ct_dataset/images', label_dir='brain_ct_dataset/labels_yolo', 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为例展示模型定义和训练过程:
pip install -r requirements.txtimport torchfrom yolov5.models.yolo import Modelfrom yolov5.utils.loss import ComputeLossfrom yolov5.utils.general import non_max_suppressionfrom utils.datasets import create_dataloaderdef 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('brain_ct_dataset/images', 'brain_ct_dataset/labels_yolo', batch_size=4, img_size=512)# 训练num_epochs = 10for epoch in range(num_epochs): train_one_epoch(model, optimizer, dataloader, device) torch.save(model.state_dict(), f'models/brain_yolov5_epoch_{epoch}.pt')3. 模型测试import torchimport cv2from yolov5.models.yolo import Modelfrom yolov5.utils.general import non_max_suppressiondef detect_brain_tumors(image_path, model, device): model.eval() image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (512, 512)) 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/brain_yolov5_best.pt'))model.to(device)# 预测predictions = detect_brain_tumors('path/to/brain_ct_image.jpg', model, device)print(predictions)项目总结本项目利用脑部CT检测数据集,通过脑部CT图像实现了对脑部肿瘤的自动检测。数据集支持VOC和YOLO格式,可直接用于模型训练。实验结果表明,模型在脑部肿瘤检测任务上表现良好,能够辅助医生进行诊断和治疗决策。
未来研究方向- 进一步优化模型:探索更高效的网络结构和训练策略,提高检测精度和速度。
- 扩展应用场景:将该方法应用于其他类型的医学影像数据(如MRI)。
- 实时检测系统:开发实时检测系统,实现在线监测和预警功能。
- 多模态融合:结合多种医学影像数据(如CT和MRI),提高检测的准确性和鲁棒性。