为什么 NMSboxes 不消除多个边界框?
Why NMSboxes is not eleminating multiple bounding boxes?
首先是我的代码:
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
输出 - 过滤后的提案列表 D
Algorithm/steps
- Select置信度最高的proposal,将其从B中移除,加入到最终的proposal列表D中。(初始D为空)
- 现在将此提案与所有提案进行比较——计算此提案与所有其他提案的 IOU(并集交集)。如果IOU大于阈值N,则从B
中移除那个proposal
- 再次从B中剩余的proposals中取出置信度最高的proposal并将其从B中移除并添加到D
- 再次计算这个proposal与B中所有proposal的IOU,剔除IOU高于threshold的框
- 重复此过程,直到 B 中没有更多提案为止
这里所说的阈值只不过是 nms_threshold
.
cv2.dnn.NMSBoxes
函数中,nms_threshold
为非极大值抑制时使用的IOU阈值。
所以如果你有一个很大的值,你就会强制两个盒子有很高的重叠(通常情况并非如此)并且只有当它与另一个盒子的 IOU 超过 0.8 时才会被删除。由于通常没有太多重叠,因此不会删除框。减小这个值将更容易去除冗余检测
希望这是有道理的
您可以阅读有关非极大值抑制的更多信息here
首先是我的代码:
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
输出 - 过滤后的提案列表 D
Algorithm/steps
- Select置信度最高的proposal,将其从B中移除,加入到最终的proposal列表D中。(初始D为空)
- 现在将此提案与所有提案进行比较——计算此提案与所有其他提案的 IOU(并集交集)。如果IOU大于阈值N,则从B 中移除那个proposal
- 再次从B中剩余的proposals中取出置信度最高的proposal并将其从B中移除并添加到D
- 再次计算这个proposal与B中所有proposal的IOU,剔除IOU高于threshold的框
- 重复此过程,直到 B 中没有更多提案为止
这里所说的阈值只不过是 nms_threshold
.
cv2.dnn.NMSBoxes
函数中,nms_threshold
为非极大值抑制时使用的IOU阈值。
所以如果你有一个很大的值,你就会强制两个盒子有很高的重叠(通常情况并非如此)并且只有当它与另一个盒子的 IOU 超过 0.8 时才会被删除。由于通常没有太多重叠,因此不会删除框。减小这个值将更容易去除冗余检测
希望这是有道理的
您可以阅读有关非极大值抑制的更多信息here