【人工智能项目】U-Net实战ISBI细胞分割

Unet医学细胞分割实战 如图所示,数据集原始标注为单个细胞,需要运行preprocess_dsb2018.py将标注整合到一张图片中。 阅读详情
AI摘要

本文介绍使用U-Net模型进行细胞图像分割的过程。实验基于Tensorflow和Keras框架完成,详细介绍了数据集处理、模型搭建及训练技巧,并展示了测试结果。

【人工智能项目】U-Net实战ISBI细胞分割

一、 实验配置及其参数

本实验采用的软硬件实验环境如表所示:
在这里插入图片描述

在Ubuntu操作系统下,采用基于Tensorflow的Keras的深度学习框架,对ISBI细胞分割数据集进行训练和测试。

采用keras的深度学习框架,keras是一个专为简单的神经网络组装而设计的Python库,具有大量预先包装的网络类型,包括二维和三维风格的卷积网络、短期和长期的网络以及更广泛的一般网络。使用keras构建网络是直接的,keras在其Api设计中使用的语义是面向层次的,网络组建相对直观,所以本次选用Keras人工智能框架,其专注于用户友好,模块化和可扩展性。

二、 数据集

本次数据集来自ISBI挑战的数据集http://brainiac2.mit.edu/isbi_challenge/。
数据集为30张训练图,30张对应的标签。30张测试图片,图片均为.tif格式文件。其具体效果如下所示:
在这里插入图片描述

三、 源码架构

Unet

  • data
    • membrane
      • train:包含训练集的图片以及标签
      • test:包含测试集的图片以及标签
  • logs:日志信息,用于tensorboard可视化展示
  • trainUnet.ipynb:训练以及测试过程
  • data.py:读取数据封装的函数
  • model.py:unet网络函数
  • unet.membrane.hdf5:训练得到的权重信息

UNet介绍

本次使用U-Net作为医疗影像分割的模型。下面主要介绍一下U-Net作为图像分割算法的优势。

U-Net架构包括一个捕获上下文信息的收缩路径和一个支持精确本地化的对称扩展路径。U-Net证明了这样一个网络使用非常小的图像可以进行端到端的训练,并在生物分割挑战赛中取得了比以前最好的方法。

在这里插入图片描述
(1)收缩路径由2个3 * 3的卷积组成,每个卷积后面跟的是RELU激活函数和一个进行下采样的2 * 2较大池化运算。
(2)扩张阶段包括一个特征通道的上采样。后面跟得上是2 * 2的转置卷积,它能够将特征通道数目减半,同时加大特征图。
(3)最后一层是1 * 1卷积,用这种卷积来组成的特征向量映射到需要的类别数量上。
具体而言来讲:

  • a.U-Net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少的训练图像就能得到很精确的分割结果。
    • b.添加上采样阶段,并且添加了很多的特征通道,允许更多的原图像纹理的信息在高分辨率的layers中进行传播
    • c.U-Net没有FC层,且全程使用valid来进行卷积,这样的话可以保证分割的结果都是基于没有缺失的上下文特征得到的,因此输入输出的图像尺寸不太一样(但在keras上代码做的都是same convolution),对于图像很大的输入,可以使用overlap-strategy来进行无缝的图像输出.
  • d.为了预测输入图像的边缘部分,通过镜像输入图像来外推丢失的上下文,实则输入大图像也是可以的,但是这个侧率基于GPU内存不够的情况下所提出的。
  • e.细胞分割的另外一个难点在于将相同类别且互相接触的细胞分开,因此提出weighted loss,也就是赋予相互接触的两个细胞之间的background标签更高的权重。

其创新点总结为:

  • 1.U-Net简单地将编码器的特征图拼接至每个阶段解码器对的上采样特征图,从而形成一个梯形结构。
  • 2.通过跳跃拼接连接的架构,在每个阶段都允许解码器学习在编码器中丢失的相关特征。
  • 3.上采样采用转置卷积

data.py

负责读取数据

from __future__ import print_function
from keras.preprocessing.image import ImageDataGenerator
import numpy as np 
import os
import glob
import skimage.io as io
import skimage.transform as trans

