segformer多分类语义分割

2024-03-20 17:28
文章标签 分类 分割 语义 segformer

本文主要是介绍segformer多分类语义分割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

alt

前言

本期将分享「Segformer」,论文地址https://arxiv.org/abs/2105.15203。

Segformer简介

  • 全局上下文信息: 由于Transformer的自注意力机制,Segformer可以在整个图像范围内捕获上下文信息,而不受局部感受野的限制,这有助于提高分割的准确性。
  • 可扩展性: Transformer架构的并行计算能力使得Segformer在处理大尺度图像时表现更好,因为它可以更轻松地处理长距离的依赖关系。
  • 位置编码机制: Segformer使用了一种新的位置编码机制,有助于模型更好地理解像素之间的空间关系,从而提高分割的精度。 alt

数据集介绍

ISPRS提供了城市分类和三维建筑重建测试项目的两个最先进的机载图像数据集。该数据集采用了由高分辨率正交照片和相应的密集图像匹配技术产生的数字地表模型(DSM)。这两个数据集区域都涵盖了城市场景。其中Vaihingen是一个相对较小的村庄,有许多独立的建筑和小的多层建筑。

  • 不透水面 (RGB: 255, 255, 255)

  • 建筑物(RGB: 0, 0, 255)

  • 低矮植被 (RGB: 0, 255, 255)

  • 树木 (RGB: 0, 255, 0)

  • 汽车(RGB: 255, 255, 0)

  • 背景 (RGB: 255, 0, 0)

数据集处理

需要对原始数据集进行切分,并将原始值变成标签。这里我们使用gdal库,按256*256的滑窗进行裁切,并根据颜色映射进行赋值。

from osgeo import gdal, gdalconst
import os
import numpy as np

def color_to_value(rgb):
    color_mapping = {
        (255255255): 1,  # Impervious surfaces
        (00255): 2,      # Building
        (0255255): 3,    # Low vegetation
        (02550): 4,      # Tree
        (2552550): 5,    # Car
        (25500): 0       # Clutter/background
    }
    return color_mapping.get(tuple(rgb), 6)

def crop_images(image_folder1,label_folder, output_image_folder1,output_label_folder, size=256,window=256):
    # 获取文件夹中的文件名列表
    image_files1 = os.listdir(image_folder1)
    label_files = os.listdir(label_folder)

    # 遍历每个文件
    for image_file in image_files1:
        if image_file in label_files:
            # 读取图像和标签
            image_path1 = os.path.join(image_folder1, image_file)

            label_path = os.path.join(label_folder, image_file)

            # 打开遥感影像文件
            image_dataset1 = gdal.Open(image_path1, gdalconst.GA_ReadOnly)

            label_dataset = gdal.Open(label_path, gdalconst.GA_ReadOnly)

            if image_dataset1 is None or label_dataset is None:
                print(f"Failed to open {image_file} ")
                continue

            image_width1 = image_dataset1.RasterXSize
            image_height1 = image_dataset1.RasterYSize

            label_width = label_dataset.RasterXSize
            label_height = label_dataset.RasterYSize

            # 创建单通道数组
            single_channel_array = np.zeros((label_height, label_width), dtype=np.uint8)
            label_array = label_dataset.ReadAsArray()
            # 遍历图像像素,并根据颜色映射进行赋值
            for y in range(label_height):
                for x in range(label_width):
                    pixel_value = color_to_value(label_array[:, y, x])
                    single_channel_array[y, x] = pixel_value

            # 循环裁剪图像和标签
            for y in range(0, image_height1 - size, window):
                for x in range(0, image_width1 - size, window):
                    # 读取图像数据
                    image_data1 = image_dataset1.ReadAsArray(x, y, size, size)

                    label_data = single_channel_array[y:y+size,x:x+size]


                    # 保存裁剪后的图像和标签
                    output_image_path1 = os.path.join(output_image_folder1, f"{image_file[:-4]}_{x}_{y}.tif")

                    output_label_path = os.path.join(output_label_folder, f"{image_file[:-4]}_{x}_{y}.tif")

                    driver = gdal.GetDriverByName("GTiff")
                    new_image1 = driver.Create(output_image_path1, size, size, 3, gdal.GDT_Byte)

                    new_label = driver.Create(output_label_path, size, size, 1, gdal.GDT_Byte)

                    new_image1.SetProjection(image_dataset1.GetProjection())
                    new_image1.SetGeoTransform(
                        (x, image_dataset1.GetGeoTransform()[1], 0, y, 0, image_dataset1.GetGeoTransform()[5]))



                    new_label.SetProjection(label_dataset.GetProjection())
                    new_label.SetGeoTransform(
                        (x, label_dataset.GetGeoTransform()[1], 0, y, 0, label_dataset.GetGeoTransform()[5]))

                    new_image1.GetRasterBand(1).WriteArray(image_data1[0])
                    new_image1.GetRasterBand(2).WriteArray(image_data1[1])
                    new_image1.GetRasterBand(3).WriteArray(image_data1[2])



                    new_label.GetRasterBand(1).WriteArray(label_data)

                    new_image1.FlushCache()

                    new_label.FlushCache()

                    del new_image1, new_label

            image_dataset1 = None

            label_dataset = None


# 使用示例
crop_images(r"G:\download\ISPRS_semantic_labeling_Vaihingen\top",r"G:\download\ISPRS_semantic_labeling_Vaihingen\gts_for_participants" ,r"G:\download\ISPRS_semantic_labeling_Vaihingen\images",r"G:\download\ISPRS_semantic_labeling_Vaihingen\labels",size=256)

裁剪完成后对数据集进行划分,划分完成后的数据集包含679对训练集、156对验证集以及211对测试集。原始数据集与切分后数据集获取链接见文末。

loss变化

alt

测试精度

这里的iou0~iou5分别代表背景、建筑物等iou值。 alt

总结

按以下方式获取文中数据集。完整代码与训练结果请加入我们的星球。

如有需要,请关注微信公众号「DataAssassin」后,后台回复「030」领取。

「感兴趣的可以加入我们的星球,获取更多数据集、网络复现源码与训练结果的」

alt 加入前不要忘了领取优惠券哦! alt

往期精彩

SENet实现遥感影像场景分类
SENet实现遥感影像场景分类
BiseNet实现遥感影像地物
BiseNet实现遥感影像地物
FC-Densenet实现遥感影像道路分类
FC-Densenet实现遥感影像道路分类
pytorch实现遥感影像建筑物提取
pytorch实现遥感影像建筑物提取

本文由 mdnice 多平台发布

这篇关于segformer多分类语义分割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830203

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

基于YOLO8的图片实例分割系统

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 segment_app.py 二、核心代码介绍篇2.1 segment_app.py2.2 scan_taskflow.py 三、结语 代码资源:计算机视觉领域YOLO8技术的图片实例分割实