如何将图像转换为数据集以进行语义分割

How to convert images into a dataset for semantic segmentation

我正在尝试制作一个新的语义分割模型,它将颗粒状显微镜图像作为输入并对其进行分割。

我拥有 .png 格式的所有输入和地面实况图像,但我很难将它们整理成其他人可以使用的数据集。我查看了一些文章,但它们解释了如何制作我已有的标签图像。那么,是否有 way/software 可用于管理数据集?

谢谢

您可以按照类似于 VOC challenge 中的组织方式来组织图像。

也就是说,您应该具有以下目录树:

my_dataset
   |
   +---  InputImages
   |           |
   |           +---   000.png
   |           +---   001.png
   |           +---   002.png
   |           ...
   |
   +---  SegmentationMasks
   |           |
   |           +---   000.png
   |           +---   001.png
   |           +---   002.png
   |           ...
   |  
   +---  ImageSets 
               |
               +---   train.txt
               +---   val.txt
               +---   test.txt

也就是说,您将所有输入图像存储在 InputImages 文件夹下,并将您拥有的所有分割掩码存储在 SegmentationMasks 文件夹下。确保遮罩 SegmentationMasks/000.png 对应于 InputImages/000.png(所有图像和遮罩均依此类推)。

此外,您可以将数据集固定拆分为“训练”、“验证”和“测试”集。此拆分存储在 ImageSets:
下的测试文件中 文件 train.txt 列出了属于训练集的图像 ID,val.txt 列出了验证集的 ID,依此类推。
确保所有 id 都包含在拆分中,并且没有图像出现在两个拆分中。
(即“train.txt”+“val.txt”+“test.txt”=所有id的并集,交集为空)

您还可以使用开源工具,FiftyOne, to curate the dataset in a way that allows you to share it and also easily visualize, explore, and analyze 它将与任何未来的模型预测一起使用。

FiftyOne has a Python API that will load your instance or semantic segmentation labels into a FiftyOne Dataset 然后您可以在应用程序中查询和可视化(原始图像和注释)。

如果您以这种文件结构将图像和分段存储在磁盘上:

segmentation_dataset
   |
   |
   +--- data
   |      |
   |      +--- 000.png
   |      +--- 001.png
   |      +--- 000.png
   |      ...
   |
   +--- labels
          |
          +--- 000.png
          +--- 001.png
          +--- 000.png
          ...   

然后您可以将其加载到 Python 并使用以下代码行将其可视化:

import fiftyone as fo

dataset = fo.Dataset.from_dir(
    "segmentation_dataset",
    dataset_type=fo.types.ImageSegmentationDirectory,
    name="segmentation_dataset",
    force_grayscale=True,
)

# Visualize the dataset in your browser
session = fo.launch_app(dataset)

注意:使用 force_grayscale 参数加载 RGB 掩码,就像您提供的那样。

共享数据集

您可以使用 FiftyOne API 然后 export it to disk 以各种格式(VOC、COCO、YOLO、CVAT 等)在数据集上添加和修改样本和标签。从那里您可以将其压缩并让其他人轻松将其加载回 FiftyOne。

例如,我们可以使用 FiftyOneDataset format,因为它适用于任何标签类型:

dataset.export(
    export_dir="/path/to/export_dir",
    dataset_type=fo.types.FiftyOneDataset
)

压缩数据集并将其发送给其他人,他们现在可以 运行:

import fiftyone as fo

dataset = fo.Dataset.from_dir(
    dataset_dir="/path/to/unzipped_dataset",
    dataset_type=fo.types.FiftyOneDataset,
)

分裂

如果您将数据拆分存储在如下所示的文件夹结构中:

segmentation_dataset
   |
   |
   +--- Train
   |      |
   |      +--- data
   |      |      |
   |      |      +--- 000.png
   |      |      +--- 001.png
   |      |      +--- 000.png
   |      |      ...
   |      |
   |      +--- labels
   |             |
   |             +--- 000.png
   |             +--- 001.png
   |             +--- 000.png
   |             ...   
   +--- Test
   |      |
   |      ...
   ...

然后您可以将所有样本加载到一个数据集中,并为每个样本添加一个 tag,表示它属于哪个拆分。

import fiftyone as fo

dataset_type = fo.types.ImageSegmentationDirectory

dataset = fo.Dataset.from_dir(
    dataset_dir="segmentation_dataset/Train",
    dataset_type=dataset_type,
    tags="train",
    name="segmentation_dataset",
)

dataset.add_dir(
    dataset_dir="segmentation_dataset/Test",
    dataset_type=dataset_type,
    tags="test",
)

训练模型

从那里,您可以直接使用此数据集来训练模型(例如 PyTorch or PyTorch Lightning Flash