系列博客鏈接:
(第二章第一部分)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)