了解函数forward()和getUnconnectedOutLayers()

时间:2019-04-27 17:34:44

标签: python opencv

ln = net.getLayerNames()
print(ln)
ln = [ln[i[0]-1] for i in net.getUnconnectedOutLayers()] 
print(ln)


blob = cv2.dnn.blobFromImage(image, scalefactor = 1/255.0, size = (416,416), swapRB = True, crop = False)   
net.setInput(blob)
start = time.time()
layerOutputs = net.forward(ln)  
end = time.time()

print("[INFO] Yolo took {:.6f} seconds" .format(end-start))


boxes = []  
confidences = []  
classIDs = []   

for output in layerOutputs :    
    for detection in output :
        scores = detection[5:]  
        classID = np.argmax(scores)
        confidence = scores[classID]

        if confidence > args["confidence"]:
            box = detection[0:4] * np.array([W,H,W,H])
            (centerX, centerY, width, height) = box.astype("int")

            x = int(centerX - (width/2))
            y = int(centerY - (height/2))

            boxes.append([x,y,int(width), int(height)])
            confidences.append(float(confidence))
            classIDs.append(classID)

我上面的代码有两个基本问题:

  1. 我了解使用了功能getUnconnectedOutLayers() 获取未连接的输出层的索引以查找     forward()必须通过网络运行多远。一世     不明白为什么这些输出层被表示为未连接。 另外,这是否意味着在某些情况下,我们不会在整个网络中运行数据?如果是这样,为什么? 关于我们使用getUnconnectedOutLayers()函数的那行的另一件事困扰我,是它的ln[i[0]-1部分。我相信这是反向遍历ln数组的某种方式,但是我并不完全理解。
  2. 在文档中,说明了功能forward() 返回blob作为指定层的第一个输出。我假设它与我们从函数blobFromImage()获得的斑点相同,因为它也是4D。 在代码的后面,声明了以下内容:scores = detection[5:]。由于我假设它是4D数组,因此我期待以下内容:scores = detection[5:::]。是两个维度 切片由于两个for循环而“掉落”了?

1 个答案:

答案 0 :(得分:0)

net.getUnconnectedOutLayers()给出图层的位置。输出是形状为(1,)的ndarray。因此,要获得整数,我们要做ln [0]。为了得到索引,我们从该位置减去1。