1、赛题理解
零基础入门语义分割-地表建筑物识别,是DataWhale与天池联合发起的入门比赛,以计算机视觉为背景,希望通过过此次比赛了解语义分割的相关知识。
1.1Task1学习内容
- 理解赛题背景和数据。
- 掌握RLE编码。
- 解体思路。
2、赛题介绍
2.1 题目介绍
遥感技术已成为获取地表覆盖信息最为行之有效的手段,遥感技术已经成功应用于地表覆盖检测、植被面积检测和建筑物检测任务。本赛题使用航拍数据,需要参赛选手完成地表建筑物识别,将地表航拍图像素划分为有建筑物和无建筑物两类。
如下图,左边为原始航拍图,右边为对应的建筑物标注。
2.2 数据介绍
- train_mask.csv:存储图片的标注的rle编码;
- train和test文件夹:存储训练集和测试集图片;
3、RLE编码
RLE全称(run-length encoding),翻译为游程编码或行程长度编码,对连续的黑、白像素数以不同的码字进行编码。RLE是一种简单的无损压缩,经常用在在语义分割比赛中对标签进行编码。
比如说:
aaaaabbbbbbbbbbbbcccc
经过压缩之后变成了
5a12b4c
abcde
经过压缩之后变成了
1a1b1c1d1e
上边的例子压缩之后变短了,但是下边的压缩之后却变长了。
左边为未压缩,右边为压缩之后。(按行统计的。)
当大量相同的像素点聚集时,压缩效率比较高。相反,比较分散时,压缩效率较差。
# 将图片编码为rle格式
def rle_encode(im):
'''
im: numpy array, 1 - mask, 0 - background
Returns run length as string formated
'''
pixels = im.flatten(order = 'F') # F 为根据列flatten
pixels = np.concatenate([[0], pixels, [0]]) # 前后各加上1各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')
4、解体思路
采用语义分割模型来解决问题。
- 1. 使用FCN模型跑通训练过程,并对结果进行预测提交。
- 2. 在此基础上加入数据增强方法。
- 3. 使用更强大的模型(UNet等)。
- 4. 模型集成。