欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

语义分割标注

程序员文章站 2024-03-20 10:38:24
...

1,先用pixleAnnotationTool标注

https://github.com/abreheret/PixelAnnotationTool/releases下载该工具

语义分割标注

解压后打开:

PixelAnnotationTool.exe

 

将下面的保存为1.json。这是我们的配置文件,定义了每个类别的label名称,显示颜色,id等。

{
    "labels": {
        "Build": {
            "categorie": "Build",
            "color": [
                0,
				0,
				255
            ],
            "id": 1,
            "id_categorie": 1,
            "name": "Build"
        },
        "Tree": {
            "categorie": "Tree",
            "color": [
                0,
                255,
                0
            ],
            "id": 2,
            "id_categorie": 2,
            "name": "Tree"
        },
        "grass": {
            "categorie": "grass",
            "color": [
                0,
                255,
                255
            ],
            "id": 3,
            "id_categorie": 3,
            "name": "grass"
        },
        "Soil": {
            "categorie": "Soil",
            "color": [
                255,
                0,
                0
            ],
            "id": 4,
            "id_categorie": 4,
            "name": "Soil"
        },    
        "Road": {
            "categorie": "Road",
            "color": [
                255,
                255,
                0
            ],
            "id": 5,
            "id_categorie": 5,
            "name": "Road"
        }        
    }
}

 

导入上文的1.json文件并导入图片所在的文件夹

语义分割标注

然后,开始标注,标注是交互式标注,自己可以根据标注结果继续调整

语义分割标注

执行一次分水岭之后的结果,可以继续调整

语义分割标注

大概调整好了以后,保存数据

语义分割标注,。语义分割标注

生成的3个文件分别为xxx_color_mask.png(通过红绿蓝显示的label),xxx_mask.png(自己标注的label),xx_watershed_mask.png(通过分水岭算法生成的label).注意,这些图片有白边,需要处理白边后使用。

 

这个工具标注时很难完全精细,所以需要进一步微调,。微调工具:js-segment-anotator-master。该工具测试只能在Linux系统下正常使用,而且上文通过PixelAnnotation得到的图片无法直接使用js-segmenta-anotator-master标注,需要做一次转换。

https://github.com/kyamagu/js-segment-annotator,下载并解压

 

 

首先,用python处理xx_watershed_mask.png.

import numpy as np
from PIL import Image
annotation = np.array(Image.open('./cr1_watershed_mask.png'))#根据自己的实际路径更改路径名


temp = annotation[:,:,0]
temp[0]=temp[1]
temp[-1] = temp[-2]
temp[:,0]=temp[:,1]
temp[:,-1] = temp[:,-2]

Image.fromarray(np.stack([
    np.bitwise_and(temp, 255),
    np.bitwise_and(temp >> 8, 255),
    np.bitwise_and(temp >> 16, 255),
    ], axis=2).astype(np.uint8)).save('encoded.png')

 

将tiff格式文件改为jpg文件。

用常用的图片打开工具,另存为jpg即可。

现在得到两个文件xxx.jpg(原图转为jpg图像),xxx.png(原图的标签转为js-segment-anotator-master可以识别的图片).将文件拷贝到js-segmentation-annotator-master工具指定的文件夹中。

语义分割标注

然后修改example.json

语义分割标注

语义分割标注

然后打开index.html,即可使用多边形或者涂抹的方式标注数据

语义分割标注

语义分割标注

标注完成后,点击export保存。保存后的图片,需要用python将图片转化为label标签。

import numpy as np
from PIL import Image

# Decode
encoded = np.array(Image.open('./encoded2.png'))
annotation = np.bitwise_or(np.bitwise_or(
    encoded[:, :, 0].astype(np.uint32),
    encoded[:, :, 1].astype(np.uint32) << 8),
    encoded[:, :, 2].astype(np.uint32) << 16)
Image.fromarray(annotation).save('encoded3.png')

print(np.unique(annotation))

至此,数据标注完成,输出像素级的标签图像。

 

更加精细化的标注需要用photoshop进行像素级的涂抹。

参考:https://blog.csdn.net/qq_32425195/article/details/102469980

 

photoshop涂抹后的数据需要与当前数据合并,假设photoshop导出的数据为1.tif,将1.tif先转为二值图,然后在原来的标签图像中,在1.tif中值为1的地方,替换为想要的标签值。

from PIL import Image
import numpy as np

a = Image.open('1.tif')
#需要查看图片读取是否正确
Image.fromarray(np.array(a)).save('2.tif')

#先把彩色图像转为灰度图
Lim = a.convert('L')

#将灰度图转为二值图
threshold = 80
table=[]
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)

bim = Lim.point(table,'1')#生成二值图像并保存
bim.save('BinaGrass.png')

#导入两张要合并的图像,BinaGrass.png是二值图像,表示值为1的地方为草。encoded3.png是人工标注的label图
a = Image.open("BinaGrass.png")
a = np.array(a)
b= Image.open("encoded3.png")
b = np.array(b)

#将图像合并并保存
for i in range(np.shape(b)[0]):
    for j in range(np.shape(b)[1]):
        c[i,j]=b[i,j] if a[i,j]==True else 3    #3是grass的类别
Image.fromarray(c).save('encode4.png')