tensorflow2.3.0语义分割(一)
作者:互联网
对于语义分割的定义,我查阅了一些资料,基本上理解为:图像语义分割指机器自动分割并识别出图像中的内容,比如给出一个人骑摩托车的照片,机器判断后应当能够生成右侧图,红色标注为人,绿色是车(黑色表示背景)。与我们前面介绍的CNN图像识别等内容的不同之处在于,CNN图像识别判断整张图片属于哪个类别,而图像语义分割是像素级的,它判断图像中的每个像素属于哪个分类,而不是判断整张图片属于哪个分类。
一、The Oxford-IIIT Pet Dataset介绍
这部分采用的数据集是The Oxford-IIIT Pet Dataset,该数据集包含37类宠物图像,每类图像包含约200张图片,图像在比例,姿势和光线方面有很大的变化。所有图像都具有种类、头像拉框和像素级分割的相关实况注释。其中,数据集images目录下存放的是所有的宠物原图,annotations/trimaps目录下存放语义分割后的文件。
二、引入相关依赖包
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os
import glob
三、查看与了解数据集图片
我用电脑打开存放图像分割文件的目录时,发现图像分割文件都是黑色的,如下所示。这类文件,可以从tesorflow程序中查看。
下面读取一张图片,并解码。
img = tf.io.read_file('/home/wchw/资料/人工智能/下载数据集/The Oxford-IIIT Pet Dataset/annotations/trimaps/yorkshire_terrier_99.png')
img = tf.image.decode_png(img)
查看图片的形状
img.shape
输出结果为TensorShape([358, 500, 1])
对图片进行显示
plt.imshow(img.numpy())
plt.show()
进一步分析一下图像分割文件,
img.numpy().max() #输出3
img.numpy().min() #输出1
np.unique(img.numpy()) #输出array([1, 2, 3], dtype=uint8)
从注释的输出结果可见,图像分割文件中的像素单位可以取三种值,分别为1、2和3。从显示的图像中也能看出来,共有三种颜色,分别为绿色、黄色和紫色。
下面,我再查看下该分割图像文件对应的原图,
img = tf.io.read_file('/home/wchw/资料/人工智能/下载数据集/The Oxford-IIIT Pet Dataset/images/yorkshire_terrier_99.jpg')
img = tf.image.decode_png(img)
img.shape #输出TensorShape([358, 500, 3])
np.unique(img.numpy()) #输出array([ 0, 1, 2, 3, 4, 5, 6……249, 250, 251, 252, 253, 254, 255], dtype=uint8)
从上面的代码注释可以看出,原图像素取值区间为0-255,且第三维是3,说明为彩色图片。
下面进行显示
plt.imshow(img.numpy())
plt.show()
四、读取数据
下面读取原图像和图像分割文件(以目录+文件名的形式读取),并分别存放到images和annotations中,然后根据文件名进行排序。
images = glob.glob('/home/wchw/资料/人工智能/下载数据集/The Oxford-IIIT Pet Dataset/images/*.jpg')
annotations = glob.glob('/home/wchw/资料/人工智能/下载数据集/The Oxford-IIIT Pet Dataset/annotations/trimaps/*.png')
images.sort(key=lambda x: x.split('/')[-1])
annotations.sort(key=lambda x: x.split('/')[-1])
接下来,我验证一下原图像和图像分割文件是否一一对应。
len(images), len(annotations) #输出(7390, 7390)
images[:5] #输出略
images[-5:] #输出略
annotations[:5] #输出略
annotations[-5:] #输出略
结果略。结论是images和annotations的长度相等,并且images与annotations的前5个文件名一致,images与annotations的后5个文件名也一致,这能判断原图像和图像分割文件一一对应。
接下来,需要对数据进行乱序操作。index为乱序序列,原图像和图像分割文件均使用同样的乱序序列进行乱序,因此乱序后的原图像和图像分割文件还是一一对应的。
np.random.seed(2019)
index = np.random.permutation(len(images))
images = np.array(images)[index]
anno = np.array(annotations)[index]
现在,我将原图像和图像分割文件进行组合,如下
dataset = tf.data.Dataset.from_tensor_slices((images, anno))
划分训练数据集和测试数据集,如下,总数据集的前20%为测试数据集,后80%为训练数据集。
test_count = int(len(images)*0.2)
train_count = len(images) - test_count
dataset_train = dataset.skip(test_count)
dataset_test = dataset.take(test_count)
test_count
输出1478,即训练数据集中元素的个数为1478。
标签:输出,分割,img,语义,tensorflow2.3,图像,images,annotations 来源: https://blog.csdn.net/wchwdog13/article/details/112424613