天池语义分割task01

天池建筑语义分割task01

#由于缺少cv2,通过此方式安装
!pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install albumentations
import numpy as np
import pandas as pd
import cv2
import matplotlib.pyplot as plt

rle编码:

RLE编码又叫行程编码,是最简单、最古老的数据压缩技术之一,它的原理是通过检测统计数据流中重复的位或字符序列,并用它们出现的次数和每次出现的个数形成新的代码。从而达到数据压缩的目的。
假设一个图像的像素色彩值是这样排列的:红红红红红红红红红红红红蓝蓝蓝蓝蓝蓝绿绿绿绿,经过RLE压缩后就成为了:红12蓝6绿4。这样既保证了压缩的可行性,而且不会有损失。
#图片的rel编码解码
def rle_encode(im):
    pixels = im.flatten(order = 'f')#将array平铺,'F'指的是按照列进行,”c“指的是按照行,由于数据给的是按列展开的mask,故后续用列
    pixels = np.concatenate([[0], pixels, [0]])#向两端补0,为了后续的’错位比较‘,有默认参数axi=0
    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1#错位比较得出不祥的的位置,也即像素发生变化的位置
    runs[1::2] -= runs[::2]#连续像素点的长度
    return ' '.join(str(x) for x in runs)#用空格隔开
    
def rle_decode(mask_rle, shape=(512, 512)):
    s = mask_rle.split()#按空格切开mask
    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')#得到图片矩阵

课后作业

  1. 理解 RLE 编码过程,并完成赛题数据读取并可视化;
  2. 统计所有图片整图中没有任何建筑物像素占所有训练集图片的比例;
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)
0.17346666666666666
  1. 统计所有图片中建筑物像素占所有相似度的比例;
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]!="":
        sum=0
        ls = list(map(int,train_mask["mask"].iloc[i].split(" ")))
        for m in ls[1::2]:
            sum+=m
        pic_path = "train/"+train_mask["name"].iloc[i]
        img = np.array(Image.open(pic_path))
        ratio = sum/(img.shape[0]*img.shape[1])
    else:
        ratio = 0

    ratio_ls.append(ratio)
pd.Series(ratio_ls).to_csv("ratio_ls")
100%|████████████████████████████████████████████████████████████████████████████| 30000/30000 [09:31<00:00, 52.46it/s]
ratio = pd.read_csv("ratio_ls")
print("所有图片中建筑像素平均占比:",np.mean(ratio.iloc[:,1]))
ratio_ = ratio.iloc[:,1][(ratio.iloc[:,1])!=0]
print("有建筑图片中建筑像素平均占比:",np.mean(ratio_))
ratio = np.array(ratio)[:,1]
print("建筑像素占比最大值",np.max(ratio))
print("有建筑图片中,建筑像素占比最小值",np.min(ratio_))
所有图片中建筑像素平均占比: 0.15706762636004695
有建筑图片中建筑像素平均占比: 0.19003314068058272
建筑像素占比最大值 0.9992218017578124
有建筑图片中,建筑像素占比最小值 3.814697265625e-06
  1. 统计所有图片中建筑物区域平均区域大小;
np.mean(ratio_)*512*512
49816.047630570676
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值