DeepLabV3+
deeplab v3+ 算是目前来说最先进的语义分割算法,尽管现在有精确到头发丝的分割方法:Soft Semantic Segmentation. 但谷歌开源了deeplabv3+,我们可以直接使用不同的backbone和数据集来训练我们自己的分割模型。如果你想做一个分割的应用,那这个方法再合适不过。
在开始之前,让我们看看我们能做到的分割效果:
当然出来cityspcapes数据集之外你也可以放许多其他的数据集。包括我自己的车道线数据集,分割效果也还不错,连左右车道线都能分割出来。接下来就教大家如何制作数据集吧。
数据集制作
首先这个数据集制作有个巨大的问题。假设你用labelme或者其他工具标注了你的数据,你的保存标注可能是polygon的点,也可能是mask。这里我推荐保存polygon,因为deeplab中使用的label是单通道以你的类别的id为像素值的标签,这也非常好理解。这里贴一个核心代码:
1import cv2
2import os
3import numpy as np
4import cv2
5import matplotlib.pyplot as plt
6
7cls_label_map = {
8 'background': 0,
9 'a': 1,
10 's': 2,
11 'f': 3,
12 'd': 4,
13 'j': 5,
14 'k': 6,
15 'l': 7,
16 'g': 8,
17 'p': 9,
18 'q': 10,
19 'o': 11,
20 'w': 12,
21 'h': 13,
22 '3': 14,
23}
24
25
26def gen_mask(polygons, img):
27 mask = np.zeros([img.shape[0], img.shape[1]], np.int32)
28 for p in polygons:
29 # cv2.polylines(img, p, 1, 255)
30 # fill polygon
31 pts = np.array(p[:-1])
32 cv2.fillPoly(mask, pts, cls_label_map[p[-1]])
33 return mask
这样返回就是label的mask。这个mask实际上是黑色的。咋一看like this:
仔细看是可以隐约看到车道线的。并且其实这里的车道先不止一种类别。
关于label
关于label有几点需要注意的,像素值就是label的index,从我的map也能看的出来。
除此之外没了。另外,如果你的类别里面没有ignore_label, 那就直接是idx和0,0就是背景。如果有ignore_l