如何用TensorFlow影像處理函式裁剪影像?

shenmanli發表於2017-09-08
當給定大量不同質量的訓練資料時,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
目前,該函式只能接收一個具有確定形狀的張量。因此,輸入影像需要事先在資料流圖中執行。

相關文章