1

我有一個具有形狀(600,400)的熱圖numpy數組。熱圖表示檢測概率。就我而言,圖像中人臉檢測的概率。我的目標是獲取這個熱圖,並獲得發生概率最高的座標(X和Y)。在numpy熱圖上獲取「最熱區域」的座標

我已經解決了這個情況的一張臉。代碼如下:

face_location = np.unravel_index(heatmap.argmax(), heatmap.shape) 
    print("Face location: " + str(face_location)) 

但在某些情況下有多個面孔。我不知道如何調整算法以返回多個「最熱區域」。問題在於任何一個熱點地區都會被逐漸減少的熱點地區所包圍。所以有可能在最熱門的地區之後,下一個前10名都會在最初的位置。

如何調整算法以查找多個熱點區域?假設他們不會彼此靠近是可以的。

heatmap = [[ 2.00299415e-04 2.03753079e-04 8.17560707e-04 ..., 2.23556344e-04 
     1.98958180e-04 9.92935777e-01] 
     [ 2.00642273e-04 2.04473894e-04 8.19963054e-04 ..., 2.24148811e-04 
     1.99438742e-04 9.92921114e-01] 
     [ 2.01056406e-04 2.05344462e-04 8.22864589e-04 ..., 2.24864416e-04 
     2.00019145e-04 9.92903233e-01] 
     ..., 
     [ 7.28193991e-05 -2.73474743e-05 2.95096161e-05 ..., 5.96550672e-05 
     1.98282614e-05 9.99637246e-01] 
     [ 7.34055429e-05 -2.72389279e-05 3.02382941e-05 ..., 5.98490733e-05 
     2.04356711e-05 9.99619305e-01] 
     [ 7.37556256e-05 -2.71740992e-05 3.06735128e-05 ..., 5.99649393e-05 
     2.07984649e-05 9.99608397e-01]] 
+0

可能想看看[如何獲得在numpy數組中的N個最大值的索引?](https://stackoverflow.com/questions/6910641/how-to-get-indices-of-n-如果我正確地讀你的問題,最大值在數組中。 –

回答

0

或許可以考慮使用mask array與閾值概率定義熱點領域?

In [29]: threshold_probability = 0.8 

In [30]: prng = np.random.RandomState(42) 

In [31]: heatmap = prng.rand(600, 400) 

In [32]: heatmap 
Out[32]: 
array([[ 0.37454012, 0.95071431, 0.73199394, ..., 0.42899403, 
     0.75087107, 0.75454287], 
     [ 0.10312387, 0.90255291, 0.50525237, ..., 0.56513318, 
     0.69665082, 0.92249938], 
     [ 0.70723863, 0.15253904, 0.57628836, ..., 0.96887786, 
     0.74965183, 0.13008624], 
     ..., 
     [ 0.77669933, 0.98757844, 0.72686576, ..., 0.149866 , 
     0.6685433 , 0.90248875], 
     [ 0.116007 , 0.96352904, 0.33109138, ..., 0.85776718, 
     0.88838363, 0.00901272], 
     [ 0.30810176, 0.43190563, 0.60935151, ..., 0.07498895, 
     0.60716006, 0.31712892]]) 

In [33]: hottest_areas = np.ma.MaskedArray(heatmap, heatmap < threshold_probability) 

In [34]: X, Y = hottest_areas.nonzero() 

In [35]: X 
Out[35]: array([ 0, 0, 0, ..., 599, 599, 599]) 

In [36]: Y 
Out[36]: array([ 1, 7, 11, ..., 376, 388, 394]) 

結果是一個包含x和的量,布爾條件限定掩模是False值Y的COORDS一個元組(即,那些領域面部的概率大於閾值更高)。

0

如果你想要像davidrpugh建議的閾值,我有不同的方法來提出。 而不是找到非零元素,只需找到二進制圖像的連接組件。

import numpy as np 
from scipy.ndimage.measurements import label 
from skimage.measure import regionprops 

heatmap = np.random.rand(100, 25) 

thresh = 0.9 
bw = np.array(heatmap) 
bw[bw < thresh] = 0 

img_cc, nb_cc = label(bw) 
cc = regionprops(img_cc) 

face_location = np.array([c.centroid for c in cc]) 

import matplotlib.pyplot as plt 

plt.figure() 
plt.imshow(heatmap) 
plt.plot(face_location[:, 1], face_location[:, 0], 'r*') 

plt.figure() 
plt.imshow(img_cc) 
plt.plot(face_location[:, 1], face_location[:, 0], 'r*') 

plt.show() 

面部定位在這裏由connexe部件的中心定義,但你可以看看的最大各個區域的圖像中代替。