如何将图像转换为数据集以进行语义分割
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)
我正在尝试制作一个新的语义分割模型,它将颗粒状显微镜图像作为输入并对其进行分割。
我拥有 .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)