(第二章第二部分)TensorFlow框架之讀取圖片數據


 

系列博客鏈接:

第二章第一部分)TensorFlow框架之文件讀取流程:https://www.cnblogs.com/kongweisi/p/11050302.html

 

本文概述:

  • 目標
    • 說明圖片數字化的三要素
    • 說明圖片三要素與張量的表示關系
    • 了解張量的存儲和計算類型
    • 應用tf.image.resize_images實現圖像的像素改變
    • 應用tf.train.start_queue_runners實現讀取線程開啟
    • 應用tf.train.Coordinator實現線程協調器開啟
    • 應用tf.train.batch實現數據的批處理
  • 應用
    • 商品圖片讀取

 

1、 圖像基本知識

對於圖像文件,我們怎么進行轉換成機器學習能夠理解的數據。對於圖片來講,組成圖片的最基本單位是像素,所以我們獲取的是每張圖片的像素值。接觸的圖片有兩種,一種是黑白圖片,另一種是彩色圖片。

1.1 圖片三要素

組成一張圖片特征值是所有的像素值,有這么幾個要素。圖片長度、圖片寬度、圖片通道數。什么是圖片的通道數呢,描述一個像素點,如果是灰度,那么只需要一個數值來描述它,就是單通道。如果一個像素點,有RGB三種顏色來描述它,就是三通道。那所以

  • 灰度圖片:單通道
  • 彩色圖片:三通道

 

假設一張彩色圖片的長200,寬200,通道數為3,那么總的像素數量為200x200x3

1.2 張量形狀

讀取圖片之后,怎么用張量形狀來表示呢。一張圖片就是一個3D張量,[height, width, channel],height就表示高,width表示寬,channel表示通道數。我們會經常遇到3D和4D的表示

  • 單個圖片:[height, width, channel]
  • 多個圖片(4D):[batch, height, width, channel],batch表示批數量

1.3 圖片特征值處理

在進行圖片識別的時候,每個圖片樣本的特征數量要保持相同(方便神經網絡的訓練)。所以需要將所有圖片張量大小統一轉換。另一方面如果圖片的像素量太大,也可以通過這種方式適當減少像素的數量,減少訓練的計算開銷

  • tf.image.resize_images(images, size)
    • 縮小放大圖片
    • images:4-D形狀[batch, height, width, channels],或3-D形狀的張量[height, width, channels]的圖片數據
    • size:1-D int32張量:new_height, new_width,圖像的新尺寸
    • 返回4-D格式或者3-D格式圖片

1.4 數據格式

  • 存儲:uint8(節約空間)
  • 矩陣計算:float32(提高精度)

2、案例:商品圖片讀取

2.1 讀取流程分析

  • 構造圖片文件隊列
  • 讀取圖片數據並進行解碼
  • 處理圖片數據形狀,批處理返回
  • 開啟會話線程運行

2.2 代碼

def picture_read(file_list):
    """
    商品圖片讀取,轉換成數據張量
    :return:
    """
    # 1、構造文件隊列
    # 返回文件隊列
    file_queue = tf.train.string_input_producer(file_list)

    # 2、構造一個圖片讀取器,去文件隊列中讀取數據
    # 返回reader實例,調用read方法讀取內容,key, value
    reader = tf.WholeFileReader()

    key, value = reader.read(file_queue)

    print(value)

    # 3、對樣本內容進行解碼
    image = tf.image.decode_jpeg(value)

    print(image)

    # 處理圖片的大小,形狀,resize_images圖片數據類型變成了float類型,所有圖片大小都變成了200x200的
    image_resize = tf.image.resize_images(image, [200, 200])

    print(image_resize)

    # 設置固定形狀,這里可以使用靜態形狀API去修改
    image_resize.set_shape([200, 200, 3])

    # 4、批處理圖片數據
    # 每個樣本的形狀必須全部定義,否則會報錯
    image_batch = tf.train.batch([image_resize], batch_size=100, num_threads=1, capacity=100)

    print(image_batch)

    return image_batch
  • 會話邏輯
if __name__ == "__main__":
    # 生成路徑+文件名的列表
    filename = os.listdir("./data/dog/")

    # 路徑+名字拼接
    file_list = [os.path.join("./data/dog/", file) for file in filename]

    # 從原始二進制文件讀取
    image_batch = picture_read(file_list)

    # 開啟會話打印內容
    with tf.Session() as sess:
        # 創建線程協調員
        coord = tf.train.Coordinator()

        # 開啟子線程去讀取數據
        # 返回子線程實例
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)

        # 獲取樣本數據去訓練
        print(sess.run(image_batch)

        # 關閉子線程,回收
        coord.request_stop()

        coord.join(threads)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM