1、圖片組成
(1)如何對一張圖片進行識別,輸入特征值,輸出目標值。
- 在計算機中,對於每一張圖片,都是通過像素進行顯示,每張圖片由像素組成,每一個點的像素值不同。
- 在一張200x200的圖片中:
黑白圖片,單通道圖片,每一個像素點只有一個值,即灰度值,范圍0-255,所以共有200x200,即20000個像素,共有20000個特征。
彩色圖片,三通道圖片,每一個像素點只有三個值,即RGB,范圍0-255,所以共有200x200x3,即20000x3個像素,共有60000個特征。
(2)圖片數字化三要素,[ 長度、寬度、通道數 ]
(3)三要素與張量的關系
指定3-D張量:[height,width,channels] ,即 長度,寬度,通道數
4-D張量:[batch,height,width,channels],即圖片的張數(批量),長度,寬度,通道數
2、圖片的基本操作
每一個圖片樣本必須保持特征值數量一樣,這就需要所有圖片統一特征的數量(像素值一樣)
Ⅰ. 目的:①增加圖片數據的統一性 ②所有圖片轉換為指定大小 ③縮小圖片數據量,防止增加開銷
Ⅱ. 操作API:
縮放圖片的大小
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格式圖片
3、圖片文件讀取API(讀取狗的圖片,並抓換為張量)
(1)圖像讀取器
tf.WholeFileReader
● 將文件的全部內容作為值輸出的讀取器
● return:讀取器實例
● read(file_queue):輸出將是一個文件名(key) 和該文件的內容(值)
1 reader = tf.WholeFileReader() 2 key, value = reader.read(file_queue)
(2)圖像解碼器
tf.image.decode_ jpeg(contents)
● 將JPEG編碼的圖像解碼為uint8張量
● return: uint8張量,3-D形狀 [ height, width, channels]
1 image = tf.image.decode_jpeg(value)
tf.image.decode_png(contents)
● 將PNG編 碼的圖像解碼為uint8或uint16張量
● return:張量類型, 3-D形 狀[height, width, channels]
(3)分步代碼實現
將文件讀入列表
1 file_name = os.listdir(r"E:\pythonprogram\deepLearning\base\dog") 2 fileList = [os.path.join(r"E:\pythonprogram\deepLearning\base\dog",file) for file in file_name]
Ⅰ. 構建文件隊列
file_queue = tf.train.string_input_producer(fileList)
Ⅱ. 構造閱讀器去讀取圖片內容(默認讀取一張圖片)
1 reader = tf.WholeFileReader() 2 key, value = reader.read(file_queue) #value 是一張圖片對應的值 3 print(value) #這里只看tensor的形狀
輸出:
Tensor("ReaderReadV2:1", shape=(), dtype=string) #什么都沒有,需要解碼
Ⅲ. 對圖片進行解碼
1 image = tf.image.decode_jpeg(value) 2 print(image)
輸出:
1 Tensor("DecodeJpeg:0", shape=(?, ?, ?), dtype=uint8) #上面讀取的是byes類型,解碼之后是uint8
Ⅳ. 處理圖片的大小(因為圖片的大小有可能是不一樣的,所以需要統一圖片的大小)
1 image_resize = tf.image.resize_images(image,[200,200]) #size 指定圖片的長和寬,縮放后的像素由計算機自動處理 2 print(image_resize)
輸出:
Tensor("resize/Squeeze:0", shape=(200, 200, ?), dtype=float32) #resize之后變成float, float類型還原時是不行的,像素值只能用一個整型的數值存儲的
Ⅴ. 固定樣本大小,在固定樣本大小之后才能進行批處理
1 image_resize.set_shape([200,200,3]) #設置靜態形狀,在批處理的時候要求所有形狀都要固定 2 print(image_resize)
輸出:
Tensor("batch:0", shape=(10, 200, 200, 3), dtype=float32)
Ⅵ. 批處理
1 image_batch = tf.train.batch([image_resize], batch_size=10,num_threads=1,capacity=10) #批處理結果返回image_batch 2 print(image_batch)
輸出:
Tensor("batch:0", shape=(10, 200, 200, 3), dtype=float32)
Ⅶ.會話
1 with tf.Session() as sess: 2 #定義一個線程協調器 3 coord = tf.train.Coordinator() 4 5 # 開啟讀文件的線程 6 threads = tf.train.start_queue_runners(sess, coord=coord) 7 8 #打印讀取的內容 9 print(sess.run([image_batch])) 10 11 #回收子線程 12 coord.request_stop() 13 coord.join(threads)
(4)完整代碼
1 import tensorflow as tf 2 import os 3 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #去掉警告,將警告級別提升 4 5 6 def picRead(fileList): 7 """ 8 讀取狗的圖片,並轉換為張量 9 :param fileList: 文件路徑 + 名字的列表 10 :return: 每張圖片的張量 11 """ 12 13 # 1.構建文件隊列 14 file_queue = tf.train.string_input_producer(fileList) 15 16 # 2.構造閱讀器去讀取圖片內容(默認讀取一張圖片),實例化一個reader 17 reader = tf.WholeFileReader() 18 19 key, value = reader.read(file_queue) #value 是一張圖片對應的值 20 21 # 3.對圖片進行解碼,看圖片的格式為jpg 22 image = tf.image.decode_jpeg(value) 23 24 # 4.處理圖片的大小(因為圖片的大小有可能是不一樣的,所以需要統一圖片的大小) 25 image_resize = tf.image.resize_images(image,[200,200]) #size 指定圖片的長和寬,縮放后的像素由計算機自動處理 26 27 # 5.1. 注意:一定要把樣本的形狀固定 [200,200,3] 28 image_resize.set_shape([200,200,3]) #設置靜態形狀,在批處理的時候要求所有形狀都要固定,如果不固定,計算機不知道取多少張圖片層視為一張圖片 29 30 # 5. 進行批處理 31 image_batch = tf.train.batch([image_resize], batch_size=10,num_threads=1,capacity=10) #批處理結果返回image_batch 32 return image_batch 33 34 if __name__ == '__main__': 35 # 1.找到文件,放入列表 路徑+名字 ->列表當中 36 file_name = os.listdir(r"E:\pythonprogram\deepLearning\base\dog") 37 # print(file_name) 38 fileList = [os.path.join(r"E:\pythonprogram\deepLearning\base\dog",file) for file in file_name] 39 # print(fileList) 40 image_batch = picRead(fileList) 41 42 # 開啟會話運行結果 43 with tf.Session() as sess: 44 #定義一個線程協調器 45 coord = tf.train.Coordinator() 46 47 # 開啟讀文件的線程 48 threads = tf.train.start_queue_runners(sess, coord=coord) 49 50 #打印讀取的內容 51 print(sess.run([image_batch])) 52 53 #回收子線程 54 coord.request_stop() 55 coord.join(threads)
輸出:
[array([[[[252. , 252. , 252. ], [251. , 251. , 251. ], [251. , 251. , 251. ], ..., [251. , 251. , 251. ], [251. , 251. , 251. ], [249. , 249. , 249. ]], .... .... .... [[182. , 173. , 166. ], [181. , 172. , 165. ], [180. , 171. , 162. ], ..., [171.5 , 161. , 159. ], [181. , 171. , 169. ], [175.5 , 167.5 , 164.5 ]], [[186. , 176. , 167. ], [186. , 176. , 167. ], [184. , 174. , 165. ], ..., [167.5 , 160.5 , 154.5 ], [169.5 , 162.5 , 156.5 ], [171.5 , 164.5 , 158.5 ]]]], dtype=float32)]