python读取文件夹下所有图像 预处理_Tensorflow之tif图像文件预处理
寫在前面
許久沒有登錄我的簡書了,或許忙只是給自己的借口,內心浮躁,不愿坐下來靜下心寫點東西才是真正的原因。寫作是個該堅持的好習慣,一方面能記錄下一些當時的心情想法,一方面也是在鍛煉自己的表達能力。善于抒發,會懂得表達在如今其實對個人而言是個很大的加分項。或者說, 起碼是我希望自己能夠提升的一種能力。
目前我正處于碩士生涯的畢業設計階段,也正在籌備即將來臨的求職季。這個文集也是我在目前這個階段的記錄總結。如果你恰好碰到和我一樣或者類似的問題,希望能對你有所幫助。
問題描述
我做的項目與深度學習相關,我選用了Tensorflow作為主要的工具。對于圖像文件,為了便于移動以及讀取為tf.data.Dataset使用,我想做的預處理便是將圖像先轉存為TFRecord文件,之后再通過讀取TFRecord得到tf.data.Dataset。
這樣選擇的理由就不在此詳細展開,可參考以下幾篇文章:
由于Tensorflow目前僅有對bmp,gif,jpeg以及png四種圖片的類型的decode方法,對于tif格式的圖片文件并不支持,我在寫完運行良好的預處理的代碼后,不得不又為此修改了一番。接下來我分別描述修改前后的過程,并點出我需要如何改動才能使tif格式的圖片也能被良好地預處理。
Figure 1 ref:https://www.tensorflow.org/api_docs/python/tf/io/decode_image
預處理1.0版
Pipeline 1.0
起初,我在使用的數據集皆為png格式的圖片,Tensorflow包含了相應的decode方法。于是,在tf.read_file和tf.image.decode_png的啟發下,我選用了如上圖所述的預處理方式:首先將所有的圖像文件讀取為一個tf.data.Dataset,再存為TFRecord文件。在最終需要訓練時再重新將TFRecord文件讀取成當初的tf.data.Dataset。這個方法對我所使用的png圖片數據而言運行良好。在完成并調試這部分代碼的同時,我也通過對其中數次的格式轉換的學習,加深了對Tensorflow這部分代碼的理解。
[ToThink: 是否需要將其中的細節展開敘述呢?]
碰到問題后的反思
一切順風順水,在成功得到了一些測試結果后,我找到了第二個數據集,來進一步檢驗所使用的方法。不幸的事情發生了,第二個數據集為tif格式的圖片,先前寫好的預處理方法會報錯。進行簡單的檢索后我發現,已有很多人被同樣的問題困擾,在17年時便有人在Tensorflow的Github上提出了這一點。但直至現在,還沒有人為此做出貢獻。
ref:https://github.com/tensorflow/tensorflow/issues/12997
既然原有的方式不能對tif圖片進行預處理,不破不立,我只能推倒重來,嘗試用其他的方式在完成這一功能。于是我更仔細地查找資料,閱讀源碼和自己寫的代碼,看看能不能找到一個突破口。
首先,我思考的問題是png圖片與tif圖片究竟有什么不同。png與tif是兩種不同的圖片格式,具體的區別可以查看以下的這篇文章。
What's the Difference Between PNG, JPEG, GIF, and TIFF?
其中關鍵的區別是,tif圖片并不一定是三通道的圖片文件,很可能含有更多的通道。但png,jpeg,bmp等格式的圖片,都是單通道(灰度圖片)或者三通道(RGB)的圖片文件。簡單來說,tif圖片的通道數的可能很多,并且不同通道中的數值代表的意義也有很大的不同,不僅僅是顏色數值這么簡單?;蛟S這就是為何tif圖片的decode遲遲沒人完成的原因吧。
幸運的是,我所要使用的這個數據集的所有tif圖片,都是三通道(RGB)的。從圖片數據角度而言,前后兩個數據集沒有任何區別。于是我返回去查看預處理1.0的代碼,重點放在了數據格式的轉換上。有了如下的發現:
經tf.read_file函數讀取后的返回的類型為A Tensor of type string,是一個Tensor。而如圖一所示,Tensorflow中decode_img進行的處理是“ performs the appropriate operation to convert the input bytes string into a Tensor of type dtype.” ,返回類型依然是一個Tensor。但最終轉存為TFRecord文件中的確實是轉化成字符串的圖片文件。
#代碼片段
#tf.data.Dataset -> TFRecord
img_data = img.tobytes()
mask_data = mask.tobytes()
#print(type(img_data))
example=tf.train.Example(features=tf.train.Features(
feature={
'shape': tf.train.Feature(int64_list =
tf.train.Int64List(value=[img.size[0],
img.size[1],len(img.getbands())])),
'img_data':tf.train.Feature(bytes_list =
tf.train.BytesList(value=[img_data])),
'mask_data':tf.train.Feature(bytes_list =
tf.train.BytesList(value=[mask_data]))
}))
既然最終需要的是轉化為字符串的圖片文件,那么中間變成Tensor的幾步操作,是可以用其他方式替代的。圖片本質而言就是矩陣,對于所有的三通道RGB圖片,可將他們直接轉化為矩陣先進行一系列預處理操作(如改變大小,旋轉,調色),之后再轉存為TFRecord文件就可以了。我先前的一個觀念是,只有將tf.data.Dataset變成TFRecord,才能再后面從TFRecord變成TFRecordtf.data.Dataset。但在測試后發現,只要有了TFRecord,就能輕易的讀取為tf.data.Dataset,不管TFRecord是如何得到的。
預處理2.0版
經過修改,2.0版本的預處理方式便實現出來了。代碼鏈接
Pipeline 2.0
在讀取圖片時,我選用的庫為Pillow,主要原因為其讀取tif圖片的表現較好。但可能會碰到如下的報錯信息:
Hide "TIFFSetField: tempfile.tif: Unknown pseudo-tag 65538."
總結
本文總結并介紹了在Tensorflow下預處理tif圖像的一種方式。在至今Tensorflow仍沒給出tif的decode函數的情況下,我們可以選用先直接將圖像轉化成矩陣,經預處理后再轉存為TFRecord的方式進行預處理。
從這個過程中,我不得不深入的去思考整個格式轉換的的過程。在我看來,最重要的一點,便是看清楚最終轉換的目標結果,通過結果再思考選用的方式和流程。
總結
以上是生活随笔為你收集整理的python读取文件夹下所有图像 预处理_Tensorflow之tif图像文件预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: finfoopen需要什么扩展 php_
- 下一篇: 二进制安全与MySQL的关系_《高可用M