首页 > 其他分享 >深度学习-卷积神经网络--Unet训练推理-60

深度学习-卷积神经网络--Unet训练推理-60

时间:2024-03-30 11:11:19浏览次数:15  
标签:layers padding keras -- activation same 60 Unet tf

目录

    网络结构

    import tensorflow as tf
    import os
    import sys
    
    import numpy as np
    
    from tqdm import tqdm
    from itertools import chain
    
    from skimage.io import imread, imshow
    
    from skimage.transform import resize
    import random
    import matplotlib.pyplot as plt
    
    
    print(tf.__version__)
    """
    tf.enable_eager_execution() 方法是用来启用 TensorFlow 的动态图机制的。在 TensorFlow 的早期版本中,
    TensorFlow 的计算图是静态的,需要先定义计算图,然后再运行计算图。而动态图机制则是在运行时动态地构建计算图,
    这使得 TensorFlow 更加易于使用和调试。
    
    启用动态图机制后,TensorFlow 可以像普通 Python 代码一样执行计算,同时也可以使用 TensorFlow 提供的各种 API 和工具来构建和训练模型。
    此外,动态图机制还支持更灵活的控制流和条件语句,使得模型的定义更加自由和灵活。 
    TensorFlow2.0中将对部分机制做出重大调整,其中之一就是将原有的静态图机制调整为动态图机制,
    这将使得TensorFlow更加灵活和易用,在2.0版本到来之前,我们可以通过 tf.enable_eager_execution() 方法来启用动态图机制
    """
    IMG_WIDTH = 128
    IMG_HEIGHT = 128
    IMG_CHANNELS = 3
    
    DATA_PATH = 'stage1_train/'
    
    seed = 42
    random.seed = seed
    np.random.seed = seed
    
    image_ids = next(os.walk(DATA_PATH))[1]
    
    # X Y的初始化
    X = np.zeros((len(image_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
    Y = np.zeros((len(image_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)  # 就是一个单通道的 image
    
    
    # tqdm 是一个 Python 库,用于进度条的可视化,可以用于在 Python 程序中显示进度。
    # 在这个特定的代码中,tqdm 被用来显示在循环中的进度。
    # 具体来说,代码中的`enumerate(image_ids)`会返回一个可迭代的对象,每次迭代都会返回一个索引和对应的元素。
    # `tqdm(enumerate(image_ids), total=len(image_ids))`会将这个可迭代对象和总数作为参数传递给`tqdm`函数,
    # 然后`tqdm`函数会返回一个进度条的可视化对象,可以用来显示循环的进度。
    # 在这个特定的代码中,进度条会显示每次迭代的索引和总数,以及当前迭代的进度。
    for n, id_ in tqdm(enumerate(image_ids), total=len(image_ids)):
        path = DATA_PATH + id_
        img = imread(path + '/images/' + id_ + '.png')[:, :, :IMG_CHANNELS]
        img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant',
                     preserve_range=True)
        X[n] = img
    
        mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)
        for mask_file in next(os.walk(path + '/masks/'))[2]:
            mask_ = imread(path + '/masks/' + mask_file)
            mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant',
                                          preserve_range=True), axis=-1)
            mask = np.maximum(mask, mask_)
        Y[n] = mask
    
    x_train = X
    y_train = Y
    
    """
    读取图像数据和对应的掩膜数据,并将它们存储在X和Y数组中,以便用于训练图像分割模型。具体来说,它做了以下几个步骤:
    读取数据路径下的所有图像id,并将它们存储在image_ids数组中。
    对于每个图像id,读取该图像的原始数据,并将其调整为指定的高度和宽度,存储在X数组中。
    对于每个图像id,读取该图像对应的所有掩膜数据,并将它们合并成一个掩膜图像,存储在Y数组中。
    最后,将X和Y数组分别存储在x_train和y_train变量中,以便用于训练模型。
    """
    
    # Build U-Net model
    inputs = tf.keras.layers.Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
    s = tf.keras.layers.Lambda(lambda x: x / 255)(inputs)
    
    
    c1 = tf.keras.layers.Conv2D(16, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(s)
    c1 = tf.keras.layers.Dropout(0.1)(c1)
    c1 = tf.keras.layers.Conv2D(16, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding="same")(c1)
    p1 = tf.keras.layers.MaxPooling2D((2, 3))(c1)
    
    c2 = tf.keras.layers.Conv2D(32, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(p1)
    c2 = tf.keras.layers.Dropout(0.1)(c2)
    c2 = tf.keras.layers.Conv2D(32, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c2)
    p2 = tf.keras.layers.MaxPooling2D((2, 2))(c2)
    
    c3 = tf.keras.layers.Conv2D(64, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(p2)
    c3 = tf.keras.layers.Dropout(0.2)(c3)
    c3 = tf.keras.layers.Conv2D(64, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c3)
    p3 = tf.keras.layers.MaxPooling2D((2, 2))(c3)
    
    c4 = tf.keras.layers.Conv2D(128, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(p3)
    c4 = tf.keras.layers.Dropout(0.2)(c4)
    c4 = tf.keras.layers.Conv2D(128, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c4)
    p4 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(c4)
    
    c5 = tf.keras.layers.Conv2D(256, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(p4)
    c5 = tf.keras.layers.Dropout(0.3)(c5)
    c5 = tf.keras.layers.Conv2D(256, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c5)
    
    # c5上采样之后与c4 拼接 再接两次卷积
    u6 = tf.keras.layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)
    u6 = tf.keras.layers.concatenate([u6, c4])
    c6 = tf.keras.layers.Conv2D(128, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(u6)
    c6 = tf.keras.layers.Dropout(0.2)(c6)
    c6 = tf.keras.layers.Conv2D(128, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c6)
    
    # c6上采样之后与c3 拼接 再接两次卷积
    u7 = tf.keras.layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)
    u7 = tf.keras.layers.concatenate([u7, c3])
    c7 = tf.keras.layers.Conv2D(64, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(u7)
    c7 = tf.keras.layers.Dropout(0.2)(c7)
    c7 = tf.keras.layers.Conv2D(64, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c7)
    
    # c7上采样之后与c2 拼接 再接两次卷积
    u8 = tf.keras.layers.Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)
    u8 = tf.keras.layers.concatenate([u8, c2])
    c8 = tf.keras.layers.Conv2D(32, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(u8)
    c8 = tf.keras.layers.Dropout(0.1)(c8)
    c8 = tf.keras.layers.Conv2D(32, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c8)
    
    # c8上采样之后与c1 拼接 再接两次卷积
    u9 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)
    u9 = tf.keras.layers.concatenate([u9, c1], axis=3)
    c9 = tf.keras.layers.Conv2D(16, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(u9)
    c9 = tf.keras.layers.Dropout(0.1)(c9)
    c9 = tf.keras.layers.Conv2D(16, (3, 3), activation=tf.keras.activations.elu, kernel_initializer='he_normal', padding='same')(c9)
    
    # 最后接一个1*1卷积 sigmoid输出 每一个像素点是检测对象 不是检测对象
    outputs = tf.keras.layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)
    
    model = tf.keras.Model(inputs=[inputs], outputs=[outputs])
    model.compile(optimizer='adam', loss='binary_crossentropy',
                  metrics=['accuracy'])
    model.summary()
    
    
    checkpoint_path = "training_1/cp.ckpt"
    checkpoint_dir = os.path.dirname(checkpoint_path)
    # Create checkpoint callback
    cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
                                                     save_weights_only=True,
                                                     verbose=1)
    callbacks = [
      tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
      tf.keras.callbacks.TensorBoard(log_dir='./logs'),  # 打印日志
      cp_callback  # 保存中间训练结果
    ]
    
    # 训练
    results = model.fit(x_train, y_train, validation_split=0.1, batch_size=16, epochs=20,
                        callbacks=callbacks)
    
    
    # 模型的推理使用
    idx = random.randint(0, len(x_train) - 1)
    x = np.array(x_train[idx])
    x = np.expand_dims(x, axis=0)
    predict = model.predict(x, verbose=1)
    predict = (predict > 0.5).astype(np.uint8)
    imshow(np.squeeze(predict[0]))
    plt.show()
    
    imshow(x_train[idx])
    plt.show()
    
    
    

    标签:layers,padding,keras,--,activation,same,60,Unet,tf
    From: https://www.cnblogs.com/cavalier-chen/p/18105241

    相关文章

    • yii2控制器
      yii2控制器Yii2的控制器(Controller)是MVC(Model-View-Controller)设计模式中的核心组件之一,负责处理用户请求并生成相应的响应。控制器包含了处理请求所需的方法(通常称为动作方法或动作),并可以调用模型和视图来执行相应的业务逻辑和展示内容。在Yii2中,控制器类通常继承自yii\we......
    • 双向链表C++
      今天写了双向链表..........写的头好晕..........看来链表还是要多加练习这个双向链表完成了增删改查,并且最后销毁链表环境VScode#include<iostream>#include<cstring>usingnamespacestd;//结点类classNode{public:stringip;//客户端ipstringn......
    • Babylon 如何使用AssetsManager(),导入多个模型
      AssetsManager是Babylon.js资产管理工具,可以加载多个模型或者纹理,并且在任务完成时提供回调函数。例如://创建一个AssetsManager实例constassetsManager=newBABYLON.AssetsManager(scene);//添加纹理加载任务consttextureTask=assetsManager.addTexture......
    • 在Java中什么是JVM?
      在Java中,JVM(JavaVirtualMachine)是Java平台的一个核心组成部分,它允许Java程序能够在多种硬件和操作系统平台上运行而无需做任何修改。JVM的跨平台特性是通过“一次编写,到处运行”(WriteOnce,RunAnywhere)的理念实现的。下面详细介绍JVM的工作原理和其关键组成部分。JVM的工......
    • Java的基本数据类型
      Java是一种强类型语言,这意味着每个变量和每个表达式都有一个明确的类型,这些类型在编译时期就已经确定。在Java中,基本数据类型(PrimitiveTypes)是构建复杂数据结构的基础,它们是不可再分的数据,直接存储值,而非引用。Java定义了八种基本数据类型,分为四类:整型、浮点型、字符型和布尔......
    • 2022DASCTF MAY 出题人挑战赛
      上午开题,下午才做。补了三道web浅写一下wpPowerCookie靶机还没打开就有思路了,应该是需要对cookie进行修改,下午和同队的师傅们交流了一下我又发现可以用火狐插件进行改,那就不用在burp里面修改了。(第三种方法就是在谷歌里面改)添加文件头(admin=1)魔法浏览器什么是魔法浏览......
    • 干货分享│金属板材成形极限FLC测量流程介绍(XTDIC-FLC;三维全场应变测量)
      板料成形是一种材料加工技术,在航空、航天、船舶、汽车等行业领域被广泛应用。板料的成形极限,是衡量板料塑性成形性能的重要指标。以极限应变构成的成形极限图(FLD),常被用于板料受到拉伸、胀形或拉伸胀形结合时能够达到的变形程度,为评价板料成形性能以及改进成形工艺提供技术基础......
    • 广州网站设计公司哪家好?
      本文从实地考察、专业团队、透明收费、案例研究和售后服务等方面分析了广州网站设计公司选择的依据。选择有实力、经验丰富、技术过硬的公司,明确收费透明、报价合理,注重网站设计公司的专业性和用户体验。同时,要参考实践案例,了解售后服务保障。竖豆网小豆子从以下六点来给大......
    • centos (持续更新!!!)
      Hbase课程笔记目录一、entosc安装JDK1、卸载系统上自带的JDK版本1)先检查系统地JDK版本2)检测JDK的安装包3)卸载openjdk 4)再次查看卸载情况2、安装新的JDK1)JDK下载网址:JavaArchive|Oracle中国2)安装完成后,先制作一个文件夹用来存放安装包3)导入安装包......
    • Spring 一文彻底搞定循环依赖
      Spring解读循环依赖一.前言Spring是怎么解决循环依赖问题第一级缓存存放的是完全初始化完成的可以直接使用的对象,第二级缓存存放的是经过后置处理器处理(即代理过)的对象,第三级缓存村放的是刚实例化好没有经过后置处理器处理(即没有被代理过)的对象。二.什么是循环依赖......