作者chengreg (想重回校園的工程師)
看板Python
標題Re: [問題] 語法觀念一問
時間Tue Jun 22 12:10:38 2021
各位前輩,由於問題描述的太過簡略,容小弟詳細說明
其程式碼來自 YOLO 的 predict result decoder,source code 如下 :
netout #為Numpy NDarray
anchors #為 Numpy DNarray
obj_thresh #為 Float32 其數值為 0.6
net_h ,netw #為 int 其數值為 416
def decode_netout(netout, anchors, obj_thresh, net_h, net_w):
grid_h, grid_w = netout.shape[:2]
nb_box = 3
netout = netout.reshape((grid_h, grid_w, nb_box, -1))
nb_class = netout.shape[-1] - 5
boxes = []
netout[..., :2] = _sigmoid(netout[..., :2])
netout[..., 4:] = _sigmoid(netout[..., 4:])
netout[..., 5:] = netout[..., 4][..., np.newaxis] * netout[..., 5:]
netout[..., 5:] *= netout[..., 5:] > obj_thresh
for i in range(grid_h*grid_w):
row = i / grid_w
col = i % grid_w
for b in range(nb_box):
# 4th element is objectness score
objectness = netout[int(row)][int(col)][b][4]
if(objectness.all() <= obj_thresh): continue
# first 4 elements are x, y, w, and h
x, y, w, h = netout[int(row)][int(col)][b][:4]
x = (col + x) / grid_w # center position, unit: image width
y = (row + y) / grid_h # center position, unit: image height
w = anchors[2 * b + 0] * np.exp(w) / net_w # unit: image width
h = anchors[2 * b + 1] * np.exp(h) / net_h # unit: image height
# last elements are class probabilities
classes = netout[int(row)][col][b][5:]
box = BoundBox(x-w/2, y-h/2, x+w/2, y+h/2, objectness, classes)
boxes.append(box)
return boxes
而小弟追蹤該 function 時發現該 objectness 為 float32 (請看截圖) 而無法理解
該ojbectness為何會有 .all() 這個方法, 並且用來判斷 bool ?
一直無法理解這個問題
故上來請教前輩們這個疑惑
謝謝大家幫忙
圖片如下 :
https://photos.app.goo.gl/rbsPt91WBi1FcuvN6
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 117.56.58.151 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1624335041.A.C7D.html
推 penut85420: 我在想你的那個float32應該是來自numpy.float32 06/22 12:25
→ penut85420: 我觀察前面的變數名稱只有顯示ndarray 06/22 12:26
→ penut85420: 而不是numpy.ndarray 06/22 12:26
→ penut85420: 所以我推測了這個float32應該是numpy.float32 06/22 12:27
→ penut85420: 而numpy.float32也確實有.all()這個方法 06/22 12:27
推 penut85420: 關於bool判斷,我在GitHub上找到一個Issue也在談論 06/22 12:33
→ chengreg: 是的。該文的問題跟小弟的一模一樣 謝謝前輩 06/22 12:50
推 s0914714: 所以你上篇回應不太精準 這就是numpy的東西 06/22 13:42
→ s0914714: 一般大家講的Python指的是原生的Python 06/22 13:43
→ chengreg: 這也是小弟頭痛的地方,有時候會搞不清楚該數值從何而來 06/22 13:44
→ chengreg: 但經由penut前輩小弟找到issue並且該作者說這是一個bug 06/22 13:45
→ chengreg: 該bug也已修正,小弟會再多注意是否研讀新版本,謝謝大家 06/22 13:49
推 poototo: IDE 好像都不會顯示更多,是numpy的float32沒錯 06/22 15:46
→ poototo: x = np.float32(-1) 可以用x.all() 06/22 15:46
→ poototo: array.item(n) 跟 array[n] 回傳的類型也不一樣喔 06/22 15:48
推 penut85420: 我推薦檢測特定變數的型態還是用內建的type()比較好 06/22 16:31
→ chengreg: 謝謝前輩提供經驗! 06/22 20:21
→ chengreg: 該問題小弟已全數了解並成功解決 06/22 20:29
→ chengreg: 再次謝謝各位前輩! 06/22 20:29
→ RumiManiac: 原生型別也不是叫做 float32 啊... 06/23 05:07
→ chengreg: 是。我會多注意行型別的。謝謝前輩提醒 06/23 12:34