【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)

这篇具有很好参考价值的文章主要介绍了【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

构建pytorch训练模型读取的数据,是有模版可以参考的,是有套路的,这点相信使用过的人都知道。我也会给出一个套路的模版,方便学习和查询。

同时,也可以先去参考学习之前的一篇较为简单的3D分类任务的数据构建方法,链接在这里:【3D图像分类】基于Pytorch的3D立体图像分类1(基础篇)

到了本篇训练的数据构建,相比于上面参考的这篇博客,就多了一丢丢的复杂。那就是有了原始图、mask图后,又多了一个结节目标的中心点坐标和半径。

那就意味着,我们读取到的原始图、mask图三维信息后,不能直接放进去训练,因为尺寸也不一样,背景信息太多了。那就需要根据结节目标的坐标信息,先进行裁剪,裁剪出固定大小区域的目标图,然后再放进去训练。

至此,整个过程基本上就清晰了。

  1. 获取原始图、mask图、结节目标的中心点坐标和半径
  2. 裁剪操作,取出固定大小的输入信息

为了方便调试,和查看裁剪的对不对,那就配合一个查看的操作,这样就完美了

一、训练数据预处理

Luna16的原始数据相对来说是较为复杂的,不够直观,这部分的数据处理如果放到训练阶段来做,将会耗费很多的时间和内存资源。所以,有必要将这部分较为复杂的数据,预先处理成较为简单的、直观的、一一对应的数据关系。

LUNA16数据集中的888个CT图像被均匀的划分为10个子集,分别存放在subset0-subset9这10个文件夹中,该数据集的图像存储方式为MetaImage(mhd/raw)的格式,每个mhd文件都存储着一个单独对应的raw文件。

  • raw二进制文件,存放像素数据;
  • mhd文件存放信息

这两部分是同时存在,表示一个完整的信息。对于上述关于Luna16的处理代码,可以参考【小目标】vnet 肺结节 3d图像分割中作者对这块的处理即可。针对这块,我做个简要的处理步骤介绍:

  1. 根据结节标注信息,获取标注结节的坐标信息,生成mask 3维数据块,尺寸和原始CT图像大小一致;
  2. 根据肺区分割图,和原始的CT图像处理,得到去除肺区外,只留下肺实质的信息,对mask同样处理;
  3. 根据x、y、z三个方向的space信息,进行resample操作,将原本各个维度像素点代表的不同尺度,给resample1mm单位;
  4. 最后再从resample后的mask中,获取结节的坐标信息,保存到csv文件呢。

至此,一个较为复杂的流程下,终于把他们一一的对应关系给整理顺畅了。本篇博文基本上是对作者视频部分的二次整理,和微微的改进与测试、可视化等等的工作。后续等训练了,发现了问题,再解决问题,进行优化。

到这里,训练所需要的文件基本上整理出来了,路径结构如下:

sk_output
├── bbox_annos
    ├── bbox_annos.csv

├── bbox_image
    ├── subset0
        ├── source_1.npy
        ├── source_2.npy
        └── ...
    ├── subset1
        ├── source_103.npy
        ├── source_104.npy
        └── ...
    ├── subset2
        ├── source_205.npy
        ├── source_206.npy
        └── ...
    ├── subset3
        ├── source_307.npy
        ├── source_308.npy
        └── ...
    └── ...


├── bbox_mask
    ├── subset0
        ├── source_1.npy
        ├── source_2.npy
        └── ...
    ├── subset1
        ├── source_103.npy
        ├── source_104.npy
        └── ...
    ├── subset2
        ├── source_205.npy
        ├── source_206.npy
        └── ...
    ├── subset3
        ├── source_307.npy
        ├── source_308.npy
        └── ...
    └── ...

其中,

  1. bbox_annos.csv:记录了文件名,及标记结节中心点坐标和半径;
  2. bbox_image.npy的图像信息,元素大小为0-255
  3. bbox_mask.npymask信息,和bbox_image内对应文件数量相等,单个npy文件shape一致。只有结节一个目标,元素值为0 or 1

二、构建myDataset类

构建这个数据集,其实也就是那么几件事:

  1. 读取原始图和mask图;
  2. 获取标记结节的中心点坐标信息,这里是从csv文件中获取的;
  3. 根据结节中心点坐标信息,再根据要裁剪的patch的大小,确定好立体举行的最小、最大坐标;
  4. 裁剪出patch的区域

至此,裁剪下来的patch,就是包含有结节的数组了,包括了图像数组,和标注mask数组,一一对应,用于训练。类中函数:

  1. getAnnotations 函数,需要从csv文件中获取文件名和结节对应坐标,最后存储为一个字典;
  2. getNpyFile_Path 函数,获取imagemask文件路径;
  3. get_annos_label 函数,获取文件对应的结节中心点标注信息。

如下,就是整个代码过程:文章来源地址https://www.toymoban.com/news/detail-744522.html

import os
import torch
import torch.nn as nn
import torch.utils.data
from torch.utils.data import Dataset
import numpy as np
import cv2
from tqdm import tqdm
import random
import matplotlib.pyplot as plt

def getAnnotations(csv_file):
    content = pd.read_csv(csv_file, delimiter=',', header=None,
                              index_col=False)
    names = content[1].values
    coors = content[2].values

    dict_tp = {
   }
    for n, c in zip(names, coors):
        c_list = eval(c)
        if c_list:
            print(n, c_list, type(c_list))
            dict_tp[n] = c_list
    return dict_tp

