零基础入门语义分割-地表建筑物识别 Task1:赛题理解与baseline

零基础入门语义分割-地表建筑物识别 Task1:赛题理解与baseline

1. RLE编码过程

1.1 什么是 RLE 编码

RLE 编码是微软开发一种无损的压缩算法,基于“使用变动长度的码来取代连续重复出现的原始资料”来实现压缩。

举例来说,一组资料串"AAAABBBCCDEEEE",由4个A、3个B、2个C、1个D、4个E组成,经过 变动长度编码法 可将资料压缩为4A3B2C1D4E(由14个单位转成10个单位)。

简言之,其优点在于将重复性高的资料量压缩成小单位;然而,其缺点在于─若该资料出现频率不高,可能导致压缩结果资料量比原始资料大,例如:原始资料"ABCDE",压缩结果为"1A1B1C1D1E"(由5个单位转成10个单位)。

1.2 如何将 RLE 编码读取图像
import numpy as np
import pandas as pd
import cv2

# 将图片编码为rle格式
def rle_encode(im):
    '''
    im: numpy array, 1 - mask, 0 - background
    Returns run length as string formated
    '''
    pixels = im.flatten(order = 'F')
    pixels = np.concatenate([[0], pixels, [0]])
    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1
    runs[1::2] -= runs[::2]
    return ' '.join(str(x) for x in runs)

# 将rle格式进行解码为图片
def rle_decode(mask_rle, shape=(512, 512)):
    '''
    mask_rle: run-length as string formated (start length)
    shape: (height,width) of array to return 
    Returns numpy array, 1 - mask, 0 - background

    '''
    s = mask_rle.split()
    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]
    starts -= 1
    ends = starts + lengths
    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)
    for lo, hi in zip(starts, ends):
        img[lo:hi] = 1
    return img.reshape(shape, order='F')

2. 统计所有图片整图中没有任何建筑物像素占所有训练集图片的比例

2.1 代码展示
import pandas as pd

train_mask = pd.read_csv("./train_mask.csv",sep="\t",names=["name","mask"])
train_mask["mask"]=train_mask["mask"].fillna("")
l = len(train_mask)
sum=0
for i in range(l):
    if train_mask["mask"].iloc[i]=="":
        sum+=1
print(sum/l)
2.2 运行结果
0.17346666666666666

3. 统计所有图片中建筑物像素占所有像素的比例

3.1 代码展示
import pandas as pd
import numpy as np
from PIL import Image
from tqdm import tqdm


train_mask = pd.read_csv("./train_mask.csv",sep="\t",names=["name","mask"])
train_mask["mask"]=train_mask["mask"].fillna("")
l = len(train_mask)

ratio_ls = []
for i in tqdm(range(l)):
    if train_mask["mask"].iloc[i]!="":
        ls = list(map(int,train_mask["mask"].iloc[i].split(" ")))
        number = sum(ls[1::2])
        pic_path = "数据集/"+"train/"+train_mask["name"].iloc[i]
        img = np.array(Image.open(pic_path))
        ratio = number/(img.shape[0]*img.shape[1])
    else:
        ratio = 0

    ratio_ls.append(ratio)
pd.Series(ratio_ls).to_csv("ratio_ls")
3.2 运行结果
所有图片中建筑像素平均占比: 0.15708140207926433
有建筑图片中建筑像素平均占比: 0.19004847807621914
建筑像素占比最大值 0.9992218017578124
有建筑图片中,建筑像素占比最小值 3.814697265625e-06

4. 统计所有图片中建筑物区域平均区域大小

4.1 代码展示
import pandas as pd
import numpy as np
from PIL import Image
from tqdm import tqdm

train_mask = pd.read_csv("./train_mask.csv",sep="\t",names=["name","mask"])
train_mask["mask"]=train_mask["mask"].fillna("")
l = len(train_mask)

sum_ls = []
for i in tqdm(range(l)):
    if train_mask["mask"].iloc[i]!="":
        ls = list(map(int,train_mask["mask"].iloc[i].split(" ")))
        number = sum(ls[1::2])
        # pic_path = "数据集/"+"train/"+train_mask["name"].iloc[i]
        # img = np.array(Image.open(pic_path))
        # ratio = number/(img.shape[0]*img.shape[1])
    else:
        number = 0
    sum_ls.append(number)
pd.Series(sum_ls).to_csv("point_sum_ls")
4.2 运行结果
所有图中建筑物区域平均区域大小 41177.94706666667
含有建筑物的图中建筑物区域平均区域大小 49820.06823681239

此处评论已关闭