三个优秀的PyTorch实现语义分割框架

article/2025/9/30 4:28:05


向AI转型的程序员都关注了这个号????????????

机器学习AI算法工程   公众号:datayx

使用的VOC数据集链接开放在文章中,预训练模型已上传Github,环境我使用Colab pro,大家下载模型做预测即可。

代码链接: https://github.com/lixiang007666/segmentation-learning-experiment-pytorch

使用方法:

  1. 下载VOC数据集,将JPEGImages SegmentationClass两个文件夹放入到data文件夹下。

  2. 终端切换到目标目录,运行python train.py -h查看训练

(torch) qust116-jq@qustx-X299-WU8:~/语义分割$ python train.py -h
usage: train.py [-h] [-m {Unet,FCN,Deeplab}] [-g GPU]choose the modeloptional arguments:-h, --help            show this help message and exit-m {Unet,FCN,Deeplab}, --model {Unet,FCN,Deeplab}输入模型名字-g GPU, --gpu GPU     输入所需GPU

选择模型和GPU编号进行训练,例如运行python train.py -m Unet -g 0

  1. 预测需要手动修改predict.py中的模型

如果对FCN非常了解的,可以直接跳过d2l(动手学深度学习)的讲解到最后一部分。

2 数据集

VOC数据集一般是用来做目标检测,在2012版本中,加入了语义分割任务。

基础数据集中包括:含有1464张图片的训练集,1449的验证集和1456的测试集。一共有21类物体。

PASCAL VOC分割任务中,共有20个类别的对象,其他内容作为背景类,其中红色代表飞机类,黑色是背景,飞机边界部分用米黄色(看着像白色)线条描绘,表示分割模糊区。

其中,分割标签都是png格式的图像,该图像其实是单通道的颜色索引图像,该图像除了有一个单通道和图像大小一样的索引图像外,还存储了256个颜色值列表(调色板),每一个索引值对应调色板里一个RGB颜色值,因此,一个单通道的索引图+调色板就能表示彩色图。

原图:

在这里插入图片描述

标签:

在这里插入图片描述

挑选一张图像可以发现,单张图像分割类别不只两类,且每张图像类别不固定。

3 全卷积神经网络

语义分割能对图像中的每个像素分类。全卷积网络 (fully convolutional network,FCN) 采用卷积神经网络实现了从图像像素到像素类别的变换 。与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过中引入的转置卷积(transposed convolution)层实现的。因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:给定空间维上的位置,通道维的输出即该位置对应像素的类别预测。

%matplotlib inline
import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

3.1 网络结构

全卷积网络先使用卷积神经网络抽取图像特征,然后通过 卷积层将通道数变换为类别个数,最后再通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。因此,模型输出与输入图像的高和宽相同,且最终输出的通道包含了该空间位置像素的类别预测。

下面,我们使用在ImageNet数据集上预训练的ResNet-18模型来提取图像特征,并将该网络实例记为pretrained_net。该模型的最后几层包括全局平均汇聚层和全连接层,然而全卷积网络中不需要它们。

pretrained_net = torchvision.models.resnet18(pretrained=True)
list(pretrained_net.children())[-3:]

创建一个全卷积网络实例net。它复制了Resnet-18中大部分的预训练层,但除去最终的全局平均汇聚层和最接近输出的全连接层。

net = nn.Sequential(*list(pretrained_net.children())[:-2])

给定高度和宽度分别为320和480的输入,net的前向计算将输入的高和宽减小至原来的 ,即10和15。

X = torch.rand(size=(1, 3, 320, 480))
net(X).shape

使用 卷积层将输出通道数转换为Pascal VOC2012数据集的类数(21类)。最后,我们需要将要素地图的高度和宽度增加32倍,从而将其变回输入图像的高和宽。

回想一下卷积层输出形状的计算方法:

由于 ,我们构造一个步幅为 的转置卷积层,并将卷积核的高和宽设为 ,填充为

