赞
踩
这里给出比赛地址:比赛地址
本章将对语义分割赛题进行赛题背景讲解,对赛题数据读取进行说明,并给出解题思路。
遥感技术已成为获取地表覆盖信息最为行之有效的手段,遥感技术已经成功应用于地表覆盖检测、植被面积检测和建筑物检测任务。本赛题使用航拍数据,需要参赛选手完成地表建筑物识别,将地表航拍图像素划分为有建筑物和无建筑物两类。
如下图,左边为原始航拍图,右边为对应的建筑物标注。
赛题数据来源(Inria Aerial Image Labeling),并进行拆分处理。数据集报名后可见并可下载。赛题数据为航拍图,需要参赛选手识别图片中的地表建筑具体像素位置。
赛题为语义分割任务,因此具体的标签为图像像素类别。在赛题数据中像素属于2类(无建筑物和有建筑物),因此标签为有建筑物的像素。赛题原始图片为jpg格式,标签为RLE编码的字符串。
RLE全称(run-length encoding),翻译为游程编码或行程长度编码,对连续的黑、白像素数以不同的码字进行编码。RLE是一种简单的非破坏性资料压缩法,经常用在在语义分割比赛中对标签进行编码。
RLE与图片之间的转换如下:
import numpy as np import pandas as pd import cv2 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) 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')
im = mask pixels = im.flatten(order = 'F') print(pixels,len(pixels)) pixels = np.concatenate([[0], pixels, [0]]) print(pixels,len(pixels)) runs = np.where(pixels[1:] != pixels[:-1])[0] + 1 print(pixels[1:].shape) print(pixels[:-1].shape) print(runs,len(runs)) ##这里其实就相当于是前后错位了一个数, #然后就会找到左右不同的像素点即边界,从而将所有的感兴趣点都提取出来 #print(runs[::2]) #每一段的start位置 #print(runs[1::2]) #每一段的end位置 runs[1::2] -= runs[::2] #end-start即将end变成了length # print(runs[1::2]) #得到每一段的长度 res = ' '.join(str(x) for x in runs) # [str(x) for x in runs]
知乎链接
赛题使用Dice coefficient来衡量选手结果与真实标签的差异性,Dice coefficient可以按像素差异性来比较结果的差异性。Dice coefficient的具体计算方式如下:
2 ∗ ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ \frac{2 * |X \cap Y|}{|X| + |Y|} ∣X∣+∣Y∣2∗∣X∩Y∣
其中
X
X
X是预测结果,
Y
Y
Y为真实标签的结果。当
X
X
X与
Y
Y
Y完全相同时Dice coefficient为1,排行榜使用所有测试集图片的平均Dice coefficient来衡量,分数值越大越好。
FileName | Size | 含义 |
---|---|---|
test_a.zip | 314.49MB | 测试集A榜图片 |
test_a_samplesubmit.csv | 46.39KB | 测试集A榜提交样例 |
train.zip | 3.68GB | 训练集图片 |
train_mask.csv.zip | 97.52MB | 训练集图片标注 |
具体数据读取案例:
import pandas as pd
import cv2
train_mask = pd.read_csv('train_mask.csv', sep='\t', names=['name', 'mask'])
# 读取第一张图,并将对于的rle解码为mask矩阵
img = cv2.imread('train/'+ train_mask['name'].iloc[0])
mask = rle_decode(train_mask['mask'].iloc[0])
print(rle_encode(mask) == train_mask['mask'].iloc[0])
# 结果为True
由于本次赛题是一个典型的语义分割任务,因此可以直接使用语义分割的模型来完成:
本章主要对赛题背景和主要任务进行讲解,并多对赛题数据和标注读取方式进行介绍,最后列举了赛题解题思路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。