如何将图像转换为数据集以进行语义分割
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)
【讨论】:
以上是关于如何将图像转换为数据集以进行语义分割的主要内容,如果未能解决你的问题,请参考以下文章