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

这篇博客介绍了如何使用Python实现匹配先验框的算法,主要涉及IOU(交并比)的计算,并提供了创建先验框和目标框的函数。博主分享了代码实现过程,包括获取输入、计算IOU以及遍历比较所有框,但表示自己的解决方案在比赛中只获得了55分,期待读者提供优化建议。

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

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

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值