我们可以看到如果步幅为 ,填充为 (假设 是整数)且卷积核的高和宽为 ,转置卷积核会将输入的高和宽分别放大 倍。

num_classes = 21
net.add_module('final_conv', nn.Conv2d(512, num_classes, kernel_size=1))
net.add_module('transpose_conv', nn.ConvTranspose2d(num_classes, num_classes,kernel_size=64, padding=16, stride=32))

3.2 初始化转置卷积层

将图像放大通常使用上采样(upsampling)方法。双线性插值(bilinear interpolation) 是常用的上采样方法之一,它也经常用于初始化转置卷积层。

为了解释双线性插值,假设给定输入图像,我们想要计算上采样输出图像上的每个像素。

首先,将输出图像的坐标 (????,????) 映射到输入图像的坐标 (????′,????′) 上。例如,根据输入与输出的尺寸之比来映射。请注意,映射后的 ????′ 和 ????′ 是实数。

然后,在输入图像上找到离坐标 (????′,????′) 最近的4个像素。

最后,输出图像在坐标 (????,????) 上的像素依据输入图像上这4个像素及其与 (????′,????′) 的相对距离来计算。

双线性插值的上采样可以通过转置卷积层实现,内核由以下bilinear_kernel函数构造。限于篇幅,我们只给出bilinear_kernel函数的实现,不讨论算法的原理。

def bilinear_kernel(in_channels, out_channels, kernel_size):factor = (kernel_size + 1) // 2if kernel_size % 2 == 1:center = factor - 1else:center = factor - 0.5og = (torch.arange(kernel_size).reshape(-1, 1),torch.arange(kernel_size).reshape(1, -1))filt = (1 - torch.abs(og[0] - center) / factor) * \(1 - torch.abs(og[1] - center) / factor)weight = torch.zeros((in_channels, out_channels,kernel_size, kernel_size))weight[range(in_channels), range(out_channels), :, :] = filtreturn weight

用双线性插值的上采样实验它由转置卷积层实现。我们构造一个将输入的高和宽放大2倍的转置卷积层,并将其卷积核用bilinear_kernel函数初始化。

conv_trans = nn.ConvTranspose2d(3, 3, kernel_size=4, padding=1, stride=2,bias=False)
conv_trans.weight.data.copy_(bilinear_kernel(3, 3, 4));

在全卷积网络中,我们用双线性插值的上采样初始化转置卷积层。对于 1×1卷积层,我们使用Xavier初始化参数。

W = bilinear_kernel(num_classes, num_classes, 64)
net.transpose_conv.weight.data.copy_(W);

3.3 训练

损失函数和准确率计算与图像分类中的并没有本质上的不同,因为我们使用转置卷积层的通道来预测像素的类别,所以在损失计算中通道维是指定的。此外,模型基于每个像素的预测类别是否正确来计算准确率。

def loss(inputs, targets):return F.cross_entropy(inputs, targets, reduction='none').mean(1).mean(1)num_epochs, lr, wd, devices = 5, 0.001, 1e-3, d2l.try_all_gpus()
trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=wd)
d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)

4 开源代码和Dataset

数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

输入样本:

输出样本:

运行Segmentat_pytorch.ipynp:训练:

!python3 train.py -m Unet -g 0

预测:

模型代码包括FCN、U-Net和Deeplab的实现,大家可以更方便的更换模型训练和预测。

DeeplabV3分割结果:FCN分割结果:

在这里插入图片描述

U-Net分割结果:

记得点个Star哦!

5 总结

通过与分割标准图像的对比,可以发现该模型的输出分割图像与分割标准图像几乎一致,同时模型的输出分割图像与原图也较好的融合,说明该模型具有较好的准确性。

此外,从输入图像大小来看,该模型可以输入任意大小的图像,并输出相同大小的已经标签好的分割图像。由于是针对PASCAL VOC数据集图像进行的分割,PASCAL VOC数据集中只支持20个类别(背景为第21个类别),所以在分割时,遇到不在20个类别中的事物都将其标为背景。