class myDataset(Dataset):
    
    def __init__(self, csv_file, data_path, label_path, crop_size=(16, 96, 96)):
        """
        :param csv_file: 记录文件名和结节标记中心点坐标+半径的信息
        :param data_path: 存储原始CT图像
        :param label_path: 存储mask图像
        :param crop_size:   裁剪的尺寸
        """
        self.annosNameCenter_list = getAnnotations(csv_file)
        self.dataFile_paths = self.getNpyFile_Path(data_path)   # 图的path列表
        self.labelFile_paths = self.getNpyFile_Path(label_path)   # 标签的path列表

        self.annos_img_info =  = self.get_annos_label(self.dataFile_paths)  # 图的位置列表 输入进去  吐出  结节附近的图的【【图片位置,结节中心,半径】列表】

        self.crop_size = crop_size
        self.crop_size_z, self.crop_size_h, self.crop_size_w = crop_size

    def __getitem__(self, index):
        img_all = self.annos_img[index]     # 0 - image_path ; 1 - 结节的中心; 2 - 结节的半径
        label_all = self.annos_label[index]

        path, zyx_centerCoor, r = img_all

        img = np.load

到了这里,关于【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【3D图像分类】基于Pytorch的3D立体图像分类1--基础篇

    在我们一般的图像数据的采集场景中,得到的大多是二维图像。比如手机拍照,所以大多数深度学习网络的雏形都是基于二维图像展开的工作。 但是,在某些场景下,比如 医学影像CT数据 ,监控场景 连续拍摄的视频 和自动驾驶使用到的 激光点云 等等,多是连续的、多层的

    2023年04月26日
    浏览(43)
  • 基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据

    3D图像分割一直是医疗领域的难题,在这方面nnunet已经成为了标杆,不过nnunet教程较少,本人之前跑了好久,一直目录报错、格式报错,反正哪里都是报错等等。并且,nnunet对于硬件的要求很高,一般的电脑配置或者低配置的服务器完全带不起来 或者定义conv.3D的unet网络模型

    2024年04月11日
    浏览(123)
  • VGAN实现视网膜图像血管分割(基于pytorch)

    VGAN(Retinal Vessel Segmentation in Fundoscopic Images with Generative Adversarial Networks)出自2018年的一篇论文,尝试使用生成性对抗网络实现视网膜血管分割的任务,原论文地址:https://arxiv.org/abs/1706.09318 在github上有相应的源码仓库,不过由于版本的原因也会出现一些bug,本篇博客在复现项

    2024年01月16日
    浏览(41)
  • 文献速递:文献速递:基于SAM的医学图像分割--SAM-Med3D

    Title  题目 SAM-Med3D 01 文献速递介绍 医学图像分析已成为现代医疗保健不可或缺的基石,辅助诊断、治疗计划和进一步的医学研究]。在这一领域中最重要的挑战之一是精确分割体积医学图像。尽管众多方法在一系列目标上展现了值得称赞的有效性,但现有的分割技术倾向于专

    2024年04月23日
    浏览(40)
  • Pytorch版Mask-RCNN图像分割实战(自定义数据集)

    目录 Mask-RCNN概述 训练自己数据步骤 工具Labelme 标注数据 源码需要改动地方 训练之后的测试结果 Mask R-CNN是一种广泛应用于目标检测和图像分割任务的深度学习模型,它是由Faster R-CNN(一种快速目标检测模型)和Mask R-CNN(一种实例分割模型)组成的。Mask R-CNN将Faster R-CNN中的

    2024年02月10日
    浏览(44)
  • 图神经网络:(图像分割)3D人物图像分割

    文章说明: 1)参考资料:PYG的文档。文档超链。斯坦福大学的机器学习课程。课程超链。(要挂梯子)。博客原文。原文超链。(要挂梯子)。原文理论参考文献。提取码8848。 2)我在百度网盘上传这篇文章的jupyter notebook以及预训练模型。提取码8848. 3)博主水平不高,如有错误,还

    2024年02月12日
    浏览(52)
  • 图像语义分割 pytorch复现U2Net图像分割网络详解

    U2-Net: Going Deeper with Nested U-Structure for Salient Object Detection 网络的主体类似于U-Net的网络结构,在大的U-Net中,每一个小的block都是一个小型的类似于U-Net的结构,因此作者取名U2Net 仔细观察,可以将网络中的block分成两类: 第一类 :En_1 ~ En_4 与 De_1 ~ De_4这8个block采用的block其实是

    2024年01月22日
    浏览(50)
  • 图像分割Unet算法及其Pytorch实现

    UNet是一种用于图像分割的神经网络,由于这个算法前后两个部分在处理上比较对称,类似一个U形,如下图所示,故称之为Unet,论文链接:U-Net: Convolutional Networks for Biomedical Image Segmentation,全文仅8页。 从此图可以看出,左边的基础操作是两次 3 × 3 3times3 3 × 3 卷积后池化,

    2024年01月22日
    浏览(41)
  • 使用 PyTorch 进行高效图像分割:第 4 部分

            在这个由 4 部分组成的系列中,我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基于视觉转换器的图像分割模型。   图 1:使用视觉转换器模型架构运行图像分割的结果。         从上到下,输入图像、地面实况分

    2024年02月12日
    浏览(38)
  • 使用 PyTorch 进行高效图像分割:第 2 部分

            这是由 4 部分组成的系列的第二部分,旨在使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基线图像分割卷积神经网络(CNN)模型。 图 1:使用 CNN 运行图像分割的结果。按从上到下的顺序,输入图像、地面实况分割掩码、预

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包