1. 程式人生 > >如何用TensorFlow圖像處理函數裁剪圖像?

如何用TensorFlow圖像處理函數裁剪圖像?

tensorflow

當給定大量不同質量的訓練數據時,CNN往往能夠很好地工作。

–圖像能夠通過可視化的方式,傳達復雜場景所蘊含的某種目標主題。

–在Stanford Dogs數據集中,重要的是圖像能夠以可視化的方式,突出圖片中狗的重要性。

–一幅狗位於畫面中心的圖像,會被認為比狗作為背景的圖像更有價值。

並非所有數據集都擁有最有價值的圖像。下面所示的兩幅圖像,按照假設,該數據集本應突出不同的狗的品種

技術分享


左圖突出的是一條典型的墨西哥無毛犬的重要屬性,而右圖是兩個參加聚會的人,在逗一條墨西哥無毛犬。右圖中充斥了大量的無關信息,這可能會導致所訓練的CNN模型,對參加聚會的人的面部信息,更為關註。類似這樣的圖像中可能會包含狗,可對其進行操作,使狗而非人,成為真正被突出的對象。下面總結那些對訓練CNN有用的圖像處理方法。


裁剪會將圖像中的某些區域移除,將其中的信息完全丟棄。裁剪與tf.slice類似,後者是將一個張量中的一部分,從完整的張量中移除。當沿某個維度存在多余的輸入時,為CNN對輸入圖像進行裁剪便是十分有用的。


例如,為減少輸入的尺寸,可對狗位於圖像中心的圖片進行裁剪。

sess.run(tf.image.central_crop(image, 0.1))

執行上面的代碼後,可得到輸出:

array([[[ 3, 108, 233]]], dtype=uint8)


這段示例代碼利用了tf.image.central_crop,將圖像中10%的區域摳出,並將其返回。

–該方法總是會基於所使用的圖像的中心返回結果。

–裁剪通常在預處理階段使用,但在訓練階段,若背景也有用時,它也可派上用場。

–當背景有用時,可隨機化裁剪區域起始位置,到圖像中心的偏移量來實現裁剪。


這個裁剪方法僅可接收實值輸入

real_image= sess.run(image)

bounding_crop= tf.image.crop_to_bounding_box(

real_image, offset_height=0, offset_width=0, target_height=2, target_width=1)

sess.run(bounding_crop)

執行上述代碼,可得到輸出:

array([[[ 0, 0, 0]],[[ 0, 191, 0]]], dtype=uint8)

為從位於(0,0)的圖像的左上角像素開始,對圖像裁剪,示例代碼使用了tf.image.crop_to_bounding_box

目前,該函數只能接收一個具有確定形狀的張量。因此,輸入圖像需要事先在數據流圖中運行。


本文出自 “中科院計算所培訓” 博客,謝絕轉載!

如何用TensorFlow圖像處理函數裁剪圖像?