我正在研究”Mask R-CNN
用于对象检测和分割”。因此,我阅读了提出Mask R-CNN
用于对象检测的原始研究论文,并且还找到了几个Mask R-CNN
的实现,这里和这里(由Facebook AI研究团队称为detectron)。但他们都使用了coco数据集进行测试。
但是,我对使用自定义数据集(包含大量图像,每个图像都有一组掩码图像用于标记相应图像中的对象)训练上述实现感到有些困惑。
因此,如果有人能发布有用的资源或代码示例来完成这项任务,我将不胜感激。
注意:我的数据集具有以下结构,
它包含大量图像,每个图像都有单独的图像文件,用于在黑色图像中以白色补丁的形式突出显示对象。
这是一个示例图像及其掩码:
图像;
掩码;
回答:
我已经训练了https://github.com/matterport/Mask_RCNN的模型,用于在我自己的数据集上进行实例分割。
我的假设是你已经完成了所有基本设置,模型已经在默认数据集(在仓库中提供)上运行,现在你想让它在自定义数据集上运行。
以下是步骤
- 你需要准备好所有的注释。
- 所有这些都需要转换为VGG多边形模式(是的,我指的是多边形,即使你需要边界框)。我在回答的最后添加了一个VGG多边形格式的示例。
- 你需要将自定义数据集划分为训练、测试和验证集。
- 注释默认情况下会在个别数据集文件夹内的
via_region_data.json
文件中查找。例如,对于训练图像,它会在train\via_region_data.json
中查找。你也可以根据需要更改它。 - 在Samples文件夹中,你可以找到如Balloon、Nucleus、Shapes等文件夹。复制其中一个文件夹。最好是balloon。我们现在将尝试为我们的自定义数据集修改这个新文件夹。
- 在复制的文件夹中,你会有一个
.py
文件(对于balloon来说,它将是balloon.py),更改以下变量ROOT_DIR
:你克隆项目时的绝对路径DEFAULT_LOGS_DIR
:这个文件夹的大小会增加,所以根据需要更改这个路径(如果你在低磁盘存储的虚拟机上运行代码)。它还会存储.h5
文件。它会在日志文件夹内创建带有时间戳的子文件夹。.h5
文件每个epoch大约200 – 300 MB。但猜猜看,这个日志目录与Tensorboard兼容。你可以在运行tensorboard时将带时间戳的子文件夹作为--logdir
参数传递。
- 这个
.py
文件还包含两个类——一个类后缀为Config
,另一个类后缀为Dataset
。 - 在Config类中覆盖所需的内容,如
NAME
:你的项目的名称。NUM_CLASSES
:它应该比你的标签类多一个,因为背景也被视为一个标签DETECTION_MIN_CONFIDENCE
:默认值为0.9(如果你的训练图像质量不是很高或训练数据不多,可以降低它)STEPS_PER_EPOCH
等
- 在Dataset类中覆盖以下方法。所有这些函数都已经有很好的注释,因此你可以根据注释来覆盖以满足你的需求。
- load_(样本项目名称),例如load_balloon
- load_mask(答案最后有一个示例)
- image_reference
- 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}]