文章目录
图像的语义分割
图像的语义分割是计算机视觉中十分重要的领域。它是指像素级地识别图像,即标注出图像中每个像素所属的对象类别(如属于背景、边缘或身体等)。
图像语义分割的应用
- 自动驾驶汽车:我们需要为汽车增加必要的感知,以了解他们所处的环境,以便自动驾驶的汽车可以安全行驶;
- 医学图像诊断:机器可以增强放射医生进行的分析,大大减少了运行诊断测试所需的时间;
- 无人机着陆点判断等。
图像语义分割实质
语义分割的目标
一般是将一张RGB图像或是灰度图作为输入,输出的是分割图,其中每一个像素包含了其类别的标签(heightwidth1)。
图像语义分割的实现
FCN
目前在图像分割领域比较成功的算法,有很大一部分都来自于同一个先驱:Long等人提出的Fully Convolutional Network(FCN),或者叫全卷积网络。
FCN将分类网络转换成用于分割任务的网络结构,并证明了在分割问题上,可以实现端到端的网络训练。
FCN成为了深度学习解决分割问题的奠基石。
分类网络结构尽管表面上来看可以接受任意尺寸的图片作为输入,但是由于网络结构最后全连接层的存在,使其丢失了输入的空间信息,因此,这些网络并没有办法直接用于解决诸如分割等稠密估计问题。
考虑到这一点,FCN用卷积层和池化层替代了分类网络中的全连接层,从而使得网络结构可以适应像素级的稠密估计任务。
FCN网络结构图
语义分割的跳级(skips)结构
增加Skips结构将最后一层的预测(有更丰富的全局信息)和更浅层(有更多的局部细节)的预测结合起来,这样可以在遵守全局预测的同时进行局部预测。
FCN缺点
- 得到的结果不够精细,对细节不够敏感
- 没有考虑像素与像素之间的关系,缺乏空间一致性
FCN实例
对数据集的处理
def data_process():
"""
处理数据,创建训练数据集和测试数据集
:return: 训练数据集、测试数据集、STEPS_PER_EPOCH、VALIDATION_STEPS
"""
# 获取所有图片的存储地址
images = glob.glob("F:\\dataset\\图片定位与分割\\images\\*.jpg")
# 对图片地址按照图片名称进行排序
images.sort(key=lambda x: x.split('/')[-1])
# 获取所有图像分割后的图片
annotations = glob.glob("F:\\dataset\\图片定位与分割\\annotations\\trimaps\\*.png")
# 对分割图像按照名称排序
annotations.sort(key=lambda x: x.split('/')[-1])
# 生成长度与图片个数相同的随机序列
np.random.seed(2020)
index = np.random.permutation(len(images))
# 将图片和分割图像地址一起随机
images = np.array(images)[index]
annotations = np.array(annotations)[index]
# 创建dataset数据集
dataset = tf.data.Dataset.from_tensor_slices((images, annotations))