PP3DSeg

初衷:在aistudio暂时还没有找到属于医疗数据的3D分割,自己又没有本地算力,又想自己搞一下3D分割,所以就有了这个项目。

PP3DSeg这个工具是基于PaddlePaddle和PaddleSeg构建的,其中3DUnet网络和一些transform方法是参考https://github.com/wolny/pytorch-3dunet 。

整个项目基本和PaddleSeg很像,只是针对3D医疗数据进行修改。专门用来处理3D的医疗数据,并对数据进行3D分割。

目前项目中只支持3DUnet网络和交叉熵损失函数。

数据增强暂时支持随机水平翻转、随机垂直翻转,重采样,归一化,随机对比度改变,随机角度旋转等方法。

可见PP3DSeg这个项目是不成熟的。里面存在各种各样的未知Bug,不过后面会慢慢更新,加入更多处理医疗数据的方法和3D分割网络等等。希望更多大佬可以给予珍贵的意见。

#克隆PP3DSeg
#!git clone https://github.com/richarddddd198/PP3DSeg.git
!git clone https://gitee.com/richarddddd198/PP3DSeg.git
# 安装必要的库
!pip install SimpleITK scikit-image
#解压肝脏数据
#数据来源https://www.ircad.fr/research/3d-ircadb-01/
#标注只有肝脏,并且数据集只有14个病例
!unzip data/data114428/liver.zip -d /home/aistudio/work/
#导入常用的库
import random
import os
import SimpleITK as sitk
from scipy import ndimage
import matplotlib.pyplot as plt
import numpy as np
import paddle
import cv2
#划分训练集合验证集
random.seed(1000)
path_origin = '/home/aistudio/work/liver/origin'
files = list(filter(lambda x: x.endswith('.nii'), os.listdir(path_origin)))
random.shuffle(files)
rate = int(len(files) * 0.9)#训练集和测试集9:1
train_txt = open('/home/aistudio/work/liver/train_list.txt','w')
val_txt = open('/home/aistudio/work/liver/val_list.txt','w')
for i,f in enumerate(files):image_path = os.path.join(path_origin, f)label_path = image_path.replace("origin", "masks")if i < rate:train_txt.write(image_path + ' ' + label_path+ '\n')else:val_txt.write(image_path + ' ' + label_path+ '\n')
train_txt.close()
val_txt.close()
print('完成')
完成

叠加Mask展示原始CT图像

绿色标注的是肝脏

def wwwc(sitkImage,ww,wc):#设置窗宽窗位min = int(wc - ww/2.0)max = int(wc + ww/2.0)intensityWindow = sitk.IntensityWindowingImageFilter()intensityWindow.SetWindowMaximum(max)intensityWindow.SetWindowMinimum(min)sitkImage = intensityWindow.Execute(sitkImage)return sitkImageorigin = sitk.ReadImage('/home/aistudio/work/liver/origin/1.nii')
print(origin.GetSize())
mask = sitk.ReadImage('/home/aistudio/work/liver/masks/1.nii')
origin = wwwc(origin, 350,60)
mask= sitk.Cast(mask, sitk.sitkUInt8)
#原图和mask叠加在一起
new_data= sitk.LabelOverlay(origin, mask, opacity=0.01)
data = sitk.GetArrayFromImage(new_data)
d = data.shape[0]plt.figure(figsize=(12,12))
for index,i in enumerate(range(int(d/2)-6,int(d/2)+6)) :plt.subplot(4,3,index+1)plt.imshow(data[i,...])plt.axis('off')plt.subplots_adjust(left=0.0,bottom=0.0,top=1,right=1,wspace =0.0001, hspace =0.0001)#调整子图间距
plt.show()
(512, 512, 129)/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingif isinstance(obj, collections.Iterator):
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingreturn list(data) if isinstance(data, collections.MappingView) else data
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

导入DataSet 和 Transforms

DataSet和Transform是参考PaddleSeg,使用起来和PaddleSeg差不多,只是PaddleSeg是处理2D数据,我这个用来专门处理3D医疗数据。具体代码可以进入/home/aistudio/PP3DSeg查看