Sky = [128,128,128]
Building = [128,0,0]
Pole = [192,192,128]
Road = [128,64,128]
Pavement = [60,40,222]
Tree = [128,128,0]
SignSymbol = [192,128,128]
Fence = [64,64,128]
Car = [64,0,128]
Pedestrian = [64,64,0]
Bicyclist = [0,128,192]
Unlabelled = [0,0,0]

COLOR_DICT = np.array([Sky, Building, Pole, Road, Pavement,
                          Tree, SignSymbol, Fence, Car, Pedestrian, Bicyclist, Unlabelled])


def adjustData(img,mask,flag_multi_class,num_class):
    if(flag_multi_class):
        img = img / 255
        mask = mask[:,:,:,0] if(len(mask.shape) == 4) else mask[:,:,0]
        new_mask = np.zeros(mask.shape + (num_class,))
        for i in range(num_class):
            #for one pixel in the image, find the class in mask and convert it into one-hot vector
            #index = np.where(mask == i)
            #index_mask = (index[0],index[1],index[2],np.zeros(len(index[0]),dtype = np.int64) + i) if (len(mask.shape) == 4) else (index[0],index[1],np.zeros(len(index[0]),dtype = np.int64) + i)
            #new_mask[index_mask] = 1
            new_mask[mask == i,i] = 1
        new_mask = np.reshape(new_mask,(new_mask.shape[0],new_mask.shape[1]*new_mask.shape[2],new_mask.shape[3])) if flag_multi_class else np.reshape(new_mask,(new_mask.shape[0]*new_mask.shape[1],new_mask.shape[2]))
        mask = new_mask
    elif(np.max(img) > 1):
        img = img / 255
        mask = mask /255
        mask[mask > 0.5] = 1
        mask[mask <= 0.5] = 0
    return (img,mask)



def trainGenerator(batch_size,train_path,image_folder,mask_folder,aug_dict,image_color_mode = "grayscale",
                    mask_color_mode = "grayscale",image_save_prefix  = "image",mask_save_prefix  = "mask",
                    flag_multi_class = False,num_class = 2,save_to_dir = None,target_size = (256,256),seed = 1):
    '''
    can generate image and mask at the same time
    use the same seed for image_datagen and mask_datagen to ensure the transformation for image and mask is the same
    if you want to visualize the results of generator, set save_to_dir = "your path"
    '''
    image_datagen = ImageDataGenerator(**aug_dict)
    mask_datagen = ImageDataGenerator(**aug_dict)
    image_generator = image_datagen.flow_from_directory(
        train_path,
        classes = [image_folder],
        class_mode = None,
        color_mode = image_color_mode,
        target_size = target_size,
        batch_size = batch_size,
        save_to_dir = save_to_dir,
        save_prefix  = image_save_prefix,
        seed = seed)
    mask_generator = mask_datagen.flow_from_directory(
        train_path,
        classes = [mask_folder],
        class_mode = None,
        color_mode = mask_color_mode,
        target_size = target_size,
        batch_size = batch_size,
        save_to_dir = save_to_dir,
        save_prefix  = mask_save_prefix,
        seed = seed)
    train_generator = zip(image_generator, mask_generator)
    for (img,mask) in train_generator:
        img,mask = adjustData(img,mask,flag_multi_class,num_class)
        yield (img,mask)



def testGenerator(test_path,num_image = 30,target_size = (256,256),flag_multi_class = False,as_gray = True):
    for i in range(num_image):
        img = io.imread(os.path.join(test_path,"%d.png"%i),as_gray = as_gray)
        img = img / 255
        img = trans.resize(img,target_size)
        img = np.reshape(img,img.shape+(1,)) if (not flag_multi_class) else img
        img = np.reshape(img,(1,)+img.shape)
        yield img


