DeeplabV3训练数据

本文详细介绍如何在Python环境中利用LabelMe工具进行图像像素级标注,包括安装配置、数据转换及常见错误解决方法,适用于深度学习项目的数据预处理。

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://mp.youkuaiyun.com/postedit

(1)准备数据

在python环境下,或者Anaconda3环境下,pip安装/conda安装labelme。进行数据的像素点标注。

(2)将数据转化为我们需要的,参考博客;

https://blog.youkuaiyun.com/weixin_40877924/article/details/95798461

有可能出现numpy的问题,importerror cannot import name ‘_validate_lengths’

解决办法:找到:C:\Users\Administrat\Anaconda3\Lib\site-packages\numpy\lib\arraypad .py,打开.py文件,找到第954行,添加下面两个函数保存。

def _normalize_shape(ndarray, shape, cast_to_int=True):
    """
    Private function which does some checks and normalizes the possibly
    much simpler representations of ‘pad_width‘, ‘stat_length‘,
    ‘constant_values‘, ‘end_values‘.
    Parameters
    ----------
    narray : ndarray
        Input ndarray
    shape : {sequence, array_like, float, int}, optional
        The width of padding (pad_width), the number of elements on the
        edge of the narray used for statistics (stat_length), the constant
        value(s) to use when filling padded regions (constant_values), or the
        endpoint target(s) for linear ramps (end_values).
        ((before_1, after_1), ... (before_N, after_N)) unique number of
        elements for each axis where `N` is rank of `narray`.
        ((before, after),) yields same before and after constants for each
        axis.
        (constant,) or val is a shortcut for before = after = constant for
        all axes.
    cast_to_int : bool, optional
        Controls if values in ``shape`` will be rounded and cast to int
        before being returned.
    Returns
    -------
    normalized_shape : tuple of tuples
        val                               => ((val, val), (val, val), ...)
        [[val1, val2], [val3, val4], ...] => ((val1, val2), (val3, val4), ...)
        ((val1, val2), (val3, val4), ...) => no change
        [[val1, val2], ]                  => ((val1, val2), (val1, val2), ...)
        ((val1, val2), )                  => ((val1, val2), (val1, val2), ...)
        [[val ,     ], ]                  => ((val, val), (val, val), ...)
        ((val ,     ), )                  => ((val, val), (val, val), ...)
    """
    ndims = ndarray.ndim
    # Shortcut shape=None
    if shape is None:
        return ((None, None),) * ndims
    # Convert any input `info` to a NumPy array
    shape_arr = np.asarray(shape)
    try:
        shape_arr = np.broadcast_to(shape_arr, (ndims, 2))
    except ValueError:
        fmt = "Unable to create correctly shaped tuple from %s"
        raise ValueError(fmt % (shape,))
    # Cast if necessary
    if cast_to_int is True:
        shape_arr = np.round(shape_arr).astype(int)
    # Convert list of lists to tuple of tuples
    return tuple(tuple(axis) for axis in shape_arr.tolist())


def _validate_lengths(narray, number_elements):
    """
    Private function which does some checks and reformats pad_width and
    stat_length using _normalize_shape.
    Parameters
    ----------
    narray : ndarray
        Input ndarray
    number_elements : {sequence, int}, optional
        The width of padding (pad_width) or the number of elements on the edge
        of the narray used for statistics (stat_length).
        ((before_1, after_1), ... (before_N, after_N)) unique number of
        elements for each axis.
        ((before, after),) yields same before and after constants for each
        axis.
        (constant,) or int is a shortcut for before = after = constant for all
        axes.
    Returns
    -------
    _validate_lengths : tuple of tuples
        int                               => ((int, int), (int, int), ...)
        [[int1, int2], [int3, int4], ...] => ((int1, int2), (int3, int4), ...)
        ((int1, int2), (int3, int4), ...) => no change
        [[int1, int2], ]                  => ((int1, int2), (int1, int2), ...)
        ((int1, int2), )                  => ((int1, int2), (int1, int2), ...)
        [[int ,     ], ]                  => ((int, int), (int, int), ...)
        ((int ,     ), )                  => ((int, int), (int, int), ...)
    """
    normshp = _normalize_shape(narray, number_elements)
    for i in normshp:
        chk = [1 if x is None else x for x in i]
        chk = [1 if x >= 0 else -1 for x in chk]
        if (chk[0] < 0) or (chk[1] < 0):
            fmt = "%s cannot contain negative values."
            raise ValueError(fmt % (number_elements,))
    return normshp


###############################################################################
# Public functions​

或者参考博客:https://blog.youkuaiyun.com/TeFuirnever/article/details/90762287

(3)得到文件大致如下:

(4)将数据传到服务器中,只需要imges_dir和labels_dir。

(5)修改你的deeplabv3程序中,将输入数据转化为.csv格式的.py文件。改变你的类别等相关信息。

(6)更改你训练.py中的相关参数。训练即可。

 