from PP3DSeg.transforms import transforms as T
from PP3DSeg.datasets import Dataset
WW = 350
WC = 60
SIZE = (48,256,256)
train_transforms =T.Compose( [T.Normalize(ww=WW,wc=WC),T.RandomHorizontalFlip(),#水平翻转T.RandomContrast( alpha=(0.2, 1.6)),#随机改变对比度T.RandomRotate(max_rotation=25),#随机旋转一定角度T.Resize3D(target_size=SIZE),#重采样T.ToTensor()
])val_transforms = T.Compose([T.Normalize(ww=WW,wc=WC),T.Resize3D(target_size=SIZE),T.ToTensor()
])train_path = '/home/aistudio/work/liver/train_list.txt'
val_path = '/home/aistudio/work/liver/val_list.txt'
train_dataset = Dataset(transforms=train_transforms,dataset_root='/home/',num_classes=2,mode='train',train_path=train_path,flipud=False)
val_dataset = Dataset(transforms=val_transforms,dataset_root='/home/',num_classes=2,mode='val',val_path=val_path,flipud=False)img,label = train_dataset[0]
print(img.shape)
print(label.shape)
img = paddle.squeeze(img).numpy()
label = label.numpy()
plt.figure(figsize=(10,6))
plt.subplot(121)
plt.imshow(img[21,...],'gray')
plt.subplot(122)
plt.imshow(label[21,...],'gray')
[1, 48, 256, 256]
[48, 256, 256]<matplotlib.image.AxesImage at 0x7f29b3b6c090>

导入模型

2DUnet

3DUnet


从上面两张图看到,这个3D网络其实和2DUNet区别不大,简单说可以理解为2d卷积换为了3d卷积

由于医疗数据。例如CT,MR等都是三维数据,如果是2D网络去分割,会丢失在z轴方向的信息。但是也不一定是3D网络就比2D网络好,例如患者的病例数据的层数是不多的厚层,用2D的效果可能会更佳。

