Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么NMSboxes不删除多个边界框?_Python 3.x_Opencv_Object Detection_Yolo_Opencv Python - Fatal编程技术网

Python 3.x 为什么NMSboxes不删除多个边界框?

Python 3.x 为什么NMSboxes不删除多个边界框?,python-3.x,opencv,object-detection,yolo,opencv-python,Python 3.x,Opencv,Object Detection,Yolo,Opencv Python,首先,这里是我的代码: image = cv2.imread(filePath) height, width, channels = image.shape # USing blob function of opencv to preprocess image blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True

首先,这里是我的代码:

        image = cv2.imread(filePath)
        height, width, channels = image.shape
        
        # USing blob function of opencv to preprocess image
        blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),
        swapRB=True, crop=False)
        #Detecting objects
        net.setInput(blob)
        outs = net.forward(output_layers)
        
        # Showing informations on the screen
        class_ids = []
        confidences = []
        boxes = []

        for out in outs:
            for detection in out:
                scores = detection[5:]
                class_id = np.argmax(scores)
                confidence = scores[class_id]
                if confidence > 0.7:
                    # Object detected
                    center_x = int(detection[0] * width)
                    center_y = int(detection[1] * height)
                    w = int(detection[2] * width)
                    h = int(detection[3] * height)

                    # Rectangle coordinates
                    x = int(center_x - w / 2)
                    y = int(center_y - h / 2)

                    boxes.append([x, y, w, h])
                    confidences.append(float(confidence))
                    class_ids.append(class_id)
                    
                indexes = cv2.dnn.NMSBoxes(boxes, confidences,score_threshold=0.4,nms_threshold=0.8,top_k=1)
                
        font = cv2.FONT_HERSHEY_PLAIN
        colors = np.random.uniform(0, 255, size=(len(classes), 3))
        labels = ['bicycle','car','motorbike','bus','truck']
        for i in range(len(boxes)):
            if i in indexes:
                label = str(classes[class_ids[i]])
                if label in labels:
                    x, y, w, h = boxes[i]
                    color = colors[class_ids[i]]
                    cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
                    cv2.putText(image, label, (x, y + 30), font, 2, color, 3)
        cv2.imshow(fileName,image)
我的问题是:
cv2.dnn.NMSBoxes是否应该消除多个边界框?那么为什么我仍然得到如下示例所示的输出:

我的预期如下:


我的代码有问题吗?还有更好的选择吗?非常感谢您的帮助。

NMS的过程是这样的
输入-提案框B、相应置信度S和重叠阈值N的列表
输出-已筛选的建议列表

算法/步骤

  • 选择置信度最高的提案,将其从B中删除,并将其添加到最终提案列表D中(最初D为空)
  • 现在将此提案与所有提案进行比较-计算此提案与其他提案的IOU(联合交集)。如果IOU大于阈值N,则从B中删除该提案
  • 再次从B中的其余提案中以最高置信度获取提案,并将其从B中删除并添加到D中
  • 再次使用B中的所有提案计算此提案的IOU,并删除IOU高于阈值的框
  • 重复此过程,直到B中不再有提案
  • 这里所指的阈值只不过是
    nms\u阈值

    cv2.dnn.NMSBoxes
    功能中,
    nms\u阈值
    是用于非最大抑制的IOU阈值。
    因此,如果您有一个较大的值,您将强制两个框具有非常高的重叠(通常不是这种情况),并且只有当该框与另一个框的IOU大于0.8时,才会删除该框。因为通常不会有这么多重叠,所以不会移除框。减小此值将更容易删除冗余检测

    希望这有意义


    您可以阅读更多有关非最大值抑制的信息

    NMS的过程如下所示
    输入-提案框B、相应置信度S和重叠阈值N的列表
    输出-已筛选的建议列表

    算法/步骤

  • 选择置信度最高的提案,将其从B中删除,并将其添加到最终提案列表D中(最初D为空)
  • 现在将此提案与所有提案进行比较-计算此提案与其他提案的IOU(联合交集)。如果IOU大于阈值N,则从B中删除该提案
  • 再次从B中的其余提案中以最高置信度获取提案,并将其从B中删除并添加到D中
  • 再次使用B中的所有提案计算此提案的IOU,并删除IOU高于阈值的框
  • 重复此过程,直到B中不再有提案
  • 这里所指的阈值只不过是
    nms\u阈值

    cv2.dnn.NMSBoxes
    功能中,
    nms\u阈值
    是用于非最大抑制的IOU阈值。
    因此,如果您有一个较大的值,您将强制两个框具有非常高的重叠(通常不是这种情况),并且只有当该框与另一个框的IOU大于0.8时,才会删除该框。因为通常不会有这么多重叠,所以不会移除框。减小此值将更容易删除冗余检测

    希望这有意义


    您可以阅读更多关于非最大值限制的信息

    尝试将nms阈值的值降低到0.4到0.7之间,并以0.1步为增量,看看是否会有所不同?@jiteshmalipedi这是可行的,但您能帮我解释一下实际发生的情况吗?谢谢。我将在回答部分添加详细信息。尝试将nms阈值的值降低到0.4到0.7之间,增量为0.1步,看看这是否会有所不同?@jiteshmalipedi这是可行的,但您能帮我解释一下实际发生的情况吗?谢谢,我会在回答部分添加详细信息