程序员学长 | 快速学习一个算法,UNet

news2024/11/16 9:00:50

本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。

原文链接:快速学习一个算法,UNet

今天给大家分享一个超强的算法模型,UNet

UNet 是一种卷积神经网络架构,最初由 Olaf Ronneberger 等人在 2015 年提出,主要用于生物医学图像分割任务

https://arxiv.org/abs/1505.04597

其设计思想在于通过编码器-解码器结构,逐步提取图像特征并进行多尺度融合,从而实现高精度的像素级别分割

由于其有效的结构以实现精确的图像分割,UNet 已在生物医学成像以外的各种图像分割任务中广受欢迎。

Unet 架构

UNet 架构以其 U 形结构而著称,它由两个主要部分组成:收缩(下采样)路径和扩展(上采样)路径。

收缩路径

从架构中我们可以看到,收缩路径采用传统的卷积神经网络结构,通过一系列的卷积层和池化层逐步减少空间维度(即图像尺寸)并增加特征通道的数量。

每个卷积操作通常包括两次 3x3 的卷积,紧接着是一个ReLU 激活函数和一个 2x2 的最大池化操作。

池化操作减少了图像的尺寸,使得网络能够更广泛地获取上下文信息。

关于卷积神经网络中的卷积操作和最大池化操作可以参考下面这篇文章。

快速学会一个算法,CNN

扩展路径

UNET 架构的一个关键组件是扩展路径。它负责对扩展路径的特征图进行上采样并构建最终的分割掩码。

上采样层(反卷积)

每个上采样操作通过 2x2 的反卷积将图像尺寸扩大一倍,然后通过与收缩路径对应层的特征进行拼接。

反卷积本质上与常规卷积相反。它们增强空间维度而不是减少空间维度,从而允许上采样。

反卷积操作的基本原理

反卷积操作的目标是将输入特征图的空间尺寸放大,而不像普通卷积那样缩小空间尺寸。它通过在输入特征图之间插入零值,然后对插值后的特征图进行标准卷积运算,从而实现上采样。

具体步骤如下:

  1. 插值

    在输入特征图的每个元素之间插入零值,以增加特征图的尺寸。例如,如果插值因子为2,则每个元素之间插入一个零值,使得特征图的尺寸扩大一倍。

  2. 卷积运算

    对插值后的特征图应用标准卷积操作。这一步通过卷积核在插值后的特征图上滑动并进行卷积计算,从而生成输出特征图。

跳跃连接

跳跃连接将编码器(收缩路径)中某一层的特征图直接连接到解码器(扩展路径)中相应层的特征图。

通过这些连接,编码器提取的低层特征(高分辨率)能够直接传递到解码器的相应层,使网络能够聚合多尺度信息以实现正确的分割。

跳跃链接的作用

  1. 特征融合

    编码器提取的特征包含了输入图像的丰富细节信息,但由于下采样过程,这些细节在深层次可能会被丢失。跳跃链接通过将这些细节信息直接传递给解码器,使得解码器在进行上采样时能够更好地融合这些细节,提高了分割结果的精度。

  2. 梯度流动

    在深度神经网络中,梯度在反向传播过程中可能会逐渐减小(梯度消失问题),导致训练困难。

    跳跃链接提供了额外的梯度路径,帮助梯度更有效地流动,从而缓解梯度消失问题,加速模型的训练过程。

从头开始构建 UNet 模型

让我们从头来实现一个 UNet 模型。

1.加载必要的库
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import BatchNormalization, Activation, MaxPool2D
from tensorflow.keras.layers import  Conv2DTranspose, Concatenate, Input
from tensorflow.keras.models import Model
2.构建卷积块

卷积块将 2D 卷积层应用于输入张量,然后进行批量归一化和 ReLU 激活。然后再应用另一个卷积层、批量归一化和 ReLU 激活,然后返回输出张量。

def conv_block(input, num_filters):
    x = Conv2D(num_filters, 3, padding="same")(input)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(num_filters, 3, padding="same")(x)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    return x
3.构建编码器模块

UNet 架构中的编码器块执行下采样和特征提取。

