我正在研究“ Mask R-CNN用于对象检测和分割”。因此,我阅读了提出用于对象检测的Mask R-CNN的原始研究论文,并且发现Mask R-CNNherehere的实现很少(由Facebook AI研究团队称为detectron)。但是他们都使用可可数据集进行测试。

但是,对于使用自定义数据集进行以上实现的培训,我颇为困惑,因为自定义数据集包含大量图像,并且对于每个图像,都有一个遮罩图像子集,用于标记相应图像中的对象。

因此,很高兴有人可以为此任务发布有用的资源或代码示例。

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


  它包含大量图像,对于每个图像,
  是单独的图像文件,将对象突出显示为白色补丁
  黑色图像。


这是一个示例图像,它是蒙版:

图片;

python -  mask R-CNN以进行对象检测和分割[自定义数据集训练]-LMLPHP

口罩;

python -  mask R-CNN以进行对象检测和分割[自定义数据集训练]-LMLPHP python -  mask R-CNN以进行对象检测和分割[自定义数据集训练]-LMLPHP

最佳答案

我已经训练了https://github.com/matterport/Mask_RCNN的模型实例化模型,可以在我的数据集上运行。

我的假设是,您已完成所有基本设置,并且该模型已经使用默认数据集(在存储库中提供)运行,现在您希望它针对自定义数据集运行。

以下是步骤


您需要拥有所有注释。
所有这些都需要转换为VGG多边形模式(是的,即使您需要装箱,我的意思是多边形)。我在此答案的末尾添加了示例VGG多边形格式。
您需要将自定义数据集分为训练,测试和验证
默认情况下,在单个数据集文件夹内使用文件名via_region_data.json查找注释。例如,对于训练图像,请查看train\via_region_data.json。您也可以根据需要进行更改。
在“样本”文件夹中,您可以找到气球,核,形状等文件夹。复制其中一个文件夹。最好是气球。现在,我们将尝试为自定义数据集修改此新文件夹。
在复制的文件夹中,您将有一个.py文件(对于Balloon,它将是Balloon.py),更改以下变量


ROOT_DIR:克隆项目的绝对路径
DEFAULT_LOGS_DIR:此文件夹的大小将变大,因此请相应地更改此路径(如果在低磁盘存储VM中运行代码)。它还将存储.h5文件。它将在带有时间戳的日志文件夹内创建子文件夹。
每个时期.h5文件大约为200-300 MB。但是,请猜测此日志目录与Tensorboard兼容。您可以在运行tensorboard时将带有时间戳的子文件夹作为--logdir参数传递。

.py文件还具有两个类-一个后缀为Config的类,另一个后缀为Dataset的类。
在Config类中,覆盖所需的内容,例如


NAME:您的项目的名称。
NUM_CLASSES:它应该比标签类多一个,因为背景也被视为一个标签
DETECTION_MIN_CONFIDENCE:默认为0.9(如果您的训练图像质量不是很高或没有太多的训练数据,请降低此值)
STEPS_PER_EPOCH

在数据集类中,重写以下方法。所有这些功能已经被很好地注释,因此您可以根据需要按照注释进行覆盖。


例如load_balloon的load_(name_of_the_sample_project)
load_mask(请参阅答案的最后一个示例)
image_reference

训练函数(在数据集类之外):如果必须更改时期数或学习率等


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

python samples\your_folder_name\your_python_file_name.py train --dataset="location_of_custom_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
}]


样本load_mask函数

def load_mask(self, image_id):
    """Generate instance masks for an image.
    Returns:
    masks: A bool array of shape [height, width, instance count] with
        one mask per instance.
    class_ids: a 1D array of class IDs of the instance masks.
    """
    # If not your dataset image, delegate to parent class.
    image_info = self.image_info[image_id]
    if image_info["source"] != "name_of_your_project":   //change your project name
        return super(self.__class__, self).load_mask(image_id)

    # Convert polygons to a bitmap mask of shape
    # [height, width, instance_count]
    info = self.image_info[image_id]
    mask = np.zeros([info["height"], info["width"], len(info["polygons"])], dtype=np.uint8)
    class_id =  np.zeros([mask.shape[-1]], dtype=np.int32)

    for i, p in enumerate(info["polygons"]):
        # Get indexes of pixels inside the polygon and set them to 1
        rr, cc = skimage.draw.polygon(p['all_points_y'], p['all_points_x'])
        # print(rr.shape, cc.shape, i, np.ones([mask.shape[-1]], dtype=np.int32).shape, info['classes'][i])

        class_id[i] = self.class_dict[info['classes'][i]]
        mask[rr, cc, i] = 1


    # Return mask, and array of class IDs of each instance. Since we have
    # one class ID only, we return an array of 1s
    return mask.astype(np.bool), class_id

关于python - mask R-CNN以进行对象检测和分割[自定义数据集训练],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49684468/

10-12 21:17
查看更多