關於 tf.image.crop_and_resize 的使用
最近在學習fast-RCNN,在寫ROI Pooling層看到說可以直接利用 tf.image.crop_and_resize 。但是如何使用這個函數成了很大的問題,查網上很多資料都是複製加翻譯從官網api來的,受個人的英語能力又接受不了,最後發帖求助解決了這個問題,興致盎然分享一遍。
以下是相關的鏈接:
官網API【www.tensorflow.cn】
發帖求助鏈接【stackoverflow】
先來個代碼引用~
tf.image.crop_and_resize(
image,
boxes,
box_ind,
crop_size,
method='bilinear',
extrapolation_value=0,
name=None
)
上面是函數的相關參數,首先必須說明官網中有輸入tensor的要求,但是我直接輸入值也是可以的。這裏進行相應的解釋:
- boxes:指需要劃分的區域,輸入格式爲 [[ymin,xmin,ymax,xmax]] (要注意!這是一個二維列表)。官網在這裏講了一大段,看着簡直頭暈,大概意思是分了兩種情況,一種是超出1另一種就是不超出1的。先將輸入值範圍爲0--1的情況,這裏其實是這樣:
設crop的區域座標爲 [ y1,x1,y2,x2 ],那麼想得到相應正確的crop圖形就一定要歸!一!化!,即圖片長度爲 [ W,H ],則實際輸入的boxes爲 [ y1/H,x1/W,y2/H,x2/W ]。
那超出1的範圍是個啥意思咧?程序將爲你自動補齊的意思,我試了幾次都是直接用空白補齊,不知道大家有沒有不一樣的結果,注意奧!你的範圍要是全部超出1,那就穩穩當當是個黑色框了,因爲超出1根據歸一化截取不到圖片任何內容啦!
- box_ind:box_ind 按我的理解,就是 boxes !index 嘛!那就是對應的關係囉。另外,按照官網的想法,投入的是tensor,那麼肯定不止一張圖片啦,這個參數就是爲了索引用的。值得注意的(下方代碼貼出來會更清楚。
- crop_size:這個參數就可想而知啦,本來這就是我用這個函數的原因,輸入一個大小即可,可以忽視通道數量這些
好啦,參數解釋就這麼多,但是如果有人按照上面的千辛萬苦解決之後,使用 sess.run() 得到實際數據,開開心心 imshow() 一下。然後!得到的東西大概是這樣----- ->->
@#!??@#!^@!*&^&*!$JKH !當時心情就是這樣
辛虧帖子裏的仁兄說明了這個問題,這裏我就直接引用了
As you're using float outside the
[0,1]
range, matplotlib is bounding your values to1
. That's why you get those colored pixels (either solid red, solid green or solid blue, or a mixing of these). Cast your array touint_8
to get an image that make sense.
大致是因爲我使用的是matplotlib模塊,而當數據爲浮點數則應歸一化否則應爲整數型 。
那麼最後操作: 結果 % 255,或者類似 astype('uint8')
大!功!告!成!
噢噢噢噢噢噢噢噢,貼上真正的結果圖(下圖下方和右方黑框和白框就是程序自動填充的)
我要氣瘋了,誰能告訴我圖片大小我明明設置的很小了怎麼滴還是這麼大!
最後貼上我的代碼:
import tensorflow as tf
import matplotlib.pyplot as plt
img = plt.imread(image_path)
shape = img.shape
img = img.reshape([1,shape[0], shape[1], shape[2]])
a = tf.image.crop_and_resize(img,[[0.5,0.6,0.9,0.8],[0.2,0.6,1.3,0.9]],box_ind=[0,0],crop_size=(100,100))
sess = tf.Session()
b = a.eval(session = sess)
plt.imshow(b[0]/255)
plt.imshow(b[0].astype('uint8'))
謝謝大家捧場!拱手!
突然想寫這個是有些無奈,有時候查一個函數查半天論壇裏大部分都是直接引用官網內容,左上角還有個 原創字樣 太扎眼。另外任何疑問或者可以改進的地方,希望大傢伙都可以幫幫我。希望能在這裏快快成長!