Unet如何制作自己的训练集

这篇博客介绍了如何利用LabelMe工具制作自定义的UNET训练数据集。首先在CMD中激活虚拟环境并安装LabelMe,然后打开软件对图像进行标注。完成后,通过Python脚本将JSON文件转换为图像和对应的像素标签。注意,`classes`变量应根据实际图像内容进行调整。最终,你将得到用于UNET训练的图像和标签文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在学unet,所以分享一个如何做一个自己想要的训练集,而不是去从网上找的博客。
首先打开cmd
在这里插入图片描述
输入你自己的虚拟环境,我是在base直接把所有环境都安好了,就不想在创建虚拟环境在安装了。
然后

pip install labelme==3.16.7

在这里插入图片描述
下载好了之后直接输入labelme
在这里插入图片描述

这就是打开后的样子
然后对所选择的图形进行描图,就像这样
在这里插入图片描述
最后他会在你的指定文件下生成一个josn文件,你现在还不能直接打开这个josn文件,需要运行代码

import argparse
import base64
import json
import os
import os.path as osp
import warnings

import numpy as np
import PIL.Image
import yaml
from labelme import utils


if __name__ == '__main__':
    jpgs_path = "datasets/JPEGImages"
    pngs_path = "datasets/SegmentationClass"
    classes = ["_background_", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow",
               "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train",
               "tvmonitor"]
    # classes = ["_background_","cat","dog"]

    count = os.listdir("./datasets/before/")
    for i in range(0, len(count)):
        path = os.path.join("./datasets/before", count[i])

        if os.path.isfile(path) and path.endswith('json'):
            data = json.load(open(path))

            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')

            img = utils.img_b64_to_arr(imageData)
            label_name_to_value = {'_background_': 0}
            for shape in data['shapes']:
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value

            # label_values must be dense
            label_values, label_names = [], []
            for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                label_values.append(lv)
                label_names.append(ln)
            assert label_values == list(range(len(label_values)))

            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)

            PIL.Image.fromarray(img).save(osp.join(jpgs_path, count[i].split(".")[0] + '.jpg'))

            new = np.zeros([np.shape(img)[0], np.shape(img)[1]])
            for name in label_names:
                index_json = label_names.index(name)
                index_all = classes.index(name)
                new = new + index_all * (np.array(lbl) == index_json)

            utils.lblsave(osp.join(pngs_path, count[i].split(".")[0] + '.png'), new)
            print('Saved ' + count[i].split(".")[0] + '.jpg and ' + count[i].split(".")[0] + '.png')

在这里说一下classes这一行代码,这个是需要你根据你所处理图像里面的内容而定的。这里需要稍做修改。

最后,你所需要的unet训练集就出来了。

### 创建和准备用于UNet神经网络训练数据集 #### 数据收集 为了构建有效的UNet模型,数据集的质量至关重要。理想情况下,应获取大量高质量的医学影像数据,如CT扫描、MRI等。这些图像应当具有足够的分辨率,并且标注精确。对于医疗应用而言,可能需要专门领域专家来提供可靠的分割标签[^2]。 #### 图像预处理 在正式进入训练之前,原始图像往往需要经过一系列标准化操作: - **尺寸调整**:确保所有输入图片都具备相同的宽度和高度;如果源文件大小不一,则需统一裁剪或填充至固定规格。 - **灰度转换/通道匹配**:根据具体任务需求决定是否要将彩色图转成单通道灰阶形式,或是保留RGB三原色不变。另外还需注意目标掩码(mask)也得同步做相应修改以保持一致性。 - **归一化处理**:通过线性变换等方式把像素强度映射到特定区间内(比如\[0,1\]),从而加速收敛过程并提高数值稳定性。 #### 制作训练样本对 针对语义分割类问题来说,除了常规意义上的特征矩阵X之外还需要额外准备对应的真值Y即ground truth mask。二者之间存在一一对应关系——每一个体素位置处要么属于前景物体要么背景区域之一。因此,在实际编码实现时可以采用如下方式组织目录结构: ``` dataset/ ├── images/ │ ├── img_001.png │ └── ... └── masks/ ├── msk_001.png └── ... ``` 其中`images`文件夹里存放待分析对象本身而`masks`则保存经由人工勾勒出来的边界轮廓信息作为监督信号供后续反向传播机制调用优化权重参数之用。 #### 数据增强 考虑到生物医学领域能够获得的有效实例相对有限,适当引入随机扰动手段有助于扩充可用素材库规模进而改善泛化能力。常见的策略有旋转翻转变形以及仿射变换等等[^1]。 ```python import numpy as np from skimage import transform def random_rotation(image, max_angle=25): angle = np.random.uniform(-max_angle, max_angle) rotated_image = transform.rotate(image, angle, resize=False, mode='reflect', preserve_range=True).astype(np.uint8) return rotated_image def horizontal_flip(image): flipped_image = image[:, ::-1] return flipped_image ``` 上述代码片段展示了两种简单易行的方法用来在线生成更多变种版本辅助提升鲁棒性和抗干扰性能。 #### 构建PyTorch Dataset子类 最后一步就是定义自定义Dataset以便于配合DataLoader迭代器高效读取批次数据流供给给定框架下的学习引擎完成一轮又一轮完整的前馈计算流程直至达到预期精度指标为止。 ```python import os from torch.utils.data import Dataset from PIL import Image class UNetDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir self.transform = transform # 获取路径列表 self.image_paths = sorted([os.path.join(root_dir,'images',f) for f in os.listdir(os.path.join(root_dir,'images'))]) self.mask_paths = sorted([os.path.join(root_dir,'masks',f) for f in os.listdir(os.path.join(root_dir,'masks'))]) def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img_path = self.image_paths[idx] mask_path = self.mask_paths[idx] image = Image.open(img_path).convert('L') # 转为灰度模式 mask = Image.open(mask_path).convert('L') sample = {'image': image, 'mask': mask} if self.transform: sample = self.transform(sample) return sample['image'], sample['mask'] ``` 此部分实现了基本功能足以支撑起初步实验环境搭建工作,当然也可以在此基础上继续扩展诸如多模态融合等功能特性满足更加复杂的应用场景要求。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值