通过FCN模型实现图像分割(Python篇+代码)

基于深度学习的图像分割方法

深度学习是在超声图像分割中非常实用的方法,它的主要优点是能够生成由丰富语义和细微信息组成的多层次特征。将深度学习网络应用到甲状腺检测中,可以准确、快速的定位并对结节和实质区域进行精准勾画。

使用深度神经网络的原因是神经网络是一种多层的、可训练的模型,这样的话,它就能对图像中的甲状腺结点起到分类效果,且通过一定量的正则化训练,神经网络的性能也将愈加优异,对图像的分类也更加精准。

为了对甲状腺结节进行更加精确的分割,有人提出了全卷积神经网络(FCN),将经典卷积神经网络CNN末尾的全连接层用卷积层代替,使得整个网络主要包括卷积层和池化层,对不同采样率的空洞卷积的特征图进行采样融合,从而起到分割效果,下面我将介绍如何通过FCN模型实现图像分割。

FCN模型实现图像分割的流程

注:我这里是用pycharm来编写和运行程序的,然后解释器选择的是Conda3,需要的库,如CV之类的,你们看着安装,学会第一个,其他的应该很快就能成功.

一、模型的构建:

模型的构建的一个关键就是用到了tensorflow库,没有安装的小伙伴可以看我之前的文章,可以通过里面的函数,定义模型的输入层、卷积层、池化层、反卷积层、输出层,经过各个步骤,模型就能构建出来,这里有一个地方得非常注意,输出层的activation函数千万别选softmax,一定要选sigmoid,别问我为什么知道。

二、数据集的预处理:

我获取到的数据集是由图像和掩膜两部分组成,数据集的处理就是将掩膜(灰度为白255和黑0)映射为前景(1)和背景(0)的标签,将标签转换成单通道,同时将图像转换为RGB、进行 min-max 归一化,并将它们转换为两个numpy数组。

三、构建模型、编译模型、训练模型:

在这之中,我们需要特别关注的是模型的编译以及模型的训练,在模型的编译之中,我们得选取合适的优化器,这里我通过多次测试,发现选择使用Adam优化器效果最好,然后是选择学习率,学习率过小->收敛过慢;学习率过大->错过局部最优,我选择0.001,损失函数选择二元交叉熵(binary_crossentropy),以准确率(accuracy)作为评价指标。

在模型的训练中,可以定义一个监测器,当训练迭代5次的loss都不再减小时,那么就说明训练的模型基本上已经达到当前的最优模型,需要停止训练,输入的参数就是图像、标签、迭代次数、验证集(不能和测试集一样,可以将部分的数据集分离出来定义成验证集,其他的归为测试集)、以及callbacks监视器。

最后,记得保存训练后的模型,毕竟训练一次非常耗时。

训练模型的代码:

import tensorflow as tf
import cv2
import numpy as np
import os
from keras.optimizers import Adam

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 构建FCN模型
def fcn_model(input_shape, num_classes):
    # 定义输入层
    inputs = tf.keras.layers.Input(shape=input_shape)

    # 定义卷积层
    conv1 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
    conv2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)

    # 定义池化层
    pool1 = tf.keras.layers.MaxPooling2D((2, 2))(conv2)

    # 定义更深的卷积层和池化层
    conv3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
    conv4 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(conv3)
    pool2 = tf.keras.layers.MaxPooling2D((2, 2))
  • 12
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
好的,下面是基于FCN模型实现图像分割Python代码,以VOC2012数据集为例: ``` import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from PIL import Image # 定义FCN模型 def FCN(input_shape, num_classes): inputs = tf.keras.layers.Input(input_shape) conv1 = tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu')(inputs) conv2 = tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu')(conv1) pool1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv2) conv3 = tf.keras.layers.Conv2D(128, 3, padding='same', activation='relu')(pool1) conv4 = tf.keras.layers.Conv2D(128, 3, padding='same', activation='relu')(conv3) pool2 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv4) conv5 = tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu')(pool2) conv6 = tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu')(conv5) conv7 = tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu')(conv6) pool3 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv7) conv8 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(pool3) conv9 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(conv8) conv10 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(conv9) pool4 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv10) conv11 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(pool4) conv12 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(conv11) conv13 = tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu')(conv12) pool5 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv13) conv14 = tf.keras.layers.Conv2D(4096, 7, padding='same', activation='relu')(pool5) conv15 = tf.keras.layers.Conv2D(4096, 1, padding='same', activation='relu')(conv14) conv16 = tf.keras.layers.Conv2D(num_classes, 1, padding='same')(conv15) upsample = tf.keras.layers.Conv2DTranspose(num_classes, kernel_size=(64, 64), strides=(32, 32), padding='same')(conv16) outputs = tf.keras.layers.Activation('softmax')(upsample) model = tf.keras.models.Model(inputs=inputs, outputs=outputs) return model # 定义损失函数 def dice_loss(y_true, y_pred): numerator = 2 * tf.reduce_sum(y_true * y_pred, axis=(1, 2, 3)) denominator = tf.reduce_sum(y_true + y_pred, axis=(1, 2, 3)) loss = 1 - numerator / denominator return loss # 定义数据增强技术 def data_augmentation(image, mask): image = tf.image.random_brightness(image, 0.2) image = tf.image.random_contrast(image, 0.5, 1.5) image = tf.image.random_flip_left_right(image) image = tf.image.random_flip_up_down(image) mask = tf.image.random_brightness(mask, 0.2) mask = tf.image.random_contrast(mask, 0.5, 1.5) mask = tf.image.random_flip_left_right(mask) mask = tf.image.random_flip_up_down(mask) return image, mask # 加载数据集 def load_data(): train_images = np.load('train_images.npy') train_masks = np.load('train_masks.npy') val_images = np.load('val_images.npy') val_masks = np.load('val_masks.npy') return train_images, train_masks, val_images, val_masks # 训练模型 def train_model(model, train_images, train_masks, val_images, val_masks, batch_size, epochs): train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_masks)) train_dataset = train_dataset.shuffle(buffer_size=1000) train_dataset = train_dataset.map(data_augmentation) train_dataset = train_dataset.batch(batch_size) val_dataset = tf.data.Dataset.from_tensor_slices((val_images, val_masks)) val_dataset = val_dataset.batch(batch_size) model.compile(optimizer='adam', loss=dice_loss, metrics=['accuracy']) history = model.fit(train_dataset, epochs=epochs, validation_data=val_dataset) return history # 测试模型 def test_model(model, images): masks = model.predict(images) masks = np.argmax(masks, axis=-1) return masks # 可视化分割结果 def visualize_results(images, masks): num_images = images.shape[0] fig, axes = plt.subplots(nrows=num_images, ncols=2, figsize=(10, 10)) for i in range(num_images): axes[i, 0].imshow(images[i]) axes[i, 1].imshow(masks[i]) plt.show() if __name__ == '__main__': input_shape = (256, 256, 3) num_classes = 21 batch_size = 16 epochs = 50 model = FCN(input_shape, num_classes) train_images, train_masks, val_images, val_masks = load_data() history = train_model(model, train_images, train_masks, val_images, val_masks, batch_size, epochs) test_images = np.load('test_images.npy') masks = test_model(model, test_images) visualize_results(test_images, masks) ``` 需要注意的是,以上代码仅供参考,具体实现细节可能会有所不同,需要根据具体情况进行调整。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值