【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)
一、前言
如何快速搭建图像分割网络? 要手写把backbone ,手写decoder 吗? 介绍一个分割神器,分分钟搭建一个分割网络。
仓库的地址:
https://github.com/qubvel/segmentation_models.pytorch

该库的主要特点是:
- 高级 API(只需两行即可创建神经网络)
- 用于二元和多类分割的 9 种模型架构(包括传奇的 Unet) 124 个可用编码器(以及 timm 的 500 多个编码器)
- 所有编码器都有预先训练的权重,以实现更快更好的收敛
- 训练例程的流行指标和损失
二、快速引入—使用 SMP 创建您的第一个分割模型
分割模型只是一个 PyTorch nn.Module,创建起来很简单:
import segmentation_models_pytorch as smpmodel = smp.Unet(encoder_name="resnet34", # choose encoder, e.g. mobilenet_v2 or efficientnet-b7encoder_weights="imagenet", # use `imagenet` pre-trained weights for encoder initializationin_channels=1, # model input channels (1 for gray-scale images, 3 for RGB, etc.)classes=3, # model output channels (number of classes in your dataset)
)
三、Architectures
我们可以用到的 model 有:
- Unet
- Unet++
- MAnet
- Linknet
- FPN
- PSPNet
- PAN
- DeepLabV3
- DeepLabV3+
3.1 UNet
UNet是一种常用于图像分割任务的深度学习架构。它由Olaf Ronneberger、Philipp Fischer和Thomas Brox于2015年在他们的论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中提出。
UNet的名字来自其U形的网络结构。它的设计目标是从输入图像中捕获低层次和高层次特征,然后利用这些信息生成像素级别的分割掩码。UNet在医学图像分析中特别受欢迎,因为它对于分割器官、肿瘤和其他感兴趣的结构非常有效。
UNet架构主要由两个部分组成:
-
收缩路径:该部分类似于典型的卷积神经网络架构,包含多个卷积和池化层。它被称为"收缩路径",因为每个卷积层减小空间维度,同时增加特征通道数量。
-
扩展路径:该部分涉及将特征映射进行上采样,恢复原始空间维度。它被称为"扩展路径",因为它增加空间维度,同时减少特征通道数量。
在U形架构的中心,有一个瓶颈层,它保留了局部和全局的上下文信息。
收缩路径和扩展路径是对称的,并通过跳跃连接相连接。这些跳跃连接有助于在上采样过程中保留细粒度的空间信息,使UNet特别适合图像分割任务。
在原始的UNet论文中,作者将该架构应用于生物医学图像分割任务,例如在电子显微镜数据中分割神经结构。然而,自那时以来,UNet架构已广泛应用于其他领域的图像分割任务,如自然图像、卫星图像等。
由于其有效性,UNet已成为各种扩展和改进的基础,并且在深度学习领域仍然是图像分割任务的热门选择。
3.2 UNet++
Unet++是对UNet进行改进和扩展的深度学习架构。它是由Zhou et al.于2018年在论文《UNet++: A Nested U-Net Architecture for Medical Image Segmentation》中提出的。
Unet++在原始UNet的基础上增加了一些重要的结构来提高图像分割的性能。主要的改进是引入了多层级的嵌套结构,使得模型能够更好地捕获不同尺度下的特征信息。以下是Unet++的主要特点:
-
多层级嵌套:Unet++采用了一种层级嵌套的结构,将UNet的每个阶段进行进一步细分。这样可以在不同的阶段获取更多的细节和语义信息,从而提高了分割的准确性。
-
密集跳跃连接:Unet++引入了密集的跳跃连接,将不同层级的特征图进行融合。这样可以使低层级的特征图能够直接参与到高层级的特征表示中,有助于更好地整合多尺度的信息。
-
自适应选择性上采样:在Unet++的解码器部分,采用了自适应选择性上采样技术,根据不同特征图的重要性进行选择性地上采样。这样可以减少计算量,并且避免了不必要的信息传递。
通过这些改进,Unet++在医学图像分割等任务中取得了较好的性能,相对于原始UNet,它能够更准确地定位和分割感兴趣的目标结构。
需要注意的是,自从Unet++的提出以来,还可能有其他进一步的改进和扩展,因为深度学习领域一直在不断发展和演进。
3.3 FPN
**FPN是"Feature Pyramid Network" 的缩写,是一种用于目标检测和语义分割任务的深度学习架构。它由Tsung-Yi Lin、Piotr Dollár、Ross Girshick和Kaiming He于2017年在论文《Feature Pyramid Networks for Object Detection》中提出。
FPN的目标是解决多尺度信息的问题。在许多计算机视觉任务中,目标可能在图像的不同尺度下出现,而且较小的目标可能在较低层级的特征图中丢失细节。FPN通过构建特征金字塔来解决这个问题。
FPN的主要思想是将不同层级的特征图进行融合,以提取多尺度的特征信息。它包含以下主要组件:
- 底层特征:从卷积神经网络的底层获得的特征图。这些特征图具有高分辨率但缺乏语义信息。
- 顶层特征:从网络的顶层获得的特征图。这些特征图具有较低的分辨率但包含丰富的语义信息。
FPN的构建过程如下:
-
首先,通过一个卷积层,将顶层特征图的通道数降低,使其与底层特征图的通道数相同。
-
然后,将降低通道数的顶层特征图与底层特征图相加,产生一组新的特征图,这些特征图在不同的层级上融合了多尺度的信息。
-
接下来,将融合后的特征图通过上采样操作(通常使用插值方法)增加分辨率,得到高分辨率的多尺度特征金字塔。
FPN的特征金字塔允许目标检测器或分割器在不同尺度下检测或分割目标,从而显著提高了算法的性能。由于其有效性和简单性,FPN已成为许多目标检测和语义分割任务的常用组件,并被广泛应用于许多深度学习模型中。
3.4 DeepLabV3
DeepLabV3是用于图像语义分割的深度学习模型,由Google于2018年推出。它是DeepLab系列模型的第三个版本,是对前两个版本的改进和扩展。
DeepLabV3的目标是对输入图像的每个像素进行分类,将每个像素标记为属于不同类别的某个目标或背景。该模型在图像分割任务中取得了很好的性能,尤其在细粒度的分割和边界细化方面表现出色。
主要的改进点包括:
-
空洞卷积(Atrous Convolution):DeepLabV3引入了空洞卷积来增大感受野,允许模型在保持计算效率的同时,获取更大范围的上下文信息。这有助于识别更大和更细微的目标。
-
多尺度信息融合:为了解决多尺度信息的问题,DeepLabV3使用了多尺度空洞卷积,将不同尺度的信息进行融合,从而提高了模型的语义分割性能。
-
引入特征金字塔池化(ASPP):ASPP模块进一步增加了感受野,帮助模型更好地理解图像中的上下文信息。ASPP模块由一组并行的空洞卷积层组成,每个卷积层的空洞率不同,从而捕获不同尺度的信息。
-
使用深度可分离卷积:为了减少模型的参数量和计算量,DeepLabV3采用了深度可分离卷积,这是一种将标准卷积分解为深度卷积和逐点卷积的方法。
DeepLabV3模型在PASCAL VOC 2012和Cityscapes等图像分割数据集上取得了显著的性能提升,成为当时图像语义分割领域的先进模型。其优秀的性能使得DeepLabV3被广泛应用于许多图像分割任务,特别是在需要准确分割细节的场景中。
四、Encoders
以下是 SMP 中支持的编码器列表。 选择适当的编码器系列,然后单击展开表格并选择特定的编码器及其预训练权重(encoder_name 和encoder_weights 参数)。
- ResNet
- ResNeXt
- ResNeSt
- Res2Ne(X)t
- RegNet(x/y)
- GERNet
- SE-Net
- SK-ResNe(X)t
- DenseNet
- Inception
- EfficientNet
- MobileNet
- DPN
- VGG
- Mix Vision Transformer
- MobileOne
我这里只展示其中一个,以 ResNet 为例:

更多权重详见我的kaggle数据集:
https://www.kaggle.com/datasets/holmes0610/pretrained-resnet-resnext

https://www.kaggle.com/datasets/holmes0610/timm-pretrained

Pytorch 图像模型(又名 timm)有很多预训练模型和接口,允许使用这些模型作为 smp 中的编码器,但是,并非所有模型都受支持。
- 并非所有 Transformer 模型都实现了编码器所需的 features_only 功能
- 一些模型的步幅不合适
支持的编码器总数:549
https://smp.readthedocs.io/en/latest/encoders_timm.html

这个网址里面总结了所有可用的 Encoders。
五、Models API
- model.encoder:预训练主干提取不同空间分辨率的特征
- model.decoder:取决于模型架构(Unet / Linknet / PSPNet / FPN)
- model.segmentation_head:最后一个块产生所需数量的掩模通道(还包括可选的上采样和激活)
- model.classification_head:在编码器顶部创建分类头的可选块
- model.forward(x):按顺序将 x 通过模型的编码器、解码器和分段头(以及分类头,如果指定)
六、安装
PyPI version:
pip install segmentation-models-pytorch
Latest version from source:
pip install git+https://github.com/qubvel/segmentation_models.pytorch
相关文章:
【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)
一、前言 如何快速搭建图像分割网络? 要手写把backbone ,手写decoder 吗? 介绍一个分割神器,分分钟搭建一个分割网络。 仓库的地址: https://github.com/qubvel/segmentation_models.pytorch该库的主要特点是&#…...
解析湖仓一体的支撑技术及实践路径
自2021年“湖仓一体”首次写入Gartner数据管理领域成熟度模型报告以来,随着企业数字化转型的不断深入,“湖仓一体”作为新型的技术受到了前所未有的关注,越来越多的企业视“湖仓一体” 为数字化转型的重要基础设施。 01 数据平台的发展历程…...
40.利用欧拉法求解微分方程组(matlab程序)
1.简述 求解微分方程的时候,如果不能将求出结果的表达式,则可以对利用数值积分对微分方程求解,获取数值解。欧拉方法是最简单的一种数值解法。前面介绍过MATLAB实例讲解欧拉法求解微分方程,今天实例讲解欧拉法求解一阶微分方程组。…...
OpenAI-Translator 实战总结
最近在极客时间学习《AI 大模型应用开发实战营》,自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator,在这里简单记录下开发过程和心得体会,供有兴趣的同学参考 功能概览 通过openai的chat API,实现一个pdf翻译器实现一个…...
【工业机器人】用于轨迹规划和执行器分析的机械手和移动机器人模型(MatlabSimulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
开源在线文档服务OnlyOffice
开源在线文档服务OnlyOffice应用启动与示例运行 - 掘金 ONLYOFFICE API 文档 - Example - IDEA运行Java示例 | ONLYOFFICE中文网 NEXTCLOUDonlyoffice的搭建和使用_nextcloud onlyoffice_莫冲的博客-CSDN博客 OnlyOffice java 部署使用,文件流方式 预览文件 | 言曌博…...
汽车基本常识
目录 电源KL30KL15 零部件简称 电源 KL30 KL15 零部件简称 VCU:整车控制器 直接网络管理节点 CDU:充电系统控制器 MCU:电机控制器 TCU:变速箱控制器 ABS:防抱死系统 EPS:助力转向 T-Box:远程…...
百度资深PMO阚洁受邀为第十二届中国PMO大会演讲嘉宾
百度在线网络技术(北京)有限公司资深PMO阚洁女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:运筹于股掌之间,决胜于千里之外 —— 360斡旋项目干系人。大会将于8月12-13日在北京举办,…...
为什么C++有多种整型?
C中有多种整型是为了满足不同的需求,提供更灵活和高效的整数表示方式。不同的整型具有不同的字节大小、范围和精度,可以根据应用的需求选择合适的整型类型。以下是一些原因解释为什么C有多种整型: 内存和性能优化:不同的整型在内存…...
玩一玩通义千问Qwen开源版,Win11 RTX3060本地安装记录!
大概在两天前,阿里做了一件大事儿。 就是开源了一个低配版的通义千问模型--通义千问-7B-Chat。 这应该是国内第一个大厂开源的大语言模型吧。 虽然是低配版,但是在各类测试里面都非常能打。 官方介绍: Qwen-7B是基于Transformer的大语言模…...
oracle积累增量和差异增量
积累增量和差异增量: 对于 RMAN 来说,积累增量备份和差异增量备份都是增量备份的一种形式,它们之间的区别在于备份的范围和备份集的方式。 积累增量备份:在进行积累增量备份时,RMAN 会备份自最后一次完全备份或增量备…...
利用C++nlohmann库解析json文件
json文件示例: 代码运行环境VS2019 一、git下载nlohmann库文件源代码 源代码文件目录 二、利用VS2019新建工程,并配置项目属性 配置VC目录---包含目录 三、项目源代码 #include <iostream> #include <fstream> #include <nlohmann/jso…...
OpenCV 中的光流 (C++/Python)
什么是光流? 光流是一项视频中两个连续帧之间每像素运动估计的任务。基本上,光流任务意味着计算像素的位移矢量作为两个相邻图像之间的对象位移差。光流的主要思想是估计物体由其运动或相机运动引起的位移矢量。 理论基础 假设我们有一个灰度图像——具有像素强度的矩阵。我…...
第9集丨Vue 江湖 —— 监测数据原理
目录 一、修改数据时的一个问题1.1 现象一1.2 现象二 二、Vue监测数据原理2.1 模拟一个数据监测2.2 数据劫持2.3 Vue.set()/vm.$set()2.4 基本原理2.4.1 如何监测对象中的数据?2.4.2 如何监测数组中的数据?2.4.3 修改数组中的某个元素 2.5 案例2.5.1 需求功能2.5.2 实现 一、…...
【YOLO】替换骨干网络为轻量级网络MobileNet3
替换骨干网络为轻量级网络MobileNet_v3 上一章 模型网络结构解析&增加小目标检测 文章目录 替换骨干网络为轻量级网络MobileNet_v3前言一、MobileNetV3介绍二、MobileNetV2&MobileNetV3三、MobileNetV3网络结构1. 结构查看2. 查看每层featuremap大小三、YOLOV5替换骨干…...
如何识别手机是否有灵动岛(dynamic island)
如何识别手机是否有灵动岛(dynamic island) 灵动岛是苹果2022年9月推出的iPhone 14 Pro、iPhone 14 Pro Max首次出现,操作系统最低是iOS16.0。带灵动岛的手机在竖屏时顶部工具栏大于等于51像素。 #define isHaveDynamicIsland ({ BOOL isH…...
Linux设备树简介
一、起源 减少垃圾代码 减轻驱动开发工作量 驱动代码和设备信息分离 参考Open Fireware设计 用来记录硬件平台中各种硬件设备的属性信息 二、基本组成 两种源文件: xxxxx.dts dts是device tree source的缩写 xxxxx.dtsi dtsi是device tree source include的…...
Ubuntu类IOS主题设置
1.依次执行下面三条命令: sudo apt install gnome-shell-extensions sudo apt install gnome-tweak-tool sudo apt install chrome-gnome-shell2.下载主题,也是命令: git clone <https://github.com/qingchendelaike/GNOME-OSX-II-Theme…...
RabbitMQ学习——发布订阅/fanout模式 topic模式 rabbitmq回调确认 延迟队列(死信)设计
目录 引出点对点(simple)Work queues 一对多发布订阅/fanout模式以登陆验证码为例pom文件导包application.yml文件rabbitmq的配置生产者生成验证码,发送给交换机消费者消费验证码 topic模式配置类增加配置生产者发送信息进行发送控制台查看 rabbitmq回调确认配置类验…...
Leetcode算法递归类—合并两个有序链表
目录 21. 合并两个有序链表 题解: 代码: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2&a…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