它对输入张量应用卷积运算,然后进行最大池化以减少空间维度。

该块生成处理后的张量和下采样后的张量,后续层利用这些张量进行进一步处理和特征提取。

def encoder_block(input, num_filters):
    x = conv_block(input, num_filters)
    p = MaxPool2D((2, 2))(x)
    return x, p
4.构建解码器块

UNet 架构中的解码器块执行上采样并合并跳跃连接。

它应用反卷积将输入张量上采样 2 倍。然后将上采样的张量与来自相应编码器块的张量通过跳跃连接连接起来。

然后进一步应用卷积块来细化合并的特征。解码器块的输出张量用于后续层以进行进一步处理。

def decoder_block(input, skip_features, num_filters):
    x = Conv2DTranspose(num_filters, (2, 2), strides=2, padding="same")(input)
    x = Concatenate()([x, skip_features])
    x = conv_block(x, num_filters)
    return x
5.构建 UNET 模型

build_unet 函数构建一个用于图像分割的 UNet 模型。

它应用编码器块来下采样和捕获特征,然后使用卷积块进行高级表示,之后应用解码器块用于上采样和合并跳过连接。

该模型生成一个具有 S 形激活的输出张量,表示前景类的像素概率。

def build_unet(input_shape):
    inputs = Input(input_shape)

    s1, p1 = encoder_block(inputs, 64)
    s2, p2 = encoder_block(p1, 128)
    s3, p3 = encoder_block(p2, 256)
    s4, p4 = encoder_block(p3, 512)

    b1 = conv_block(p4, 1024)

    d1 = decoder_block(b1, s4, 512)
    d2 = decoder_block(d1, s3, 256)
    d3 = decoder_block(d2, s2, 128)
    d4 = decoder_block(d3, s1, 64)

    outputs = Conv2D(1, 1, padding="same", activation="sigmoid")(d4)

    model = Model(inputs, outputs, name="U-Net")
    return model

现在我们已经从头开始构建了 UNet 模型。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速排序(下)

快速排序(下) 前言 在上一篇文章中我们了解了快速排序算法,但那是Hoare的版本,其实还有别的版本:一种是挖坑法,它们的区别主要在于如何找基准值。霍尔的版本思路难理解但代码好理解,挖坑法则是…

Java新特性(二) Stream与Optional详解

Java8新特性(二) Stream与Optional详解 一. Stream流 1. Stream概述 1.1 基本概念 Stream(java.util.stream) 是Java 8中新增的一种抽象流式接口,主要用于配合Lambda表达式提高批量数据的计算和处理效率。Stream不是…

【前端】中后台框架 添加其他布局的探索

文章目录 前言需求整理第一步:实现可切换布局第二步:配置页面顶部的路由(一级路由)第三部:配置左侧二级和二级以上的路由第四部:给侧边栏加一个动画第五部:刷新页面之后顶部路由、左侧路由的回显…

5款免费写作生成软件,自动生成原创文章很简单

在人工智能时代的今天,创作者面对写作不再是一件令人望而生畏的事情。随着AI技术的不断发展,涌现出了许多优秀的免费写作生成软件,让自动生成原创文章变得轻松简单。以下为大家详细介绍5款备受赞誉的免费写作生成软件,下面跟随小编…

硬盘数据丢失不再怕,四大恢复工具帮你轻松逆转局面!

硬盘故障、误删文件、病毒攻击等原因导致数据丢失的情况时有发生。面对这种情况,如何高效、快速地进行硬盘数据恢复呢?接下来几款好用的数据恢复软件推荐给大家。 一、福昕数据恢复:全方位恢复,让数据无遗漏 链接:ww…

手把手教你OpenCV实现实时人脸检测(C++)

目录 1,原理介绍 2,代码讲解 3,全部代码 4,结果展示 1,原理介绍 haarcascade_frontalface_default.xml 是一个 XML 文件,它包含了使用 Haar 特征分类器训练得到的人脸检测模型。这个模型是 OpenCV 库自…

【小知识】站在前人的肩膀上写程序——STL库初阶算法函数的使用

