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这是可行的,但您能帮我解释一下实际发生的情况吗?谢谢,我会在回答部分添加详细信息