DeepGlint AI编程练习赛——匹配先验框(详解,python)

DeepGlint AI编程练习赛——匹配先验框(详解,python)
DeepGlint AI编程练习赛——匹配先验框(详解,python)_第1张图片
这道题就实在不好意思,居然只得了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))

最后,如果那个小伙伴,可以到达有达到满分的操作,一定记得私信哦。 万分感激

你可能感兴趣的:(python,算法)