swin-unet训练VOC数据集之生成.npz文件

划重点:label标签矩阵必须将每个像素值转成对应的类别标签(0~21,0为背景类,1~20为物体类);

否则会报错:

... thread: [869,0,0] Assertion `t >= 0 && t < n_classes` failed.

RuntimeError: CUDA error: device-side assert triggered

说来惭愧,我也是自己百度了好几天,才弄明白的。路漫漫其修远兮,吾将上下而求索!Ypa!

make_npz.py代码如下:

import glob
import cv2
import numpy as np
import os
from tqdm import tqdm
import torch
from PIL import Image

# # 标签中每个RGB颜色的值
VOC_COLORMAP = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],
                [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],
                [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],
                [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],
                [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],
                [0, 64, 128]]
# 标签其标注的类别
VOC_CLASSES = ['background', 'aeroplane', 'bicycle', 'bird', 'boat',
               'bottle', 'bus', 'car', 'cat', 'chair', 'cow',
               'diningtable', 'dog', 'horse', 'motorbike', 'person',
               'potted plant', 'sheep', 'sofa', 'train', 'tv/monitor']

colormap2label = torch.zeros(256**3, dtype=torch.uint8) # torch.Size([16777216])
for i, colormap in enumerate(VOC_COLORMAP):
    # 每个通道的进制是256,这样可以保证每个 rgb 对应一个下标 i
    colormap2label[(colormap[0] * 256 + colormap[1]) * 256 + colormap[2]] = i

# 构造标签矩阵
def voc_label_indices(colormap, colormap2label):
    colormap = np.array(colormap.convert("RGB")).astype('int32')
    idx = ((colormap[:, :, 0] * 256 + colormap[:, :, 1]) * 256 + colormap[:, :, 2]) 
    return colormap2label[idx] # colormap 映射 到colormaplabel中计算的下标

def npz(im, la, s):
    images_path = im
    labels_path = la
    path2 = s
    images = os.listdir(images_path)
    
    for s in tqdm(images):
        # print('s:', s)
        image_path = os.path.join(images_path, s)
        label_path = os.path.join(labels_path, s.split('.')[0]+'.png')

        # print('label_path:',label_path)
        image = Image.open(image_path).convert("RGB")
        label = Image.open(label_path).convert("RGB")

        # image = cv2.imread(image_path)
        # image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
        # # 标签由三通道转换为单通道
        # # label = cv2.imread(label_path, flags=0)
        # label = cv2.imread(label_path)
        # label = cv2.cvtColor(label,cv2.COLOR_BGR2RGB)

        label=voc_label_indices(label, colormap2label)
        # print('label.shape:',label.shape)
        # print('label:',label)
        # cnt+=1
        # if cnt>11:
        #     break
        # 保存npz文件 
        np.savez(path2+s[:-4]+".npz",image=image,label=label)

TRAIN_IMG_PATH='H:/2023_Files/Dataset/VOC_2012_SEG_V2/train'
TRAIN_LABEL_PATH='H:/2023_Files/Dataset/VOC_2012_SEG_V2/train_GT'
# H:\2023_Files\Dataset\VOC_2012_SEG_V2\train_GT
TRAIN_NPZ_SAVE_PATH='./data/VOC_2012_SEG_V2/train_npz/'

VAL_IMG_PATH='H:/2023_Files/Dataset/VOC_2012_SEG_V2/valid'
VAL_LABEL_PATH='H:/2023_Files/Dataset/VOC_2012_SEG_V2/valid_GT'
VAL_NPZ_SAVE_PATH='./data/VOC_2012_SEG_V2/val_npz/'


print('start make npz')
npz(TRAIN_IMG_PATH, TRAIN_LABEL_PATH, TRAIN_NPZ_SAVE_PATH)

npz(VAL_IMG_PATH, VAL_LABEL_PATH, VAL_NPZ_SAVE_PATH)

print('done!!!')

finally,在本地GTX 1050Ti利用VOC语义分割数据集训练Swin Unet,速度还可以,2.5min一个epoch,暂时训练50个epoch,后面放到AutoDL服务器训练,具体如下图。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Swin-UNet是一种新型图像分割模型,它融合了Swin Transformer和UNet的特性,具有较好的图像分割能力。下面我将简单介绍如何使得Swin-UNet运行。 首先,准备好所需的开发环境,包括Python环境和必要的库。确保安装好PyTorch、Torchvision和其他所需的依赖项。 接下来,下载Swin-Transformer和Swin-UNet的代码。这些代码可以从GitHub上的相关仓库获取,可以使用Git命令将代码克隆到本地。确保克隆了最新的代码版本。 然后,准备好训练数据集。您可以选择一个适合您的应用场景的图像分割数据集,确保该数据集已经按照要求进行标注。将训练和验证数据集划分好,并按照指定的格式准备好。 接着,根据Swin-UNet的文档或示例代码,配置模型的参数和超参数。这些参数包括输入图像大小、批大小、学习率、网络层的尺寸等。根据您的需求和硬件资源,进行相应的调整。 之后,使用准备好的数据集进行训练。使用训练数据集和配置好的参数,运行训练代码,开始训练Swin-UNet模型。根据需要,您可以设定训练的迭代次数或停止条件。 训练完成后,您可以使用训练好的Swin-UNet模型进行图像分割任务的推理。提供一张测试图像,通过加载训练好的模型并对测试图像进行预测,获取图像分割的结果。 最后,根据需要对模型进行评估和调优。使用预留的验证数据集,计算模型在图像分割任务中的精度、召回率、准确率等指标。根据评估结果,进行模型的参数调整或其他优化操作。 总结来说,要使Swin-UNet跑通,您需要准备好开发环境、获取代码和数据集、配置参数、进行训练和推理,并对模型进行评估和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值