2016-10-30 27 views
0

我試圖從視覺注意紙(https://arxiv.org/abs/1406.6247)的週期性模型實現瞥見傳感器。numpy批量瞥見傳感器

基本上,我需要從2d numpy數組中提取矩形作物。對於單個輸入來說沒有任何問題,但我似乎無法弄清楚如何通過批處理來完成。

所以輸入是:

  • 圖片 - 樣本×高度×寬度陣列
  • 位置 - 樣本×2陣列 - 組x,y座標爲每個樣本圖像

的輸出應該是某個尺寸的每個樣本作物區域(例如100x100),其中作物的左上角由相應的位置條目指定,因此它應該是樣本x 100 x 100。現在我忽略所有角落的情況下,所以可以假定莊稼是完全的包含在圖像中,並且位置已經處於可用於numpy索引的格式。

在單個圖像中的任務的情況下很容易:

image[location[0]:location[0]+100, location[1]:location[1]+100] 

但將它應用到它的批次稍微硬。做

image[:, location[:,0]:location[:,0]+100, location[:,1]:location[:,1]+100] 

不起作用,因爲切片不接受numpy數組。

爲任意作物大小提供全套指數似乎也不適用於我。

另一種選擇是循環遍歷批處理,並從每個圖像中分別提取裁剪,但我不確定這將是多高效。

那麼,在沒有使用循環的情況下,這種索引在numpy中是可能的嗎?

回答

0

這似乎工作:我只是提供了全套索引,如上所述。我們可以簡單地首先生成範圍:

ranges_x = [list(range(i, i+10)) for i, _ in locations] 
ranges_y = [list(range(j, j+10)) for _, j in locations] 

然後,只需將這些指標:

images[:, ranges_x, ranges_y] 

下面是我試過的玩具例子:

>>> images = np.random.random(size=(10, 100, 100)) 
>>> images[0].shape 
(100, 100) 
>>> locations = np.random.random_integers(0, 25, size=(10, 2)) 
>>> ranges_x = [list(range(i, i+10)) for i, _ in locations] 
>>> ranges_y = [list(range(j, j+10)) for _, j in locations] 
>>> crops = images[:, ranges_x, ranges_y] 
>>> crops[0].shape 
(10, 10) 
>>> locations[0] 
array([16, 1]) 
>>> images[0][16][1] 
0.078065688223271312 
>>> crops[0][0][0] 
0.078065688223271312 
+0

形狀是正確的,但'作物'不是從給定圖像中的作物。你可以用'numpy.arange(10 * 100 * 100).reshape(10,100,100)'來查看'images',並查看'crop [0]'來輕鬆檢查。 – user2971693