CV经典任务(一) 语义分割、实例分割 | 全卷积

news2024/11/24 18:46:38

文章目录

  • 1 语义分割
    • 1.1 思路1 滑动窗口
    • 1.2 思路2 全卷积网络
  • 2 代码实现
  • 3 实例分割

之前讲了分类

实际中除了分类还有几大视觉任务

语义分割,实例分割,目标检测

以上任务基本也都基于前面讲的卷积网络去做的

1 语义分割

语义分割(Semantic Segmentation)

语义分割的目标是将图像中的每个像素分割成不同的类别,但不区分同一类别中的不同实例。它只关心图像中的不同物体类别,而不关心它们是否属于不同的实例。

语义分割通常用于识别图像中的不同物体类别,如图像分割、图像分析、医学图像分析等。

1.1 思路1 滑动窗口

语义分割思路:滑动窗口

首先,选择一个固定大小的窗口(通常是正方形或矩形),然后将该窗口从图像的左上角开始滑动,按照一定的步长(通常是像素数)在图像上进行滑动。这将生成一系列重叠的图像窗口。

对于每个滑动窗口,从窗口中提取特征。然后对这个窗口做分类

这种方法可以工作,但效率太低。重叠区域特征反复被计算

因而更多采用思路2

1.2 思路2 全卷积网络

采用全卷积网络 也就是用全部都是多层的全卷积

这是怎么思考的呢?之前我们是给一整张图像做分类,而我们现在是给图像的每一个像素做分类

如果我最后一个卷积层输出的是(H×W×C)

H,W是图像的宽高,C是可能的分类的类别数

这样的话每一个像素点被映射为C维的向量,而我的标答也做成(H×W×C) 这样的话输出和标记之间就可以做损失函数运算了

但是有又有一个问题,就是我们中间 一直保持着原图的像素尺寸,中间计算量会很大,所以我们考虑通过先减小像素尺寸(下采样),再增大像素尺寸(上采样)

把特征图变小其实不难 如池化层,卷积层增大步长等

把特征图变大我们其实并没有学过
在这里插入图片描述

这里运用很多的是 转置卷积操作

特别方式

可学习的上采样:转置卷积

首先我们需要知道卷积操作是可以写作矩阵相乘的,只有这样我们才能实现并行运算,极大的加快运算速度

具体我们看这样一个二维的例子

输入图像 I(3x3的矩阵):

I = | 1  2  3 |
    | 4  5  6 |
    | 7  8  9 |

卷积核 K1(2x2的矩阵):

K1 = | a0  b0 |
    | c0  d0 |

我们希望将输入图像 I 与卷积核 K 进行卷积操作。

如果按照我们之前的卷积从左上角开始滑动,那么每一次运算必须等上一次运算完

而实际上我们可以把图像I写成这样一个矩阵

I_expanded = | 1  2  4  5 |
            | 2  3  5  6 |
            | 4  5  7  8 |
            | 5  6  8  9 |

这是什么意思呢?就是把卷积核要运算的第一个方格(左上角的四个元素)里的元素展平放在第一行

要运算的第二个方格(右上角的四个元素)里的元素展平放在第二行

要运算的第三个方格(左下角的四个元素)里的元素展平放在第三行

要运算的第四个方格(右下角的四个元素)里的元素展平放在第四行

展开卷积核 K1:将2x2的卷积核 K 按照大小展开成一个列向量。

K1_expanded = [a0 
			  b0  
			  c0 
              d0]

这样的话,将展开后的输入图像矩阵 I_expanded 与展开后的卷积核 K_expanded 进行矩阵相乘,得到卷积结果。

卷积前大小 (3×3)展开矩阵是(4×4)

卷积后大小(2×2)展开后是(4×1)

那么我们怎么把卷积后的这个大小恢复成原来的大小呢

得到的结果(4×1)乘 卷积核转置(1×4) =(4×4)

这也是为什么称之为转置卷积

现在更多还使用一类叫做Unet

是在刚刚讲的基础上的改进

就是通过连接两个相同尺寸的把前面层的信息拼接到后面的层的信息,如下图 使得不同分辨率的语义(无论是高层还是底层)的信息都可以捕捉

在这里插入图片描述

