深度学习基础之《TensorFlow框架(12)—图片数据》

一、图像基本知识

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

python 复制代码
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf

def 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 None

if __name__ == "__main__":
    picture_read()

filename打印例子:

python 复制代码
tf.Tensor(b'./dog/dog.73.jpg', shape=(), dtype=string)

image打印例子:

python 复制代码
image:  (375, 499, 3) <dtype: 'uint8'>

resize打印例子:

python 复制代码
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()调整大小

相关推荐
羊小猪~~20 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡1 小时前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
deephub2 小时前
Tokenformer:基于参数标记化的高效可扩展Transformer架构
人工智能·python·深度学习·架构·transformer
___Dream2 小时前
【CTFN】基于耦合翻译融合网络的多模态情感分析的层次学习
人工智能·深度学习·机器学习·transformer·人机交互
极客代码2 小时前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
王哈哈^_^3 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
是瑶瑶子啦4 小时前
【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)
论文阅读·人工智能·深度学习·视觉检测·空间变换
wangyue45 小时前
c# 深度模型入门
深度学习
川石课堂软件测试5 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
985小水博一枚呀5 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer