一、图像基本知识
1、如何转换图片文件
回忆:之前我们在特征抽取中讲过如何将文本处理成数据
思考:如何将图片文件转换成机器学习算法能够处理的数据?
我们经常接触到的图片有两种,一种是黑白图片(灰度图),另一种是彩色图片
组成图片的最基本单位是像素
2、特征抽取
文本特征抽取:转换成数值,二维数组shape(n_samples, m_features)
n_samples行,m_features列
字典特征抽取:转换成数值,二维数组shape(n_samples, m_features)
one-hot编码
图片怎么特征抽取?
3、图片三要素
组成一张图片特征值是所有的像素值,有三个维度:图片长度、图片宽度、图片通道数
图片的通道数是什么?
描述一个像素点,如果是灰度图,那么只需要一个数值来描述它,就是单通道
如果一个像素点,有RGB三种颜色来描述它,就是三通道
灰度图:单通道
彩色图:三通道,RGB
4、图片的特征抽取
图片:转换成数值,三维数组shape(图片长度、图片宽度、图片通道数)
灰度图[长,宽,1]
每一个像素点是[0, 255]的数,越接近255越白
彩色图[长,宽,3]
每一个像素点是三个通道(每个通道又是一个灰度图)
一个彩色像素点是由三个通道像素点组合而成
每一个像素点用3个[0, 255]的数来表示
5、如果一张彩色图片的长为200,宽为200,通道数为3,那么总的像素为:200 * 200 * 3
二、图片张量的形状
1、在tensorflow中如何用张量表示一张图片呢?
Tensor(指令名称, shape, dtype)
一张图片可以被表示成一个3D张量,即其形状为[height, width, channel],height就表示高,width表示宽,channel表示通道数。我们会经常遇到3D和4D的表示
2、单个图片
一张图片,shape部分 = (height, width, channel)
3、多个图片
多张图片,shape部分 = (batch, height, width, channel),batch表示一个批次的张量数量
三、图片特征值处理
1、图片数据集
(1)一个样本图片:327 * 499 * 3,数据量过大
(2)样本和样本的形状不统一,没办法进行批量操作和运算
2、为什么要将图片缩放到统一大小?
在进行图像识别的时候,每个图片样本的特征数量要保持相同。所以要将所有图片张量大小统一转换
另一方面,如果图片的像素量太大,通过这种方式适当减少像素的数量,减少训练的计算开销
3、tf.image.resize(images, size)
说明:
(1)缩放图片
(2)images:4-D形状[batch, height, width, channels]或3-D形状的张量[height, width, channels]的图片数据
(3)size:是1-D int32张量,有2个要素:new_height,new_width,图像的新尺寸
(4)返回4-D格式或者3-D格式图片
四、图片数据格式
1、存储
用统一的uint8(节约空间)
2、矩阵计算
float32(提高精度)
五、案例:狗图片读取
1、读取流程分析
(1)构造图片文件名队列
(2)读取图片数据并进行解码
(3)处理图片数据形状
(4)运行
2、代码day02_dog_picture_read.py
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tfdef picture_read():"""狗图片读取案例"""image_dataset = [] #创建一个空列表image_resize = []# 1、构造文件名列表filenames = tf.data.Dataset.list_files("./dog/*.jpg")for filename in filenames:print(filename)# 2、读取与解码for filename in filenames:raw = tf.io.read_file(filename)image = tf.io.decode_jpeg(raw, channels=3)print("image: ", image.shape, image.dtype)image_dataset.append(image)# 3、批处理#print("image_dataset: ", image_dataset)# 图像的形状、类型修改for image in image_dataset:resize = tf.image.resize(image, [200, 200])print("resize: ", resize)image_resize.append(resize)#print("image_resize: ", image_resize)return Noneif __name__ == "__main__":picture_read()
filename打印例子:
tf.Tensor(b'./dog/dog.73.jpg', shape=(), dtype=string)
image打印例子:
image: (375, 499, 3) <dtype: 'uint8'>
resize打印例子:
resize: tf.Tensor(
[[[ 35.787663 35.787663 43.787663][ 28.08867 28.846172 32.36117 ][ 17.412218 17.412218 15.636655]...[103.03774 106.03774 114.813324][102.62288 105.62288 113.107925][ 93.996574 96.780716 101.780716]][[ 60.637985 60.637985 69.14299 ][ 27.600521 28.289515 32.010033][ 19.479155 19.479155 18.004156]...[ 32.533382 35.607536 41.51757 ][ 35.41387 37.985897 43.11993 ][ 43.380077 43.592636 47.422752]][[ 69.490005 69.490005 78.20056 ][ 23.95669 24.47169 28.818346][ 22.8125 22.8125 21.6125 ]...[ 39.336327 43.336327 45.53636 ][ 22.146877 23.9786 25.84197 ][ 50.45275 47.524483 48.972183]]...[[106.42441 86.42441 79.42441 ][121.99182 101.99182 94.99182 ][169.41891 149.4189 142.4189 ]...[145.95242 122.95242 114.95242 ][147.68799 124.68798 116.68798 ][122.67888 102.26643 95.12895 ]][[117.95943 94.80693 91.95943 ][124.60395 101.27746 100.38693 ][153.56409 129.69409 130.43408 ]...[142.74245 118.30745 112.796585][142.50908 117.41502 113.44056 ][131.79726 109.64476 101.92726 ]][[141.82442 117.82442 117.82442 ][120.10246 95.10246 98.34496 ][131.69261 106.69261 110.69261 ]...[154.4974 126.497406 123.497406][147.52274 120.795166 120.522736][135.49553 112.49553 104.49553 ]]], shape=(200, 200, 3), dtype=float32)
先用tf.data.Dataset.list_files()获取文件名列表,然后用tf.io.read_file()读取成dtype string类型的tensor对象,然后用tf.io.decode_jpeg()解码成dtype uint8类型的tensor对象,然后把解码后的image放入列表里,然后用tf.image.resize()调整大小