def geneTrainNpy(image_path,mask_path,flag_multi_class = False,num_class = 2,image_prefix = "image",mask_prefix = "mask",image_as_gray = True,mask_as_gray = True):
    image_name_arr = glob.glob(os.path.join(image_path,"%s*.png"%image_prefix))
    image_arr = []
    mask_arr = []
    for index,item in enumerate(image_name_arr):
        img = io.imread(item,as_gray = image_as_gray)
        img = np.reshape(img,img.shape + (1,)) if image_as_gray else img
        mask = io.imread(item.replace(image_path,mask_path).replace(image_prefix,mask_prefix),as_gray = mask_as_gray)
        mask = np.reshape(mask,mask.shape + (1,)) if mask_as_gray else mask
        img,mask = adjustData(img,mask,flag_multi_class,num_class)
        image_arr.append(img)
        mask_arr.append(mask)
    image_arr = np.array(image_arr)
    mask_arr = np.array(mask_arr)
    return image_arr,mask_arr


def labelVisualize(num_class,color_dict,img):
    img = img[:,:,0] if len(img.shape) == 3 else img
    img_out = np.zeros(img.shape + (3,))
    for i in range(num_class):
        img_out[img == i,:] = color_dict[i]
    return img_out / 255



def saveResult(save_path,npyfile,flag_multi_class = False,num_class = 2):
    for i,item in enumerate(npyfile):
        img = labelVisualize(num_class,COLOR_DICT,item) if flag_multi_class else item[:,:,0]
        io.imsave(os.path.join(save_path,"%d_predict.png"%i),img)

model.py

定义模型架构

import numpy as np 
import os
import skimage.io as io
import skimage.transform as trans
import numpy as np
from keras.models import *
from keras.layers import *
from keras.optimizers import *
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as keras


def unet(pretrained_weights = None,input_size = (256,256,1)):
    inputs = Input(input_size)
    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)
    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)
    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)
    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)
    drop4 = Dropout(0.5)(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)

    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)
    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)
    drop5 = Dropout(0.5)(conv5)

    up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5))
    merge6 = concatenate([drop4,up6], axis = 3)
    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)
    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)

    up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))
    merge7 = concatenate([conv3,up7], axis = 3)
    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)
    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)

    up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))
    merge8 = concatenate([conv2,up8], axis = 3)
    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8)
    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8)

    up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8))
    merge9 = concatenate([conv1,up9], axis = 3)
    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)
    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
    conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
    conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)

    model = Model(input = inputs, output = conv10)

    model.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy'])
    
    #model.summary()

    if(pretrained_weights):
    	model.load_weights(pretrained_weights)

    return model



trainUNet

from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import TensorBoard

data_gen_args = dict(rotation_range=0.2,
                    width_shift_range=0.05,
                    height_shift_range=0.05,
                    shear_range=0.05,
                    zoom_range=0.05,
                    horizontal_flip=True,
                    fill_mode='nearest')
myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None)

model = unet()

model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True)
early_stopping = EarlyStopping(monitor="val_loss",
                                                     patience=5,
                                                     verbose=1,
                                                     mode="min")
reduce_lr = ReduceLROnPlateau(monitor="val_loss",
                                                      factor=0.5,
                                                      patience=2,
                                                      verbose=1,
                                                      mode="min")
tbCallBack = TensorBoard(log_dir="./logs")


history = model.fit_generator(myGene,steps_per_epoch=2000,epochs=20,callbacks=[model_checkpoint,early_stopping,reduce_lr,tbCallBack])

在这里插入图片描述
训练过程的曲线图

# 画曲线
import matplotlib.pyplot as plt
%matplotlib inline

def plot_performance(history=None,figure_directory=None,ylim_pad=[0,0]):
    xlabel="Epoch"
    legends=["Training"]
    
    plt.figure(figsize=(20,5))
    
    y1=history.history["acc"]
    
    min_y=min(min(y1),min(y1))-ylim_pad[0]
    max_y=max(max(y1),max(y1))+ylim_pad[0]
    
    plt.subplot(121)
    
    plt.plot(y1)
    
    plt.title("Model Accuracy\n",fontsize=17)
    plt.xlabel(xlabel,fontsize=15)
    plt.ylabel("Accuracy",fontsize=15)
    plt.ylim(min_y,max_y)
    plt.legend(legends,loc="upper left")
    plt.grid()
    
    y1=history.history["loss"]
    
    min_y=min(min(y1),min(y1))-ylim_pad[1]
    max_y=max(max(y1),max(y1))+ylim_pad[1]
    
    plt.subplot(122)
    plt.plot(y1)

    plt.title("Model Loss:\n",fontsize=17)
    plt.xlabel(xlabel,fontsize=15)
    plt.ylabel("Loss",fontsize=15)
    plt.ylim(min_y,max_y)
    plt.legend(legends,loc="upper left")
    plt.grid()
    plt.show()