但总体来说,该模型对PASCAL VOC数据集的图像分割达到了较高准确率。

6 参考

[1].https://zh-v2.d2l.ai/index.html

个人简介:李响Superb,CSDN百万访问量博主,普普通通男大学生,深度学习算法、医学图像处理专攻,偶尔也搞全栈开发,没事就写文章。

博客地址:lixiang.blog.csdn.net

机器学习算法AI大数据技术

 搜索公众号添加: datanlp

长按图片,识别二维码


阅读过本文的人还看了以下文章:

TensorFlow 2.0深度学习案例实战

基于40万表格数据集TableBank,用MaskRCNN做表格检测

《基于深度学习的自然语言处理》中/英PDF

Deep Learning 中文版初版-周志华团队

【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

《美团机器学习实践》_美团算法团队.pdf

《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

特征提取与图像处理(第二版).pdf

python就业班学习视频,从入门到实战项目

2019最新《PyTorch自然语言处理》英、中文版PDF+源码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

PyTorch深度学习快速实战入门《pytorch-handbook》

【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

《Python数据分析与挖掘实战》PDF+完整源码

汽车行业完整知识图谱项目实战视频(全23课)

李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

《神经网络与深度学习》最新2018版中英PDF+源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  


http://chatgpt.dhexx.cn/article/BjMma5to.shtml

相关文章

google crx Hoxx 下载

Hoxx download links. Chrome crx https://base1-hx.diltwo.com//public/Chrome/Firefox XPI https://base1-hx.diltwo.com//public/Firefox/Android api https://base1-hx.diltwo.com//public/Android/ crx 下载地址 https://www.crx4chrome.com/crx/39922/ https://www.crx4…

Chrome安装CRX插件方法

一.前言 Chrome插件有:extension,app, NaCl(Native Client), PNaCl(Portable Native Client)等。但因为安全性,兼容性等各种原因,Chrome官方已经宣布:逐渐废弃其它类型的插件,只保留…

Chrome:拖入crx文件时,显示“无法从该网站添加应用、扩展程序和用户脚本”问题

问题现象 问题解决方案 1)打开新的页签,输入网址:chrome://flags/#extensions-on-chrome-urls 2)Extensions on chrome:// URLs 由Disabed修改为Enabled

Chrome如何安装第三方扩展插件(crx)

Chrome安装第三方扩展插件(crx) 前言 新版本Chrome浏览器会对非Chrome应用商城的扩展应用安装进行限制,安装后会提示“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的。”。 上述问题的一种解决方式是将CRX文件进行解压后进行…

Chrome谷歌浏览器安装crx后缀插件方法

Chrome谷歌浏览器安装crx后缀插件方法; 很多小伙伴还是习惯用以前的crx后缀谷歌浏览器插件,但是自从2018年之后,谷歌新版本升级;不支持直接拖拽的形式安装这类插件了; 之后的新版本(目前已经升级到v80版本…

Chrome 解决 CRX HEADER INVALID 问题

文章目录 1. 问题2. 原因3. 解决方法3.1 方法一:将 crx 扩展程序解压开,然后加载已解压的扩展程序安装3.2 方法二:将 crx 的文件扩展名更改为 zip,然后拖拽安装3.3 方法三:使用 73 及后续版本打包的 crx,直…

建一个chrome插件crx所需步骤

建一个文件夹 文件夹下建以下几个文件 manifest.json:主要的配置文件 popup.html:主要的承载页面 icon.ico:插件的图标 引入的popup.js是html所涉及的js功能代码 因为是纯js的,所以需要提前引入jquery方便后期事件绑定 chrome插…

新版Edge浏览器安装外部扩展(.crx)的方法

先准备好插件文件: xxx.crx格式 然后改变后缀名,从.crx改为.zip格式 然后把这个.zip文件解压到你电脑的任意位置,最好是Edge浏览器的安装位置附近建一个edge文件夹里,后期方便查找更新。 比如我的目录: 我的操作&am…

谷歌浏览器Crx插件库-https://crxdl.com/

地址:https://crxdl.com/ postman插件:talend json插件库:csdn插件 抓取视频:猫抓

chrome浏览器添加crx插件

1.首先把crx文件修改名字,改成.zip结尾的文件 2.把需要的zip解压 3.chrome浏览器打开开发者模式 4.加载已解压的扩展程序 5.先添加tampermonkey,再添加simple-allow-copy 6.把扩展程序固定到浏览器工具栏 7.在bd文库中,先点亮扩展程序&#x…

谷歌浏览器(chrome)安装crx插件

1、下载crx插件 2、插件扩展名改名为zip 3、解压zip文件 4、打开谷歌浏览器扩展程序 chrome://extensions/ 5、打开开发者模式,加载已解压的扩展程序,安装成功即如图展示

chrome浏览器安装插件,提示程序包无效

chrome浏览器安装插件的时候,如果提示 程序包无效:“CRX_HEADER_INVALID”,导致插件安装不上去,这个时候该怎么办呢?通常,这种错误在chrome浏览器版本73,以及之后的版本会出现 一、工具/原料 1…

谷歌浏览器(Chrome)如何安装crx插件?(详细步骤)

一、前言 谷歌浏览器在旧版本(大概是v67版本)之前安装crx插件都非常简单,直接将crx拖放到浏览器内就可以安装了。但是之后的新版本(目前已经升级到v80版本)就只允许用户通过谷歌应用商店安装插件,而不允许…

一份工作一年半的java开发个人简历,欢迎拍砖

一份个人简历,大四提前一年出来实习,在12306。 2020年毕业,开始第二份正式工作。 从大学毕业,只是我学习之路的刚刚开始。 简历所写的内容都是真实的,一点水分没有。 欢迎拍砖,希望大家能够针对我的简历&a…

java开发工程师简历模板,2022最新

模块科技招聘官莅临千锋教育 招聘Java开发工程师招聘官谢经理莅临千锋教育成都分校招聘10位Java开发工程师,谢经理在面试前的宣讲会上,为学员详细介绍了模块科技的发展现状和岗位需求,让学员对公司和岗位有了充分的认识。在随后的面试环节,学员们基于对企业的了解和自身职业发展…

java应届生简历个人技能该怎么写?

对于自学java的人来说,简历是个头痛的东西,因为我们并没有参考模板给我们看,所以我这里准备了几份网上搜集的个人技能模板,提供给大家参考。

可以写进简历的十大Java项目

临近毕业,有很多小伙伴会问,我要去面试了,但目前没有做过什么项目,有没有推荐的项目?今天学姐给大家推荐几个适合写在简历里的项目。 如果你是没有做过项目的小白,那么建议你去跟着项目视频学习&#xff0…

java开发工程师简历项目经验怎么写?应该注意哪些事项?

目前是面试的高峰期,所以有很多小伙伴们精心的准备自己的简历,希望在简历上体现自己的亮点所处?那么简历中的项目经验应该怎么写?应该注意哪些呢?接下来就让我们一起了解下吧。 java开发工程师简历项目经验怎么写&…

java开发工程师—如何让你的简历脱颖而出

最近我在帮朋友的公司招人,招人的第一步是要筛选简历,在这过程中,我发现虽然能收到很多简历,但实际能通过筛选能进入到技术面试流程的简历不多,估计10份里不会超过4份能通过筛选。 如果没法通过技术面试,那…

java个人简历模板(合集)

2017java个人简历模板免费参考 2017java个人简历模板篇1 姓名: 性别:男 年龄:22 学历:本科 专业:计算机 联系电话:xxx 毕业院校:xxxxx 主修课程:汇编语言程序设计、JAVA程序设计、数…