ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

tensorflow2.3.0语义分割(一)

2021-01-10 23:31:05  阅读:351  来源: 互联网

标签:输出 分割 img 语义 tensorflow2.3 图像 images annotations


对于语义分割的定义,我查阅了一些资料,基本上理解为:图像语义分割指机器自动分割并识别出图像中的内容,比如给出一个人骑摩托车的照片,机器判断后应当能够生成右侧图,红色标注为人,绿色是车(黑色表示背景)。与我们前面介绍的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有