from PP3DSeg.models.unet3d import Unet3d
model = Unet3d(in_channels=1, num_filters=16, class_num=2)
paddle.summary(model,(2,1,32,256,256))
-------------------------------------------------------------------------------------------------------------------------------Layer (type)                    Input Shape                                    Output Shape                      Param #
===============================================================================================================================Conv3D-1                 [[2, 1, 32, 256, 256]]                          [2, 8, 32, 256, 256]                    224      BatchNorm3D-1              [[2, 8, 32, 256, 256]]                          [2, 8, 32, 256, 256]                    32       ReLU-1                  [[2, 8, 32, 256, 256]]                          [2, 8, 32, 256, 256]                     0       Conv3D-2                 [[2, 8, 32, 256, 256]]                         [2, 16, 32, 256, 256]                   3,472     BatchNorm3D-2             [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                    64       ReLU-2                 [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                     0       conv_block-1               [[2, 1, 32, 256, 256]]                         [2, 16, 32, 256, 256]                     0       MaxPool3D-1              [[2, 16, 32, 256, 256]]                         [2, 16, 16, 128, 128]                     0       Down-1                  [[2, 1, 32, 256, 256]]             [[2, 16, 32, 256, 256], [2, 16, 16, 128, 128]]        0       Conv3D-3                [[2, 16, 16, 128, 128]]                         [2, 16, 16, 128, 128]                   6,928     BatchNorm3D-3             [[2, 16, 16, 128, 128]]                         [2, 16, 16, 128, 128]                    64       ReLU-3                 [[2, 16, 16, 128, 128]]                         [2, 16, 16, 128, 128]                     0       Conv3D-4                [[2, 16, 16, 128, 128]]                         [2, 32, 16, 128, 128]                  13,856     BatchNorm3D-4             [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                    128      ReLU-4                 [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                     0       conv_block-2              [[2, 16, 16, 128, 128]]                         [2, 32, 16, 128, 128]                     0       MaxPool3D-2              [[2, 32, 16, 128, 128]]                           [2, 32, 8, 64, 64]                      0       Down-2                 [[2, 16, 16, 128, 128]]              [[2, 32, 16, 128, 128], [2, 32, 8, 64, 64]]          0       Conv3D-5                  [[2, 32, 8, 64, 64]]                            [2, 32, 8, 64, 64]                   27,680     BatchNorm3D-5               [[2, 32, 8, 64, 64]]                            [2, 32, 8, 64, 64]                     128      ReLU-5                   [[2, 32, 8, 64, 64]]                            [2, 32, 8, 64, 64]                      0       Conv3D-6                  [[2, 32, 8, 64, 64]]                            [2, 64, 8, 64, 64]                   55,360     BatchNorm3D-6               [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                     256      ReLU-6                   [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                      0       conv_block-3                [[2, 32, 8, 64, 64]]                            [2, 64, 8, 64, 64]                      0       MaxPool3D-3                [[2, 64, 8, 64, 64]]                            [2, 64, 4, 32, 32]                      0       Down-3                   [[2, 32, 8, 64, 64]]                 [[2, 64, 8, 64, 64], [2, 64, 4, 32, 32]]           0       Conv3D-7                  [[2, 64, 4, 32, 32]]                            [2, 64, 4, 32, 32]                   110,656    BatchNorm3D-7               [[2, 64, 4, 32, 32]]                            [2, 64, 4, 32, 32]                     256      ReLU-7                   [[2, 64, 4, 32, 32]]                            [2, 64, 4, 32, 32]                      0       Conv3D-8                  [[2, 64, 4, 32, 32]]                           [2, 128, 4, 32, 32]                   221,312    BatchNorm3D-8              [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                     512      ReLU-8                  [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                      0       conv_block-4                [[2, 64, 4, 32, 32]]                           [2, 128, 4, 32, 32]                      0       MaxPool3D-4               [[2, 128, 4, 32, 32]]                           [2, 128, 2, 16, 16]                      0       Down-4                   [[2, 64, 4, 32, 32]]                [[2, 128, 4, 32, 32], [2, 128, 2, 16, 16]]          0       Conv3D-9                 [[2, 128, 2, 16, 16]]                           [2, 128, 2, 16, 16]                   442,496    BatchNorm3D-9              [[2, 128, 2, 16, 16]]                           [2, 128, 2, 16, 16]                     512      ReLU-9                  [[2, 128, 2, 16, 16]]                           [2, 128, 2, 16, 16]                      0       Conv3D-10                [[2, 128, 2, 16, 16]]                           [2, 256, 2, 16, 16]                   884,992
BatchNorm3D-10              [[2, 256, 2, 16, 16]]                           [2, 256, 2, 16, 16]                    1,024     ReLU-10                 [[2, 256, 2, 16, 16]]                           [2, 256, 2, 16, 16]                      0       conv_block-5               [[2, 128, 2, 16, 16]]                           [2, 256, 2, 16, 16]                      0       Upsample-1                [[2, 256, 2, 16, 16]]                           [2, 256, 4, 32, 32]                      0       Conv3D-11                [[2, 384, 4, 32, 32]]                           [2, 128, 4, 32, 32]                  1,327,232
BatchNorm3D-11              [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                     512      ReLU-11                 [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                      0       Conv3D-12                [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                   442,496
BatchNorm3D-12              [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                     512      ReLU-12                 [[2, 128, 4, 32, 32]]                           [2, 128, 4, 32, 32]                      0       conv_block-6               [[2, 384, 4, 32, 32]]                           [2, 128, 4, 32, 32]                      0       Up-1         [[2, 256, 2, 16, 16], [2, 128, 4, 32, 32]]                [2, 128, 4, 32, 32]                      0       Upsample-2                [[2, 128, 4, 32, 32]]                           [2, 128, 8, 64, 64]                      0       Conv3D-13                [[2, 192, 8, 64, 64]]                            [2, 64, 8, 64, 64]                   331,840
BatchNorm3D-13               [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                     256      ReLU-13                  [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                      0       Conv3D-14                 [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                   110,656
BatchNorm3D-14               [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                     256      ReLU-14                  [[2, 64, 8, 64, 64]]                            [2, 64, 8, 64, 64]                      0       conv_block-7               [[2, 192, 8, 64, 64]]                            [2, 64, 8, 64, 64]                      0       Up-2         [[2, 128, 4, 32, 32], [2, 64, 8, 64, 64]]                  [2, 64, 8, 64, 64]                      0       Upsample-3                 [[2, 64, 8, 64, 64]]                          [2, 64, 16, 128, 128]                     0       Conv3D-15               [[2, 96, 16, 128, 128]]                         [2, 32, 16, 128, 128]                  82,976
BatchNorm3D-15             [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                    128      ReLU-15                [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                     0       Conv3D-16               [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                  27,680
BatchNorm3D-16             [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                    128      ReLU-16                [[2, 32, 16, 128, 128]]                         [2, 32, 16, 128, 128]                     0       conv_block-8              [[2, 96, 16, 128, 128]]                         [2, 32, 16, 128, 128]                     0       Up-3        [[2, 64, 8, 64, 64], [2, 32, 16, 128, 128]]               [2, 32, 16, 128, 128]                     0       Upsample-4               [[2, 32, 16, 128, 128]]                         [2, 32, 32, 256, 256]                     0       Conv3D-17               [[2, 48, 32, 256, 256]]                         [2, 16, 32, 256, 256]                  20,752
BatchNorm3D-17             [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                    64       ReLU-17                [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                     0       Conv3D-18               [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                   6,928
BatchNorm3D-18             [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                    64       ReLU-18                [[2, 16, 32, 256, 256]]                         [2, 16, 32, 256, 256]                     0       conv_block-9              [[2, 48, 32, 256, 256]]                         [2, 16, 32, 256, 256]                     0       Up-4       [[2, 32, 16, 128, 128], [2, 16, 32, 256, 256]]             [2, 16, 32, 256, 256]                     0       Conv3D-19               [[2, 16, 32, 256, 256]]                          [2, 2, 32, 256, 256]                    34
===============================================================================================================================
Total params: 4,122,466
Trainable params: 4,117,570
Non-trainable params: 4,896
-------------------------------------------------------------------------------------------------------------------------------
Input size (MB): 16.00
Forward/backward pass size (MB): 11465.00
Params size (MB): 15.73
Estimated Total Size (MB): 11496.73
-------------------------------------------------------------------------------------------------------------------------------{'total_params': 4122466, 'trainable_params': 4117570}

设置优化器和loss

from PP3DSeg.models.losses.cross_entropy_loss import CrossEntropyLoss
BATCH_SIZE = 2
EPOCHS = 100
decay_steps = int(len(train_dataset)/BATCH_SIZE * EPOCHS)
iters = decay_steps
# 设置学习率
base_lr = 0.02
lr = paddle.optimizer.lr.PolynomialDecay(learning_rate=base_lr, decay_steps=decay_steps, verbose=False)
optimizer = paddle.optimizer.Momentum(lr, parameters=model.parameters())losses = {}
losses['types'] = [CrossEntropyLoss()]
losses['coef'] = [1]

开始训练

from PP3DSeg.core import train
train(model=model,train_dataset=train_dataset,val_dataset=val_dataset,optimizer=optimizer,save_dir='/home/aistudio/MyOutput',iters=iters,batch_size=BATCH_SIZE,save_interval=11,log_iters=2,num_workers=0,losses=losses,use_vdl=True)

验证训练效果

import paddle
from PP3DSeg.core import evaluate
model = model = Unet3d(in_channels=1, num_filters=16, class_num=2)
# model_path = '/home/aistudio/MyOutput/best_model/model.pdparams'
#这是我训练的模型,记得用会上面的路径
model_path = '/home/aistudio/MyBestModel/model.pdparams'
para_state_dict = paddle.load(model_path)
model.set_dict(para_state_dict)
evaluate(model,val_dataset)
2021-10-31 21:55:36 [INFO]   Start evaluating (total_samples: 2, total_iters: 2)...2/2 [==============================] - 2s 995ms/step - batch_cost: 0.9940 - reader cost: 0.98232021-10-31 21:55:39 [INFO]   [EVAL] #Images: 2 mIoU: 0.9161 Acc: 0.9850 Kappa: 0.9098
2021-10-31 21:55:39 [INFO]  [EVAL] Class IoU:
[0.9837 0.8485]
2021-10-31 21:55:39 [INFO]  [EVAL] Class Acc:
[0.9933 0.9037](0.9160656,0.98502254,array([0.9836514 , 0.84847975], dtype=float32),array([0.99334145, 0.90370494], dtype=float32),0.9097904048554073)

加载模型进行推理

并对预测的mask进行大小还原

import matplotlib.pyplot as plt
import numpy as np
import SimpleITK as sitk
import paddle
from PP3DSeg.transforms import transforms as T
from PP3DSeg.core import infer
from PP3DSeg.models.unet3d import Unet3ddef readNii(path,flipud=False):#读取nii文件并转换成numpydata = sitk.ReadImage(path)data = sitk.GetArrayFromImage(data)if flipud:#是否上下翻转data = np.flip(data,1)return datadef restore(im,target_size,model='nearest'):"把预测的mask还有成原来大小"desired_depth = depth = target_size[0]desired_width = width = target_size[1]desired_height = height = target_size[2]current_depth = im.shape[0]current_width = im.shape[1]current_height = im.shape[2]depth = current_depth / desired_depthwidth = current_width / desired_widthheight = current_height / desired_heightdepth_factor = 1 / depthwidth_factor = 1 / widthheight_factor = 1 / heightim = ndimage.zoom(im,(depth_factor,width_factor, height_factor), order=0,mode=model, cval=0.0)return im#显示一个系列图
def show_img(data):plt.figure(figsize=(12,24))row = int(data.shape[0] / 6)+1for i in range(0,data.shape[0]):plt.subplot(row,6,i+1)plt.imshow(data[i,:,:], 'gray')plt.axis('off')plt.subplots_adjust(left=0.0,bottom=0.0,top=1,right=1,wspace =0.0001, hspace =0.0001)#调整子图间距plt.show() test_transforms = T.Compose([T.Normalize(ww=350,wc=60),T.Resize3D(target_size=(48,256,256)),T.ToTensor()
])def nn_infer(model, img, model_path,transforms):#加载模型并预测para_state_dict = paddle.load(model_path)model.set_dict(para_state_dict)img, _ = transforms(img)img = paddle.unsqueeze(img,axis=0)pre = infer.inference(model, img)pred = paddle.squeeze(pre)return pred.astype('uint8')params = '/home/aistudio/MyBestModel/model.pdparams'
model = Unet3d(in_channels=1, num_filters=16, class_num=2)ori_path = '/home/aistudio/work/liver/origin/1.nii'
lab_path = '/home/aistudio/work/liver/masks/1.nii'origin = readNii(img_path)
print("原始图像的形状{}".format(origin.shape))
label = readNii(lab_path)
pre = nn_infer(model, origin, params,test_transforms).numpy()
print("预测mask的形状{}".format(pre.shape))#对预测mask进行大小还原
pre_mask = restore(pre,origin.shape)
print("预测mask的还原后的形状{}".format(pre_mask.shape))
show_img(pre_mask)
原始图像的形状(129, 512, 512)
预测mask的形状(48, 256, 256)
预测mask的还原后的形状(129, 512, 512)

numpy转换nii格式,与原始数据叠加显示效果

ori_path = '/home/aistudio/work/liver/origin/1.nii'
ori_sitkImage = sitk.ReadImage(ori_path)
pre_sitkImage = sitk.GetImageFromArray(pre_mask)
pre_sitkImage.CopyInformation(ori_sitkImage)
#是否保存
#sitk.WriteImage(pre_sitkImage,'/home/aistudio/1_pre_mask.nii')
new_data= sitk.LabelOverlay(ori_sitkImage, pre_sitkImage, opacity=0.01)
data = sitk.GetArrayFromImage(new_data)
d = data.shape[0]plt.figure(figsize=(12,12))
for index,i in enumerate(range(int(d/2)-6,int(d/2)+6)) :plt.subplot(4,3,index+1)plt.imshow(data[i,...])plt.axis('off')plt.subplots_adjust(left=0.0,bottom=0.0,top=1,right=1,wspace =0.0001, hspace =0.0001)#调整子图间距
plt.show()
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

个人介绍

个人介绍
广州某医院的放射科的一名放射技师。

只是一位编程爱好者

只是想把自己的爱好融入工作中

只是想让自己通过努力获取成就和快乐

欢迎更多志同道合的朋友一起玩耍~~~

我在AI Studio上获得至尊等级,点亮10个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/181096

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

【PP3DSeg】基于PaddleSeg实现3DUnet分割肝脏相关推荐

  1. 基于PaddleSeg的眼底血管分割——使用飞桨助力医学影像分析

    基于PaddleSeg的眼底血管分割--使用飞桨助力医学影像分析 一.项目背景 研究表明,各类眼科疾病以及心脑血管疾病会对视网膜血管造成形变.出血等不同程度的影响.随着生活水平的提高,这类疾病的发病率 ...

  2. 一文掌握遥感地块变化检测(基于PaddleSeg实现)

    目录 一.概述 二.数据准备 三.训练和评估 3.1 环境准备 3.2 模型原理概述 3.3 训练和评估 四.测试及可视化 五.与其它模型比对 5.1 模型代码修改 5.2 模型性能比对 参考文献 一 ...

  3. segMatch:基于3D点云分割的回环检测

    该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...

  4. 腾讯ARC、华中科大联合提出QueryInst,开启基于Query的实例分割新思路

    视学算法专栏 机器之心编辑部 实例分割(Instance Segmentation)任务有着广阔的应用和发展前景.来自腾讯 PCG 应用研究中心 (ARC)和华中科技大学的研究者们通过充分挖掘并利用Q ...

  5. 开启基于Query的实例分割新思路!腾讯华科提出QueryInst

    来源:机器之心 实例分割(Instance Segmentation)任务有着广阔的应用和发展前景.来自腾讯 PCG 应用研究中心 (ARC)和华中科技大学的研究者们通过充分挖掘并利用Query在端到 ...

  6. ICCV 2021 | 腾讯、华中科大提出QueryInst,开启基于Query的实例分割新思路

    ©作者 | 机器之心编辑部 来源 | 机器之心 实例分割(Instance Segmentation)任务有着广阔的应用和发展前景.来自腾讯 PCG 应用研究中心 (ARC) 和华中科技大学的研究者们 ...

  7. pupload 文件分块 php,基于Plupload实现Base64分割的文件上传方案

    标题:基于Plupload实现Base64分割的文件上传方案 关键词:文件上传.Base64.Plupload.Blob.分割上传 领域:Web前端 作者:孙振强 日期:2018-04-13 目录 背 ...

  8. Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...

    关注公众号,发现CV技术之美 ▊ 写在前面 在本文中,作者解决的任务是基于文本的实例分割(referring segmentation,RES).在这个任务中,作为query的文本通常描述了实例之间的 ...

  9. 基于vc的数字图像分割——基于阙值的分割方法

    图像分割的依据是认为图像中各区域具有不同的特性(比如,灰度,颜色,纹理).图像分割的目的是将图像划分成若干个具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构 ...

最新文章

  1. [kuangbin带你飞]专题四 最短路练习 B( POJ 2253) Frogger(spfa)
  2. AviCAD 2020 Pro v20.0中文版
  3. GCD 深入理解:第一部分
  4. 端云互联 3.0 击破云原生开发的痛点
  5. shell scripts 之 代码量统计
  6. android设置title_所见即所得的 Android 自动化神器,用 Automate 一键收藏文章
  7. python鸭制作类代码_Python动态语言与鸭子类型详解
  8. “算法”的茧房,如何破局?
  9. 用nohup执行python程序时,print无法输出
  10. jquery 获取和设置 select下拉框的值
  11. Atitit.研发管理如何避免公司破产倒闭的业务魔咒
  12. Javascript的一个生产PDF的库: unicode和中文问题的解决
  13. css中怎么改变图片尺寸,CSS也可以改变图片幅面尺寸
  14. 计算机专业电子技术基础教学,计算机专业“电子技术基础”教学上的难题及对策.doc...
  15. 查找微信公众号服务器地址,手把手教大家搭建微信公众号查题功能
  16. 中国数码纺织印花染料行业运行态势与投资前景预测报告2022-2027
  17. stm32学习笔记---STM32F4知识
  18. Unity多块屏幕显示设置以及分辨率设置
  19. casperjs ajax请求,CasperJs中的sendAJAX数据参数
  20. macbook linux 双系统,macbookair双系统怎么切换使用?macbookair双系统切换使用的方法...

热门文章

  1. 热分析技术——热重TG 差热DSC(一)
  2. MSDN Library for Visual Studio 2008 SP1 下载
  3. idv和vdi的优劣势_VDI,IDV,VOI究竟有何不同
  4. STM32F429的LTDC和DMA2D
  5. 夸克浏览器触屏模式开启de方法
  6. 群晖Nas通过jellyfin搭建本地影音库详细全过程(四):解析jellyfin视频信息文件NFO
  7. gzip、bzip2、zip、rar、7z、compress 加压、解压
  8. 另类因子:消费交易数据与股票截面收益
  9. 【追光者】今天,来谈谈我的金钱观,却不止于金钱观
  10. gdut极路由破解教程