使用Mask R-CNN进行对象检测和分割 [针对自定义数据集进行训练]

我正在研究”Mask R-CNN用于对象检测和分割”。因此,我阅读了提出Mask R-CNN用于对象检测的原始研究论文,并且还找到了几个Mask R-CNN的实现,这里这里(由Facebook AI研究团队称为detectron)。但他们都使用了coco数据集进行测试。

但是,我对使用自定义数据集(包含大量图像,每个图像都有一组掩码图像用于标记相应图像中的对象)训练上述实现感到有些困惑。

因此,如果有人能发布有用的资源或代码示例来完成这项任务,我将不胜感激。

注意:我的数据集具有以下结构,

它包含大量图像,每个图像都有单独的图像文件,用于在黑色图像中以白色补丁的形式突出显示对象。

这是一个示例图像及其掩码:

图像;

enter image description here

掩码;

enter image description here enter image description here


回答:

我已经训练了https://github.com/matterport/Mask_RCNN的模型,用于在我自己的数据集上进行实例分割。

我的假设是你已经完成了所有基本设置,模型已经在默认数据集(在仓库中提供)上运行,现在你想让它在自定义数据集上运行。

以下是步骤

  1. 你需要准备好所有的注释。
  2. 所有这些都需要转换为VGG多边形模式(是的,我指的是多边形,即使你需要边界框)。我在回答的最后添加了一个VGG多边形格式的示例。
  3. 你需要将自定义数据集划分为训练、测试和验证集。
  4. 注释默认情况下会在个别数据集文件夹内的via_region_data.json文件中查找。例如,对于训练图像,它会在train\via_region_data.json中查找。你也可以根据需要更改它。
  5. 在Samples文件夹中,你可以找到如Balloon、Nucleus、Shapes等文件夹。复制其中一个文件夹。最好是balloon。我们现在将尝试为我们的自定义数据集修改这个新文件夹。
  6. 在复制的文件夹中,你会有一个.py文件(对于balloon来说,它将是balloon.py),更改以下变量
    • ROOT_DIR:你克隆项目时的绝对路径
    • DEFAULT_LOGS_DIR:这个文件夹的大小会增加,所以根据需要更改这个路径(如果你在低磁盘存储的虚拟机上运行代码)。它还会存储.h5文件。它会在日志文件夹内创建带有时间戳的子文件夹。
    • .h5文件每个epoch大约200 – 300 MB。但猜猜看,这个日志目录与Tensorboard兼容。你可以在运行tensorboard时将带时间戳的子文件夹作为--logdir参数传递。
  7. 这个.py文件还包含两个类——一个类后缀为Config,另一个类后缀为Dataset
  8. 在Config类中覆盖所需的内容,如
    • NAME:你的项目的名称。
    • NUM_CLASSES:它应该比你的标签类多一个,因为背景也被视为一个标签
    • DETECTION_MIN_CONFIDENCE:默认值为0.9(如果你的训练图像质量不是很高或训练数据不多,可以降低它)
    • STEPS_PER_EPOCH
  9. 在Dataset类中覆盖以下方法。所有这些函数都已经有很好的注释,因此你可以根据注释来覆盖以满足你的需求。
    • load_(样本项目名称),例如load_balloon
    • load_mask(答案最后有一个示例)
    • image_reference
  10. train函数(在Dataset类之外):如果你需要更改epoch数量或学习率等

你现在可以直接从终端运行它

python samples\你的文件夹名称\你的Python文件名称.py train --dataset="自定义数据集的位置" --weights=coco

有关上述命令行参数的完整信息,你可以在.py文件顶部的注释中查看。

这些是我能回忆起来的内容,我会随着回忆增加更多的步骤。也许你可以告诉我你是否在某个特定步骤上卡住了,我会详细说明那个特定步骤。

VGG多边形模式

宽度和高度是可选的

[{    "filename": "000dfce9-f14c-4a25-89b6-226316f557f3.jpeg",    "regions": {        "0": {            "region_attributes": {                "object_name": "Cat"            },            "shape_attributes": {                "all_points_x": [75.30864197530865, 80.0925925925926, 80.0925925925926, 75.30864197530865],                "all_points_y": [11.672189112257607, 11.672189112257607, 17.72093488703078, 17.72093488703078],                "name": "polygon"            }        },        "1": {            "region_attributes": {                "object_name": "Cat"            },            "shape_attributes": {                "all_points_x": [80.40123456790124, 84.64506172839506, 84.64506172839506, 80.40123456790124],                "all_points_y": [8.114103362391036, 8.114103362391036, 12.205901974737595, 12.205901974737595],                "name": "polygon"            }        }    },    "width": 504,    "height": 495}]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注