<think>好的,我现在要帮用户解决如何使用DeepLabV3训练裂缝检测数据集的问题。首先,我需要回顾用户提供的引用内容,看看里面有没有相关的信息。用户提到了引用[3],里面详细说明了在PyTorch中使用DeepLabv3进行迁移学习的步骤,特别是数据集的初始化和加载方法。还有引用[4]提到如何计算评估指标,比如IOU和准确率,这些在训练过程中很重要。 接下来,我需要确定用户的需求。用户有2000多张训练图像,带有mask标签,属于语义分割任务。他们希望得到教程和示例代码。因此,我应该按照数据准备、模型构建、训练循环、评估和推理的步骤来组织回答。 数据准备部分,需要确保用户的数据集结构正确,可能包括图像和对应的mask文件夹。然后,自定义数据集类,这部分引用[3]提到了__init__、__getitem__和__len__方法,需要按照这个结构来写代码。数据增强也是关键,比如随机翻转和归一化,这些能提升模型泛化能力。 模型构建方面,用户想用DeepLabV3,PyTorch官方有预训练模型,可以直接加载。需要替换分类器部分,将输出通道改为裂缝类别数,通常是二分类(裂缝和背景)。这里要提醒用户根据实际情况调整。 训练循环部分,需要定义损失函数和优化器。交叉熵损失适合分类任务,优化器可以用Adam或SGD。引用[4]提到评估指标,所以每个epoch结束后需要计算IOU、精确度等,并保存最佳模型。这部分代码需要整合进去,确保用户能直接使用。 评估和推理阶段,要展示如何加载训练好的模型进行预测,并可视化结果。同时,绘制训练曲线帮助分析模型表现,这也是用户可能需要的。 可能遇到的问题包括数据路径错误、标签格式不正确(比如mask是否为单通道二值图像)、训练时的显存不足。需要提醒用户注意这些点,并建议调整批量大小或图像尺寸。 最后,生成相关问题,帮助用户深入理解,比如数据增强方法、评估指标意义、迁移学习优势等。确保回答结构清晰,代码正确,并且参考了用户提供的引用内容,特别是引用[3]和[4]中的关键步骤。</think>以下是使用DeepLabV3训练裂缝检测数据集的完整教程和代码示例,基于PyTorch框架实现: --- ### 一、数据集准备 1. **数据结构要求** ``` /dataset /train /images (存放原始图像) /masks (存放裂缝掩膜标签) /val /images /masks ``` 2. **自定义数据集类** ```python import torch from torch.utils.data import Dataset from PIL import Image class CrackDataset(Dataset): def __init__(self, img_dir, mask_dir, transform=None): self.img_paths = sorted(Path(img_dir).glob("*.jpg")) self.mask_paths = sorted(Path(mask_dir).glob("*.png")) self.transform = transform def __len__(self): return len(self.img_paths) def __getitem__(self, idx): img = Image.open(self.img_paths[idx]).convert("RGB") mask = Image.open(self.mask_paths[idx]).convert("L") # 单通道灰度图 if self.transform: img = self.transform(img) mask = self.transform(mask) return img, mask.long() ``` --- ### 二、模型构建与训练 1. **数据增强与加载** ```python from torchvision import transforms train_transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.Resize((512, 512)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) train_dataset = CrackDataset("dataset/train/images", "dataset/train/masks", transform=train_transform) train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True) ``` 2. **DeepLabV3模型初始化** ```python import torchvision.models.segmentation as segmentation model = segmentation.deeplabv3_resnet50(pretrained=True) model.classifier[4] = torch.nn.Conv2d(256, 2, kernel_size=(1, 1)) # 修改输出通道数为裂缝类别数 model = model.to(device) ``` 3. **训练循环** ```python criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) for epoch in range(100): model.train() for images, masks in train_loader: images = images.to(device) masks = masks.squeeze(1).to(device) # [batch, H, W] outputs = model(images)[&#39;out&#39;] loss = criterion(outputs, masks) optimizer.zero_grad() loss.backward() optimizer.step() # 验证集评估(需补充验证代码) print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}") ``` --- ### 三、评估指标计算(引用[4]) ```python def calculate_iou(pred, target): intersection = (pred & target).float().sum() union = (pred | target).float().sum() return (intersection + 1e-6) / (union + 1e-6) def evaluate(model, dataloader): model.eval() total_iou = 0.0 with torch.no_grad(): for images, masks in dataloader: outputs = model(images)[&#39;out&#39;] preds = torch.argmax(outputs, dim=1) total_iou += calculate_iou(preds, masks) return total_iou / len(dataloader) ``` --- ### 四、模型推理 ```python def predict(image_path): img = Image.open(image_path).convert("RGB") img_tensor = train_transform(img).unsqueeze(0).to(device) with torch.no_grad(): output = model(img_tensor)[&#39;out&#39;] pred_mask = torch.argmax(output.squeeze(), dim=0).cpu().numpy() plt.imshow(pred_mask) plt.show() ``` --- ### 关键注意事项 1. 裂缝标签需为单通道二值图(0表示背景,1表示裂缝)[^3] 2. 建议使用预训练权重加速收敛[^2] 3. 训练时注意类别不平衡问题,可添加权重调整策略 4. 推荐使用混合精度训练节省显存
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值