一、基本原理
二、代码
1.计算IOU
代码如下(示例):
def compute_iou(box1:tuple,box2:tuple)->int:
"""
:param x1: box1的坐标
:param x2: box2的坐标
:return: 计算的交并比
"""
#计算两个框的面积
x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
#计算相交部分的坐标
iner_xmin=max(x1min,x2min)
iner_ymin=max(y1min,y2min)
iner_xmax=min(x1max,x2max)
iner_ymax=min(y1max,y2max)
iner_area=max((iner_xmax-iner_xmin+1)*(iner_ymax-iner_ymin+1),0)
box1_area=(x1max-x1min+1)*(y1max-y1min+1)
box2_area = (x2max-x2min + 1) * ( y2max-y2min+ 1)
iou=iner_area/(box1_area+box2_area-iner_area)
return iou
2.非极大值抑制
代码如下(示例):
def num(score:list,bounding_box:list,threshold:int):
"""
:param score: 预测的分数,列表形式
:param bounding_box: 每个预测框对应的坐标值:列表内的每个元素为预测框的坐标(左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标)
:return: 返回挑选后的score和bounding_box列表
"""
picked_score=[]
picked_boundingbox=[]
if len(bounding_box)==0:
return picked_score,picked_boundingbox
sortscore=[index for index,value in sorted(enumerate(score),key=lambda x:x[1])]
picked_score.append(score[sortscore[-1]])
picked_boundingbox.append(bounding_box[sortscore[-1]])
del score[sortscore[-1]]
del bounding_box[sortscore[-1]]
for i,box in enumerate(bounding_box):
iou=compute_iou(picked_boundingbox[0],box)
if iou>threshold:
picked_score.append(score[i])
picked_boundingbox.append(box)
return picked_score,picked_boundingbox
3.测试用例
bounding_boxes = [(600, 40, 437, 227), (510, 47, 305, 182), (561, 35, 418, 304)]
confidence_score = [0.9, 0.75, 0.8]
picked_score,picked_boundingbox=num(confidence_score,bounding_boxes,0.4)
print(picked_score,picked_boundingbox)
3.整体代码
def compute_iou(box1:tuple,box2:tuple)->int:
"""
:param x1: box1的坐标
:param x2: box2的坐标
:return: 计算的交并比
"""
#计算两个框的面积
x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
#计算相交部分的坐标
iner_xmin=max(x1min,x2min)
iner_ymin=max(y1min,y2min)
iner_xmax=min(x1max,x2max)
iner_ymax=min(y1max,y2max)
iner_area=max((iner_xmax-iner_xmin+1)*(iner_ymax-iner_ymin+1),0)
box1_area=(x1max-x1min+1)*(y1max-y1min+1)
box2_area = (x2max-x2min + 1) * ( y2max-y2min+ 1)
iou=iner_area/(box1_area+box2_area-iner_area)
return iou
def num(score:list,bounding_box:list,threshold:int):
"""
:param score: 预测的分数,列表形式
:param bounding_box: 每个预测框对应的坐标值:列表内的每个元素为预测框的坐标(左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标)
:return: 返回挑选后的score和bounding_box列表
"""
picked_score=[]
picked_boundingbox=[]
if len(bounding_box)==0:
return picked_score,picked_boundingbox
sortscore=[index for index,value in sorted(enumerate(score),key=lambda x:x[1])]
picked_score.append(score[sortscore[-1]])
picked_boundingbox.append(bounding_box[sortscore[-1]])
del score[sortscore[-1]]
del bounding_box[sortscore[-1]]
for i,box in enumerate(bounding_box):
iou=compute_iou(picked_boundingbox[0],box)
if iou>threshold:
picked_score.append(score[i])
picked_boundingbox.append(box)
return picked_score,picked_boundingbox
bounding_boxes = [(600, 40, 437, 227), (510, 47, 305, 182), (561, 35, 418, 304)]
confidence_score = [0.9, 0.75, 0.8]
picked_score,picked_boundingbox=num(confidence_score,bounding_boxes,0.4)
print(picked_score,picked_boundingbox)