从零开始复现seaformer(语义分割)训练自己的数据集——linux

本文介绍了如何基于SeaFormer算法对自研数据集进行轻量级皮肤分割模型的开发,包括SeaFormer源码下载、数据集制作、环境配置、模型训练以及结果输出的详细步骤。

引言:

出于模型轻量化需求,需对原有的皮肤分割模型进行重新研发。seaformer是作为今年复旦大学和腾讯联合提出的轻量级语义分割算法,具有很好的参考价值。因此,作者基于seaformer算法对自研数据集进行训练,完成轻量级皮肤分割模型的开发。

一、seaformer源码下载

1.下载地址:https://github.com/fudan-zvg/SeaFormer

2.解压到自己的目录当中,我们主要使用sesaformer-seg,具体结构如下:

二、制作相关数据集

1.使用labelme工具对自己的数据进行标注,具体不再赘述

2.通过labelme工具进行数据标注后,我们可以得到原图和.json文件

3.将.josn文件批量转换为用于训练的mask,文件具体格式如下:

批量转换可参考:将labelme的json文件批量转为png形式 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/649269470创建data文件夹,在data文件夹下新建cityscapes文件夹,cityscapes文件夹底下再新建gtFine与leftImg8bit文件夹(gtFine与leftImg8bit同级)。在leftImg8bit文件夹中存放原图(后缀为.png格式),gtFine文件夹用来存放8bit的全黑mask图像(此时暂为空)。具体结构如下:

.json文件完成转换后,第一张全黑的图片就是我们需要的图像,参照seaformer中训练数据集cityscapes,要求的标签图像格式为8bit(原标签图像为24bit),通过以下代码实现转换:

import cv2
import os

# 24bit to 8bit
bit24_dir = r'E:\Face_Parsing_BiseNetV2-master\ATR\masks'  # 存放.json转换后的24bit全黑图像文件夹
if not os.path.exists('data/cityscapes/gtFine'):
    os.makedirs('data/cityscapes/gtFine')
bit8_dir = 'data/cityscapes/gtFine'
png_names = os.listdir(bit24_dir)
for i in png_names:
    img = cv2.imread(bit24_dir + '/' + i)
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    cv2.imencode('.png', gray)[1].tofile(bit8_dir + '/' + i)

4.创建并运行train_val.py完成训练数据集与测试数据集的划分

import os
import random
import shutil

total_list = []
train_list = []
val_list = []

image_path = 'data/cityscapes/leftImg8bit'
label_path = 'data/cityscapes/gtFine'

# 清空
for dir in ['train', 'val']:
    image_dir = os.path.join(image_path, dir)
    label_dir = os.path.join(label_path, dir)
    if os.path.exists(image_dir):
        shutil.rmtree(image_dir)
    os.makedirs(image_dir)
    if os.path.exists(label_dir):
        shutil.rmtree(label_dir)
    os.makedirs(label_dir)

for root, dirs, files in os.walk(image_path):
    for file in files:
        if file.endswith('png'):
            total_list.append(file)

total_size = len(total_list)
train_size = int(total_size * 0.8)
val_size = total_size - train_size

train_list = random.sample(total_list, train_size)
remain_list = list(set(total_list) - set(train_list))
val_list = random.sample(remain_list, val_size)

for file in total_list:
    image_path_0 = os.path.join(image_path, file)
    label_file = file.split('.')[0] + '.png'
    label_path_0 = os.path.join(label_path, label_file)
    if file in train_list:
        image_path_1 = os.path.join(image_path, 'train', file)
        shutil.move(image_path_0, image_path_1)

        label_path_1 = os.path.join(label_path, 'train', label_file)
        shutil.move(label_path_0, label_path_1)

    elif file in val_list:
        image_path_1 = os.path.join(image_path, 'val', file)
        shutil.move(image_path_0, image_path_1)

        label_path_1 = os.path.join(label_path, 'val', label_file)
        shutil.move(label_path_0, label_path_1)

print(len(total_list))
print(len(train_list))
print(len(val_list))

生成目录格式:

三、训练seaformer网络

1.环境搭建:

1)conda 虚拟环境创建