plot_performance(history)

在这里插入图片描述

Tensorbaord可视化模型
在这里插入图片描述

四、测试过程

testGene = testGenerator("data/membrane/test")
model = unet()
model.load_weights("unet_membrane.hdf5")
results = model.predict_generator(testGene,30,verbose=1)
saveResult("data/membrane/test",results)

测试结果展示
在这里插入图片描述

小结

本次在Ubuntu操作系统下,采用基于Tensorflow的Keras的深度学习框架,对ISBI细胞分割数据集进行训练和测试。

在模型训练过程中,用到U-Net的深度卷积神经网络结构,设定好模型的参数,进行20轮的训练,并用到了keras框架中的一些trick,如modelcheckpoint,early_stropping,reduce_lr,tensorboard_callback等。这些tricks使得模型更易于收敛,且将最好的权重信息保存了出来。

为了验证U-NET模型的鲁棒性,并在测试集上进行了测试,生成了预测的标签图片。

总之,本次通过对u-net医学图像分割的研究流程分析,提出了一套完整的
卷积神经网络医学图像分割流程。其次,本文构建的模型具有普适性,可以稍加改进应用于不同的数据集。此外,本次构建模型考虑了计算资源和时间成本,所以选择了U-Net这个模型。综合以上几点,本次实验使我对医学图像分割有了一定程度的了解。

最后,大家点赞收藏评论走起来呀!!!

Python小项目:利用 U-net 完成细胞图像分割 在这篇文章中,我们深入探索了 U-net 细胞分割项目的关键。通过介绍实验目的、数据集和所需技术,我们详细解释了 U-net 在生物医学图像分割中的作用。通过示例代码,我们展示了如何加载、预处理数据,构建并训练 U-net 模型。最终,我们展示了 U-net 在细胞图像分割中的效果,突显了其重要性和实际应用。这个项目为生物医学领域的研究和诊断提供了有力工具,同时也鼓励更多人参与,为医学科学进步贡献力量。 阅读详情

相关推荐

ISBI 2015细胞分割数据集详解:真值掩膜与实例分割标尺

实例分割是计算机视觉中精准定位并区分同类目标的关键技术,其核心在于像素级身份标识而非简单前景/背景二值化。真值掩膜(ground truth mask)作为监督学习的黄金标准,需承载每个目标的唯一整数ID,支撑Dice系数、平均交并比(mIoU)等评估指标的可靠计算。在生物医学图像分析领域,ISBI 2015数据集以HeLa细胞荧光图像和严格仲裁的多实例标签图为载体,构建了可复现、可验证的基准测试环境,广泛应用于U-Net、Mask R-CNN等模型的性能比对与教学演示。本文深入解析其文件结构、标注逻辑与典

weixin_32495691的博客 189

常用的医学组织切片细胞图像数据集

乳腺癌细胞图像数据集、血细胞图像数据集、HE染色切片、疟疾细胞图像 图像识别、分类、分割

new_0428的博客 2万+

ISBI2012细胞膜分割数据集

ISBI2012细胞膜分割数据集

mmsegmentation中如何输出mask

如果想要输出最终的图像为Mask掩膜,不将原图数据作为背景,可以设置opacity参数为1。如果没有标签的测试集中,在–eval参数中设置为None即可。

weixin_45912366的博客 1901

ISBI 2015 数据集(下)

训练集共160张左右,带标注 测试集也有160左右,但是不带标注,故不上传 资源设置免费,但是担心csdn收费,这里放出原网址 https://cs.adelaide.edu.au/~zhi/isbi15_challenge/dataset.html

ISBI Challenge: Segmentation of neuronal structures in EM stacks

ISBI Challenge: Segmentation of neuronal structures in EM stacks 训练数据有30张,分辨率为512x512,这些图片是果蝇的电镜图。

