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

相关文章

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

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

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 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算法通过识别被低密