• 深度学习基础之《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

    1. import os
    2. os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
    3. import tensorflow as tf
    4. def picture_read():
    5. """
    6. 狗图片读取案例
    7. """
    8. image_dataset = [] #创建一个空列表
    9. image_resize = []
    10. # 1、构造文件名列表
    11. filenames = tf.data.Dataset.list_files("./dog/*.jpg")
    12. for filename in filenames:
    13. print(filename)
    14. # 2、读取与解码
    15. for filename in filenames:
    16. raw = tf.io.read_file(filename)
    17. image = tf.io.decode_jpeg(raw, channels=3)
    18. print("image: ", image.shape, image.dtype)
    19. image_dataset.append(image)
    20. # 3、批处理
    21. #print("image_dataset: ", image_dataset)
    22. # 图像的形状、类型修改
    23. for image in image_dataset:
    24. resize = tf.image.resize(image, [200, 200])
    25. print("resize: ", resize)
    26. image_resize.append(resize)
    27. #print("image_resize: ", image_resize)
    28. return None
    29. if __name__ == "__main__":
    30. picture_read()

    filename打印例子:

    tf.Tensor(b'./dog/dog.73.jpg', shape=(), dtype=string)

    image打印例子:

    image:  (375, 499, 3) 'uint8'>

    resize打印例子:

    1. resize: tf.Tensor(
    2. [[[ 35.787663 35.787663 43.787663]
    3. [ 28.08867 28.846172 32.36117 ]
    4. [ 17.412218 17.412218 15.636655]
    5. ...
    6. [103.03774 106.03774 114.813324]
    7. [102.62288 105.62288 113.107925]
    8. [ 93.996574 96.780716 101.780716]]
    9. [[ 60.637985 60.637985 69.14299 ]
    10. [ 27.600521 28.289515 32.010033]
    11. [ 19.479155 19.479155 18.004156]
    12. ...
    13. [ 32.533382 35.607536 41.51757 ]
    14. [ 35.41387 37.985897 43.11993 ]
    15. [ 43.380077 43.592636 47.422752]]
    16. [[ 69.490005 69.490005 78.20056 ]
    17. [ 23.95669 24.47169 28.818346]
    18. [ 22.8125 22.8125 21.6125 ]
    19. ...
    20. [ 39.336327 43.336327 45.53636 ]
    21. [ 22.146877 23.9786 25.84197 ]
    22. [ 50.45275 47.524483 48.972183]]
    23. ...
    24. [[106.42441 86.42441 79.42441 ]
    25. [121.99182 101.99182 94.99182 ]
    26. [169.41891 149.4189 142.4189 ]
    27. ...
    28. [145.95242 122.95242 114.95242 ]
    29. [147.68799 124.68798 116.68798 ]
    30. [122.67888 102.26643 95.12895 ]]
    31. [[117.95943 94.80693 91.95943 ]
    32. [124.60395 101.27746 100.38693 ]
    33. [153.56409 129.69409 130.43408 ]
    34. ...
    35. [142.74245 118.30745 112.796585]
    36. [142.50908 117.41502 113.44056 ]
    37. [131.79726 109.64476 101.92726 ]]
    38. [[141.82442 117.82442 117.82442 ]
    39. [120.10246 95.10246 98.34496 ]
    40. [131.69261 106.69261 110.69261 ]
    41. ...
    42. [154.4974 126.497406 123.497406]
    43. [147.52274 120.795166 120.522736]
    44. [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()调整大小
     

  • 相关阅读:
    JavaScript 基础知识
    ubuntu20.04.5 LTS搭建高可用k3s集群
    c语言进阶部分详解(指针进阶1)
    使用Python进行Base64编码和解码
    你没办法欺骗内在小孩,更不能逼着TA清理
    Java学习笔记之Formatter的用法详解(输出格式化)
    【李宏毅机器学习2021】Task04 深度学习介绍和反向传播机制
    PTA 1064 朋友数(Python3)
    【Linux】之Centos7安装KVM虚拟化
    关于MyBatis-plus中为什么要重写ServiceImpl接口中的问题
  • 原文地址:https://blog.csdn.net/csj50/article/details/137972779