使用U-Net 进行图像分割

最近做病理AI的细胞计数问题,需要对图像中的各个细胞进行分类,若采用普通的CNN+普通图像分割,估计实现效果不佳。为了解决这个问题,大致有两种方案:目标检测 和 图像分割。目标检测的算法以Faster R-CNN、RetinaNet、YOLO3、SSD等算法为代表;图像分割则以U-Net 等为代表。本文将简述 U-Net。 平时接触较多的是TensorFlow、PyTorch 和 Keras 三...

FanJin的博客 1万+

带mask的血细胞分割数据集2656 张

总共有 2656 张图像可用。1328 个原始血细胞图像以及 1328 个相应的掩膜图像。其中训练集和测试集分别分为 1169 张图像和 159 张图像。

【人工智能】基于U-Net模型的白细胞分割与分类研究

基于深度学习的白细胞分割与检测系统。通过分析现有的白细胞检测方法,发现传统方法在复杂背景下的分割效果不理想。因此,提出了一种改进的卷积神经网络(CNN)模型,结合U-Net架构进行白细胞的分割与分类。 在实验阶段,构建了包含多种类型白细胞的标注数据集,并采用数据增强技术提高模型的泛化能力。实验结果表明,所提出的模型在白细胞分割精度和召回率方面均优于传统方法,且具有良好的鲁棒性和实时性。

Hai_Lang_IT的博客 1123

细胞分割-基于UNet-2D实现的医疗细胞分割算法-附模型下载+项目源码-优质项目分享.zip

细胞分割_基于UNet-2D实现的医疗细胞分割算法_附模型下载+项目源码_优质项目分享

细胞核图像分割数据集(600张,json格式和coco格式标注)

其中包括(600张以上的细胞核图像分割数据集,为医疗图像人工智能等从事者提供数据集,包括json格式和coco格式的标注)

U-net医学图像分割

代码作者一 数据集分割from PIL import Image import os # For the Dataset register at : http://brainiac2.mit.edu/isbi_challenge/ # Download the corresponding data files # Only 30 images are available with ground ...

yuyangyg的博客 4039

深入解析APS开源排程工具OptaPlanner:链式结构与移动优化

本文深入解析了开源APS排程工具OptaPlanner的核心机制,重点阐述了链式结构如何作为排程优化的“骨架”,通过单一`previous`变量隐式定义资源与顺序,从而简化建模。文章详细介绍了基于此结构的移动操作(如`ChainChangeMove`)如何驱动优化引擎探索解空间,并自动触发影子变量更新与分数计算,为构建高效、灵活的生产计划系统提供了实践指导。

keras9composer的博客 298

实战项目:基于 U-Net 的图像分割案例

图像分割是一种将图像划分为不同区域或对象的过程。它通常在像素级别进行,通过将图像中具有相似特征的区域分组或定义对象的边界来完成。这是一种识别和解析图像中不同对象或特征的方法。假设一位医学专业人士正在检查脑部扫描图像,试图找到潜在的癌性病变。这就是图像分割发挥作用的地方。分割过程用于识别图像中的不同组织和结构,在区分癌细胞和其他正常组织方面发挥着重要作用。例如,在下面的脑部扫描图像中,分割已经识别出癌性肿瘤并以不同的颜色显示。

2401_84033492的博客 2003

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 516

kaggle——销量预测的baseline(M5 Forecasting - Accuracy)

前言 在刚刚结束的kaggle比赛M5 Forecasting - Accuracy中,因为是第一次参加,笔者也是花了大量的时间和精力在上面,最终拿到一块银牌(所以我拿到了大学第一个考试挂科。。。求求电磁场老师高抬贵手给点平时分放我一马吧。。。早上看到kaggle成绩异常兴奋,中午考完直接爆炸=。=),当然运气占了很大因素,这次比赛private leadboard的shake up非常大,排名波动几千名都存在的。笔者运气不错,是向上的shake:)。这里总结一下销量预测的基本流程。 从下图可以看到这次比

weixin_43901221的博客 5433

U-Net卷积网络(图像分割)

最近由于工作项目的原因,需要研究U-Net卷积网络,在这里将自己学习成果和大家分享一下,欢迎大家提问交流。U-Net网络提出基于论文U-Net: Convolutional Networks for Biomedical Image Segmentation(论文:https://pan.baidu.com/s/1iinUuPlbWTiPQXgoI0WC6w,代码:https:/...

图灵追幕者博客录 1万+

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。

专注生信领域 2027

基于U-Net的的图像分割代码详解及应用实现

摘要 u-net是卷积网络体系结构,用于快速,精确地分割图像。 U-Net是一种卷积神经网络(CNN)方法,由Olaf Ronneberger,Phillip Fischer和Thomas Brox于2015年首次提出,其建议是对生物医学图像进行更好的分割。 ...

haosen 1万+

【DeepSeek开发入门】DeepSeek API 开发初体验

在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。

寻道AI,探索AI无限可能! 2764

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4681

细胞图像分割实战:用U-Net模型自动识别显微镜图像中的细胞

细胞图像分割是生物医学研究中的基础任务,对于细胞计数、形态分析和病理诊断至关重要。传统的手工分析方法耗时耗力且容易产生主观偏差。本文将详细介绍如何使用深度学习中的U-Net模型实现显微镜图像的自动细胞分割。内容涵盖数据标注方法与技巧、U-Net模型原理与实现、模型训练策略以及分割性能评估。通过完整的代码实现和实战案例,读者将掌握从数据准备到模型部署的全流程,实现显微镜图像的自动化分析,提高研究效率和准确性。

AladdinEdu,你的AI学习实践工作坊。让想法落地,让研究加速。助力高校AI人才成长,点亮创新未来。 767

基于STM32L4XX、HAL库的E180-ZG120B ZigBee模块驱动程序设计

/ 频率: 470MHz, SF7, BW125kHz, CR4/5, 功率14dBm。// 检查是否收到完整响应(根据实际情况调整)// 每5秒发送一次。PB0 <---> AUX (可选,用于状态检测)// 实际发送命令可能需要根据模块AT指令集调整。PC13 <---> RESET (可选)// 处理接收到的数据。// 缓冲区满,从头开始。// 其他必要的HAL库初始化代码...// 初始化E180模块。// 启动UART接收。// 如果需要等待响应。// 配置LoRa参数。

zhusl6688的博客 382

U-Net在细胞膜分割中的实战应用:从零开始的完整指南

U-Net深度学习框架在生物医学图像分割领域发挥着重要作用,特别是细胞膜分割任务。本文将详细介绍如何使用U-Net实现细胞膜分割,从数据准备到模型训练再到结果分析,为你提供一套完整的解决方案。🎯 ## 什么是U-Net图像分割? U-Net是一种基于编码器-解码器架构的卷积神经网络,专门为生物医学图像分割而设计。它通过跳跃连接将编码器中的特征图与解码器中的对应层连接起来,有效保留了空间信息,

gitblog_00510的博客 725

ESP32-S3 调试经验:使用 ESP-PROG 与内置 USB-JTAG

关键词:ESP32 调试、ESP32-S3、ESP-PROG、JTAG、VSCode、OpenOCD、GDB作为一个前端开发转硬件调试新手,我最近花了不少时间在上。因为国内开发者常用 ESP32 做 IoT 项目,但大多数教程都比较零散,有些还过时,所以我决定把这次调试经历整理下来,希望能帮到后来人。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1227

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

3步构建细胞膜分割系统:基于U-Net的医学影像分析实战指南

在生物医学图像分析领域,细胞膜分割是理解细胞结构和功能的关键技术。传统方法依赖人工标注,耗时耗力且难以保证一致性。本指南基于经典的U-Net架构,提供一套完整的端到端解决方案,通过3个核心步骤实现高精度细胞膜分割,在ISBI挑战赛数据集上达到97%的准确率。 ## 挑战:小样本数据集下的深度学习困境 医学影像分析面临的首要挑战是数据稀缺。原始数据集仅包含30张512×512的电子显微镜图像,这

gitblog_00814的博客 706

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 【人工智能项目】Bert实现阅读理解
下一篇: 【人工智能项目】MNIST手写体识别实验及分析
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值