2 代码实现

我们这次直接采用预训练模型来搭建这个网络

(1)对于下采样部分采用ReNet的预训练模型

Resnet会把输入图片的宽高缩为原来的1/32,通道数变为512

假设输入图片宽高 320,480,所以中间输出的宽高变为10,15

(2)对于上采样部分采用转置卷积网络

首先通过1×1卷积层把通道数变为分类总数,例子中是20

然后再经过转置卷积改变特征图尺寸,要把它扩大32倍,那么步长就是s=32

卷积核尺寸=2s=64

填充=s/2=16

上面这一套卷积核参数设置就可以把它扩大32倍

import os
import torch
import torchvision
from torch import nn
#@save

#采用resnet做下采样
pretrained_net=torchvision.models.resnet18(pretrained=True)

#resnet的最后两层全局平均池化层和线性层丢弃
net=nn.Sequential(
    *list(pretrained_net.children())[:-2]
)
#模拟输入 图像宽高320,480,通道数3
x=torch.rand(size=(1,3,320,480))

#经过Renet的输出中间输出
print(net(x).shape)

#采用转置卷积网络做上采样
num_classes=20#要分类的类别是20
#模拟输入 图像宽高320,480,通道数3
x=torch.rand(size=(1,3,320,480))
#先改变通道数
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))
#最终输出
print(net(x).shape)

输出

torch.Size([1, 512, 10, 15])
torch.Size([1, 20, 320, 480])

可验证,中间输出的宽高变为10,15

最后输出恢复原始图像宽高,通道数变为分类总数20

3 实例分割

实例分割(Instance Segmentation)

实例分割的主要目标是将图像中的每个对象实例分割成不同的区域,并为每个区域分配一个唯一的标识符。这意味着它不仅可以识别不同类别的对象,还可以区分同一类别中的不同实例,如图像中的多个人或多辆车。

实例分割通常在需要区分不同对象实例的场景中使用,如自动驾驶中的行人检测和跟踪、人物姿势估计等。

以下是一些重要的深度学习方法和架构,用于实例分割任务:

  1. Mask R-CNN:Mask R-CNN是一种基于Faster R-CNN的扩展,它通过添加额外的分割分支来实现实例分割。除了目标的边界框,Mask R-CNN还生成了每个对象实例的像素级掩码,从而提供了准确的分割结果。这使得 Mask R-CNN 成为实例分割任务的流行选择。
  2. Panoptic Segmentation:Panoptic分割是一种将语义分割和实例分割结合起来的任务,旨在将图像中的每个像素分为具有语义标签的物体类别或属于特定对象实例。Panoptic分割方法通常使用深度学习模型来实现,如Panoptic FPN等。
  3. DETR(Data Efficient Transformer):DETR 是一种新兴的实例分割方法,它基于Transformer架构,将实例分割任务转化为一个端到端的目标检测和分割问题。DETR 通过注意力机制来对目标的位置和像素级别的分割进行联合建模,取得了卓越的性能。
  4. PointRend:PointRend 是一种用于提高实例分割性能的方法,特别关注于处理分割边缘区域的细节。它通过逐像素的自适应池化操作来改进掩码的质量,从而提高分割精度。
  5. SOLO(Segmenting Objects by Locations):SOLO 是一种基于实例的分割方法,它使用了网格级别的特征图和目标特定的位置信息,以实现物体实例的分割。SOLO 将实例分割任务与目标检测分割任务相结合。
  6. Embedding-based方法:一些实例分割方法采用嵌入向量来表示每个像素,然后使用聚类技术或后处理步骤来将像素分配到不同的实例。这些方法在性能和效率方面取得了良好的平衡。

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

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

相关文章

基于微信小程序的大学生科技竞赛竞技报名系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【高阶数据结构】红黑树(C++实现)

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

Docker(三)、Dockerfile探究

Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…

Java面向对象高级

文章目录 面向对象高级Object类的常用方法常用方法一(面向对象阶段)** 和 equals 的区别** 关键字native**单例设计模式(Singleton)**前情回顾(学习基础)静态修饰符Static设计模式概念开发步骤**两种实现方…

标准化、逻辑回归、随机梯度参数估计

