如何遮盖图像中的分割区域?

时间:2020-04-16 16:52:05

标签: unity3d-unet semantic-segmentation white-labelling

我想创建一个语义分割模型,该模型可以使用U-net分割USG中的卵泡。我已经使用Labelme标记了我的训练数据。标记区域的颜色是#800000。如何以黑白形式遮罩此图像。我已将颜色替换为#ffffff。但是在训练模型时会出现错误:0img.png违反范围[0,1]。找到最大像素值255。请帮助我解决此问题。图片如下。预先感谢。

USG Scan

Segmented Image

2 个答案:

答案 0 :(得分:1)

聚会可能有点晚了,但我发现最好编写一个单独的代码来使用 OpenCV 生成掩码。

    import json
    import cv2
    import os
    import numpy as np
    from glob import glob
    
    
    output_dir = "masks/"
    #creating the ground_truth folder if it doesn't exist
    os.makedirs(output_dir, exist_ok=True)
    
    json_files = glob("dataset/*.json")
    #loading the json file
    for image_json in json_files:
        with open(image_json) as file:
            data = json.load(file)
        filename = data["imagePath"].split(".")[0]
        
        # creating a new ground truth image
        mask = np.zeros((data["imageHeight"], data["imageWidth"]), dtype='uint8')
        for shape in data['shapes']:
            mask = cv2.fillPoly(mask, [np.array(shape['points'], dtype=np.int32)], 255)
    
        # saving the ground truth masks
        cv2.imwrite(os.path.join(output_dir,filename) + ".png", mask)

此代码回答您的问题“如何生成黑白蒙版?”。但另一件事,即“最大值为 255”,可能是因为您在训练之前没有对图像数组进行标准化。我之前在做一个分割项目,我在使用 LabelMe 后使用了这段代码,虽然在读取图像时我通过将其除以 255 对其进行了标准化。

答案 1 :(得分:-1)

我可以知道您使用什么语言和框架吗?但是,在使用Python的情况下,不失一般性,因为您使用Labelme标记了数据,从而保存了多边形注释的顶点,所以可以使用OpenCV的API cv2.fillPoly()函数填充零矩阵(将大小保存为输入图像) )和指定的颜色。此步骤使遮罩可视化。

此后,需要在颜色和标签之间进行手动映射。标签通常存储在1通道矩阵中(不是作为具有3或4通道的彩色图像),其他形状与输入图像相同。如果只有两个类,则可以将零值标记为背景(例如0),将其他颜色标记为1,然后将其保存在矩阵文件中以备将来使用。因此,彩色图像只是您在视觉上看到的图像,而不是用于训练的图像。模型需要的只是一些简单且不同的数字。例如,如今,人们使用“ logit”输出每个类别的像素概率,然后选择概率的argmax(),该概率返回每个像素的标签。

因此,也许尝试制作一个元素值为[0,num_of_classes-1]的矩阵将有助于解决问题。