conda create -n your_env_name python=x.x  #python==3.8(作者版本)

2)激活虚拟环境并安装pytorch(gpu),建议安装1.8版本,太高版本的pytorch在安装mmcv-full时会在build时出现报错

3)安装mmcv-full

pip install -U openmim
mim install mmcv-full==1.5.0 #seaformer要求1.3.14版本(1.5.0为作者版本)

4)安装相关依赖包

cd /home/uboot/chen/SeaFormer-main/seaformer-seg
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.修改相关代码文件

1)修改SeaFormer-main\seaformer-seg\local_configs\seaformer\seaformer_small_1024x512_160k_1x8city.py文件

将num_classes修改为自己的类别数,background算一个类,其他按照自己的图像尺寸进行修改。

2)在seaformer-seg下创建modelzoos文件夹,在modelzoos文件夹下创建classification文件夹用于存放seaformer提供的预训练权重文件,将下载的预训练权重改名为SeaFormer_S.pth。修改SeaFormer-main\seaformer-seg\local_configs\seaformer\seaformer_small.py,改为自己的类别数并将第一行中的SyncBN改为BN

3)修改SeaFormer-main\seaformer-seg\mmseg\datasets\cityscapes.py,修改为自己的标签名,颜色随便填;img_suffix和seg_map_suffix记得修改不然会出现加载不到图像报错的情况。

四、开始训练

bash tools/dist_train.sh local_configs/seaformer/seaformer_small_1024x512_160k_1x8city.py 1

迭代次数可以在SeaFormer-main\seaformer-seg\local_configs\_base_\schedules\schedule_160k.py中设置

五、结果输出

记录一下,若存在不对的地方,请大家多多包涵~

关于 SeaFormer 的具体信息,在当前提供的引用材料中并未提及相关内容。然而,可以推测 SeaFormer 可能是一种特定的机器学习模型或架构,可能与序列建模、自然语言处理或其他形式的时间序列数据有关。以下是对其潜在特性的分析: ### 1. **SeaFormer 的定义** 虽然未提供直接描述 SeaFormer 的资料,但从命名来看,“SeaFormer” 很可能是一个基于 Transformer 架构的变体[^4]。Transformer 是一种广泛应用于自然语言处理和其他序列任务的强大模型架构,其核心机制包括自注意力(self-attention)和前馈网络。 如果 SeaFormer 是一种新的 Transformer 变体,则它可能会针对某些特定应用场景进行了优化,例如提高计算效率、减少内存占用或增强对长序列的支持。 ### 2. **SeaFormer 的潜在特性** 假设 SeaFormer 属于 Transformer 家族,它可以具备以下特点: - **高效性**:通过引入稀疏注意力机制或分块策略来降低计算复杂度。 - **灵活性**:支持多种类型的输入数据,不仅限于文本,还可以扩展到图像或多模态数据。 - **可解释性改进**:鉴于现有深度神经网络的“黑盒”问题[^1],SeaFormer 或许会尝试通过可视化技术或简化模型结构提升透明性和可信度。 下面展示了一个典型的 Transformer 编码器实现代码作为参考: ```python import torch.nn as nn class TransformerEncoderLayer(nn.Module): def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1): super().__init__() self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) self.linear1 = nn.Linear(d_model, dim_feedforward) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(dim_feedforward, d_model) def forward(self, src): src2 = self.self_attn(src, src, src)[0] src = src + src2 src2 = self.linear2(self.dropout(torch.relu(self.linear1(src)))) src = src + src2 return src ``` 此代码片段展示了标准 Transformer 编码器的核心组件,而 SeaFormer 如果存在的话,很可能是对此类基础模块的一种创新改造。 ### 3. **应用领域** 考虑到 Transformer 已经被成功部署在许多实际场景中,比如文本分类[^2] 和药物设计[^3],SeaFormer 同样也可能适用于类似的高维数据分析任务。例如: - 自然语言理解中的情感分析; - 生物医学领域的蛋白质折叠预测; - 时间序列预测中的金融趋势监控。 尽管目前缺乏确切的技术细节,但上述推断能够帮助构建初步认知框架。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值