机器学习入门 数据预处理: 将?替换为缺失值 data data.replace(to_replace"?",valuenp.nan)丢掉缺失值 data.dropna(how"any) #howall删除全是缺失值的行和列 #haowany删除有缺失值的行和列将数据集划分成测试集和训练集 data[colu…

自动混剪多段视频、合并音频、添加文案的技巧分享

在如今的社交媒体时代,视频的重要性越来越被人们所重视。许多人喜欢记录生活中的美好瞬间,并将其制作成视频分享给朋友和家人。然而,对于那些拍摄了大量视频的人来说,一个一个地进行剪辑和合并可能是一项令人头痛的任务。但是&…

Vue3最佳实践 第五章 Vue 组件应用 4 ( provide 和 inject )

5.5 provide 和 inject 前面的知识告诉我们vue中组件之间传递值需要使用props来完成,但是props也有一定局限性。这个时候在vue3中还有另外的解决方法。那就是使用 provide 和 inject 允许父组件将数据传递给所有后代组件,而不管组件层次结构有多深。你要…

CSS之伪类和伪元素 | :before和::before

例子: & 表示嵌套的上一级。如 &:hover 相当于 上一级元素:hover :hover 伪类 :before 伪元素,在元素之前加入某内容(一定要写 content ) display:none; 隐藏对象。display隐藏元素后,不占原先位置…

如何开发物联网 APP?

如何开发物联网 APP? 这个问题本身是不严谨的,APP只是手机端的一个控制或者用于显示的人机交互页面,物联网是通过传感器,物联网卡等模块把物体接入网络以方便远程监控或者控制等。 你问的应该是怎么开发出来一个远程控制物体的APP吧&#x…

每日一练 | 网络工程师软考真题Day37

1、TCP协议在建立连接的过程中可能处于不同的状态,用netstat命令显示出TCP连接的状态为SYN_SEND,那么这个连接正处于 。 A.监听对方的建立连接请求 B.已主动发出连接建立请求 C.等待对方的连接释放请求 D&#xff…

cocoapods引擎插件所管理的开源库内新增声明文件 对外公开

cocoapods引擎插件所管理的开源库内新增声明文件,供外部业务层直接/间接访问 DemoDemo-Prefix.pch 备注:业务层项目(比如:BaseFramesDemo) target Build settings搜索Search Paths,然后点击它,看到Always Search User Paths&a…

【lesson7】yum的介绍及使用

文章目录 预备工作yum的基本过程yum的操作**yum源问题:****yum三板斧:**yum listyum searchyum list | grepyum installyum install -yyum removeyum remove -y 预备工作 首先有三个问题: 问题解答: 这里我们联想到了手机 问题…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信…

组合数3 - lucas a、b较大的组合数

复杂度,约等于plogp #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double ld;ll a, b, mod;ll qmi(ll a, ll k) {l…

Vue 的动态菜单表格数据展示以及分页查询实现

前言&#xff1a; 在上一篇博客中实现了左侧菜单栏&#xff0c;今天我就来实现与后台的交互即动态的展示数据库的数据&#xff0c;还有数据表格的实现以及分页。 一&#xff0c;导航菜单交互后台 要确定静态树形菜单的排版 再通过后台获取树形节点的数据 通过拿到的数据&#…

异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程

异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程 文章目录 异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣&#xff0c;但不幸的是&#xff…

CleanMyMac X版本4.14.2中文版新功能介绍

CleanMyMac X版本4.14.2中文版是一款专业的Mac清理工具&#xff0c;只需要一键智能清理&#xff0c;便能让Mac恢复原始的性能&#xff0c;是MAC系统非常好用的工具。CleanMyMac X自身拥有一个安全数据库&#xff0c;它是一个项目列表&#xff0c;拥有一定的规格&#xff0c;可以…

C++之mutex、operator()、lambda应用总结(二百三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

服务器端应用的安装

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

CSS滚动条详解(::-webkit-scrollbar )

滚动条出现的事件&#xff1a; 当设置定宽或者定高的元素添加overflow:scroll属性&#xff0c;会出现滚动条&#xff0c;但是原生样式的会比较丑影响美观。 <div class"content"><div class"contain"></div> </div>.content {wid…