DeepGlint AI编程练习赛——匹配先验框(详解,python)
这道题就实在不好意思,居然只得了55分,希望有小伙伴可以给指导下,我的头已经很大了。下面讲下我的做题思路吧。
看到匹配先验框,那就是两个box,找相交面积啊,这个不就是IOU吗? IOU(交并比)不知道是啥的小伙伴,度娘告诉你。
那就IOU吧
def box_solution(box1, box2):
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
s1 = (xmax1 - xmin1) * (ymax1 - ymin1)
s2 = (xmax2 - xmin2) * (ymax2 - ymin2)
xmin = max(xmin1, xmin2)
ymin = max(ymin1, ymin2)
xmax = min(xmax1, xmax2)
ymax = min(ymax1, ymax2)
w = max(0, xmax - xmin)
h = max(0, ymax - ymin)
area = w * h
iou = area / (s1 + s2 - area)
if iou > 0:
return True
else:
return False
小伙伴这里要注意了,输入值是Xmin, Ymin, Xmax, Ymax。
这个就不解释了哦。自己花两个框框就知道怎么回事了。
这个拿到了,那就通过阵列得到不出幕布的先验框吧!
def P_box(w, h, s, t, P, Q):
P_boxs = {}
x = 0
y = 0
while x + w <= P:
y_t = 0
while y_t + h <= Q:
P_boxs[y] = [x, y_t, x + w, y_t + h]
y += 1
y_t += t
x += s
return P_boxs
```**记得这里要变换P_boxs内的每个框框的值。**
那接下来就把T_boxs也拿到吧,捎带把所有的数据拿到手吧。
def get_inputs():
w, h, s, t, k, P, Q = list(map(int, input().strip().split()))
T_boxs = {}
for i in range(k):
X, Y, W, H = list(map(int, input().strip().split()))
T_boxs[i] = [X, Y, X + W, Y + H]
return w, h, s, t, P, Q, T_boxs, k
``
那最后就剩比较框框了,两个for循环搞定。
def count_c(P_boxs, T_boxs, k):
count = 0
for j in range(len(P_boxs.keys())):
for i in range(k):
if box_solution(P_boxs[j], T_boxs[i]):
count += 1
break
return count
最后上全部代码
def box_solution(box1, box2):
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
s1 = (xmax1 - xmin1) * (ymax1 - ymin1)
s2 = (xmax2 - xmin2) * (ymax2 - ymin2)
xmin = max(xmin1, xmin2)
ymin = max(ymin1, ymin2)
xmax = min(xmax1, xmax2)
ymax = min(ymax1, ymax2)
w = max(0, xmax - xmin)
h = max(0, ymax - ymin)
area = w * h
iou = area / (s1 + s2 - area)
if iou > 0:
return True
else:
return False
def P_box(w, h, s, t, P, Q):
P_boxs = {}
x = 0
y = 0
while x + w <= P:
y_t = 0
while y_t + h <= Q:
P_boxs[y] = [x, y_t, x + w, y_t + h]
y += 1
y_t += t
x += s
return P_boxs
def get_inputs():
w, h, s, t, k, P, Q = list(map(int, input().strip().split()))
T_boxs = {}
for i in range(k):
X, Y, W, H = list(map(int, input().strip().split()))
T_boxs[i] = [X, Y, X + W, Y + H]
return w, h, s, t, P, Q, T_boxs, k
def count_c(P_boxs, T_boxs, k):
count = 0
for j in range(len(P_boxs.keys())):
for i in range(k):
if box_solution(P_boxs[j], T_boxs[i]):
count += 1
break
return count
w, h, s, t, P, Q, dets, k = get_inputs()
anchors = P_box(w, h, s, t, P, Q)
print(count_c(anchors, dets, k))
最后,如果那个小伙伴,可以到达有达到满分的操作,一定记得私信哦。 万分感激