【小知识】站在前人的肩膀上写程序——STL库初阶算法函数的使用 1.墨水瓶算法和swap函数2.打擂台算法和max,min函数3.排序——sort函数 1.墨水瓶算法和swap函数 如果想交换两个墨水瓶的墨水该怎么办呢?我们可以准备第三个墨水瓶。将第一个墨水瓶的墨水倒…

linux安装配置jdk

①下载jdk安装包,放在/opt/app/software/java下 cd /opt/app/software/java②进行解压操作 tar -zxvf jdk-8u251-linux-x64.tar.gz③解压完成之后,进行环境变量的配置,shell下执行 vi ~/.bash_profile根据jdk的安装目录,加入 …

LeeCode Practice Journal | Day31_GA05

56. 合并区间 题目:56. 合并区间 - 力扣(LeetCode) 题解:代码随想录 (programmercarl.com) 思路很清晰,对数组的操作稀烂,细节上也出现很多问题 solution public class Solution {public int[][] Merge(in…

2024全新Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能/全开源运营版本

全开源运营版本聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能 运营版本的聊天室,可以添加好友,建立群组,私聊,禁言功能 H5TP5.0mysqlPHP 源码开源不加密

【python】Python二手房住房数据抓取可视化(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

python爬取豆瓣电影top250-python实战项目,手把手教学,附源码

目录 1、分析网页2、请求服务器 2.1导入包2.2设置浏览器代理2.3请求服务器格式2.4请求服务器代码汇总 3.xpath提取信息 3.1获取xpath节点的方法3.2xpath提取内容3.2.1提取文本3.2.2提取链接3.2.3提取标签元素 4.正则表达式 4.1提取固定位置的信息4.2匹配出数字 5、提取一页中的…

Java 并发编程:Java 线程池的介绍与使用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

细分 Insight 合作伙伴 2024 年企业技术状况报告

Insight Partners 的团队刚刚发布了 2024 年企业技术状况报告。在 60 幻灯片中有很多东西可以消耗,但我们挑选了应该让我们的观众感兴趣的东西 - 坦率地说,有很多有趣的东西。我将把调查方法的东西留给你使用,但足以说样本量很大,…

dami支付漏洞

使用burpsuite等抓包工具,抓取数据包后,修改数据包中的参数从而达到支付篡改的目的;篡 改的参数:商品ID,购买价格,购买数量,手机号码,订单D,支付状态 常见漏洞利用手段…

国家网络身份个人认证方法

申领网络身份认证后,用户会得到一张虚拟的“网络身份证”,它可以向需要实名认证的互联网平台进行认证,不再需要输入姓名和身份证号等信息。 申请方式:各手机应用平台搜索国家网络身份认证即可(必须支持NFC才能申请&am…

AI产品经理必备:什么是LLM,有什么优劣势

LLM(Large Language Model大型语言模型)是一种人工智能技术,能够理解和生成自然语言文本。LLM可以应用于多种场景,包括自然语言理解、文本生成、机器翻译、对话系统、问答系统、文本摘要、情感分析等。可以帮助人们快速生成文章、…

c# 构造器的声明与调用

在C#中,构造器(Constructor)是一种特殊类型的函数,用于初始化类的新实例。构造器的名字必须与类名完全相同,并且没有返回类型,甚至连void也不行。 当创建类的一个新实例时,构造器会自动被调用。…

全球轻型电动轮椅市场规划预测:未来六年CAGR为7.3%

随着全球人口老龄化的加剧和消费者对便捷、高效出行工具的需求增加,轻型电动轮椅作为提升行动不便人士生活质量的重要工具,正逐渐受到市场的广泛关注。本文旨在通过深度分析轻型电动轮椅行业的各个维度,揭示行业发展趋势和潜在机会。 【市场…

StudyStudyStudy第十六天(2024.8.2)

1.代理模式 代理模式分为静态代理和动态代理 代理模式,就是在想要执行的代码之前或之后添加代码块,并不会破坏原有的代码结构。可以理解成加上了一个访问层 1.静态代理 创建一个接口Shopping public interface Shopping {void shopping(); }创建一个…