利用VGG16搭建全卷积神经网络(FCN)实现语义分割
1.简介
1.1 FCN的介绍
FCN,全卷积神经网络,用于实现语义分割,是深度学习从此可以很好解决语义分割的开山之作,作者认为我们在使用卷积层提取特征后,连接到全连接层后,由于全连接层的层数是我们人为设定的,在这之中其实我们抛弃了图片的空间信息,这对语义分割会造成影响,所以作者提出抛弃全连接层,在网络中只使用卷积层,所以网络称为全卷积神经网络。该网络的结构如下:

可以看到我们该网络有利用前面的卷积提取的部分,将最后卷积提取的部分,上采样放大后,然后与之前卷积提取的部分相加(因为作者认为我们到最后得到的是全局的特征,而我们在前面获得的是局部特征,所以我们的融合可以将全局特征与局部特征融合在一起,加大了我们对于结果预测的准确率)。
重复几次最终恢复到原图大小,并且通道数为21(这里的21指的是物体的类别,对于每一个像素我们都要推测他是什么种类,所以通道数为种类数),这就是FCN的网络架构。
1.2语义分割任务是什么
语义分割是相较于图像识别更为复杂的任务,他的分类是在像素级别上的,对于每个像素我们都要区别他们的种类,如本例中,我们要区别的是一张动物图片的背景,边缘,身体,三类(每行依次为真实图片,预测结果,真值)

2.数据准备以及预处理
在本例中我们采用的是牛津大学提供的开源数据集Oxford-IIIT-PetDataset,它提供了许多不同种类动物的图片结构如下:

并且对所有图片都提供了他的掩码,在文件夹trimap下的png文件就是他提供的掩码

我们可以读取一张图片并展示一下
import random
random.shuffle(all_img_label)
def load_label(path):
label=tf.io.read_file(path)
label=tf.image.decode_png(label)
label=tf.squeeze(label)
return label
img_label=load_label(all_img_label[0])
plt.imshow(img_label.numpy())#这样我们就可以看到标签的实际样子
img_label.shape

那么在这里,我们就知道了对于给定的图片,的标签如下,那么我们再查看一下他有多少种类
np.unique(img_label.numpy())#这样我们就可以看到这张图上有多少种
#可以看到这张图像上有三类分别是背景身体边缘
array([1, 2, 3], dtype=uint8)
那么,这里我们就确定了我们的问题,我们的输入是一张三通道彩色图片,标签是一张单通道的图片,那么我们这边就直接省略读取数据的部分直接
all_img_path=glob.glob('Image Location all_img_label=glob.glob('Image Location Dataset\\annotations\\trimaps/*.png')Dataset\\images\\*.jpg')
all_img_path.sort()
all_img_label.sort()
dataset=tf.data.Dataset.from_tensor_slices((all_img_path,all_img_label))
def read_jpg(path):
img=tf.io.read_file(path)
img=tf.image.decode_jpeg(img,channels=3)
return img
def read_png(path):
label=tf.io

1134

被折叠的 条评论
为什么被折叠?



