12、數據讀取(四)——圖片文件讀取


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)]


免責聲明!

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



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