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

Posted

技术标签:

【中文标题】如何将图像转换为数据集以进行语义分割【英文标题】:How to convert images into a dataset for semantic segmentation 【发布时间】:2021-05-01 04:01:09 【问题描述】:

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

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

谢谢

【问题讨论】:

【参考方案1】:

您可以按照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,交集为空)。

【讨论】:

【参考方案2】:

您还可以使用开源工具FiftyOne 来管理数据集,让您可以轻松地使用share it 和visualize、explore 和analyze 以及任何未来模型预测。

FiftyOne 有一个 Python API,可以将您的 instance 或 semantic segmentation labels 加载到 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 或 PyTorch Lightning Flash)

【讨论】:

以上是关于如何将图像转换为数据集以进行语义分割的主要内容,如果未能解决你的问题,请参考以下文章

《基于深度学习的图像语义分割方法综述》阅读理解

到底什么是语义分割?

DeepLabv3+图像语义分割实战:训练自己的数据集

语义分割与数据集

无法读取 Sagemaker 语义分割模型批量转换输出文件

语义分割中的上采样