lilanxiao / Rotated_IoU

Differentiable IoU of rotated bounding boxes using Pytorch
MIT License
415 stars 64 forks source link

A question about the code implementation #23

Closed zzybj closed 3 years ago

zzybj commented 3 years ago

您好,看您的代码实现的时候,下面这一段代码的原理没有明白,能麻烦您解释一下这样写的原理吗

def box1_in_box2(corners1: torch.Tensor, corners2: torch.Tensor): """check if corners of box1 lie in box2

Args:
    corners1 (torch.Tensor): (B, N, 4, 2)
    corners2 (torch.Tensor): (B, N, 4, 2)

Returns:
    c1_in_2: (B, N, 4) Bool
"""
a = corners2[:, :, 0:1, :]  # (B, N, 1, 2)
b = corners2[:, :, 1:2, :]  # (B, N, 1, 2)
d = corners2[:, :, 3:4, :]  # (B, N, 1, 2)
ab = b - a  # (B, N, 1, 2) the length of w or h
am = corners1 - a  # (B, N, 4, 2)
ad = d - a  # (B, N, 1, 2) the length of w or h
p_ab = torch.sum(ab * am, dim=-1)  # (B, N, 4)
norm_ab = torch.sum(ab * ab, dim=-1)  # (B, N, 1)
p_ad = torch.sum(ad * am, dim=-1)  # (B, N, 4)
norm_ad = torch.sum(ad * ad, dim=-1)  # (B, N, 1)
cond1 = (p_ab > 0) * (p_ab < norm_ab)  # (B, N, 4)
cond2 = (p_ad > 0) * (p_ad < norm_ad)  # (B, N, 4)
return cond1 * cond2
lilanxiao commented 3 years ago

这个function可以判断矩形1的四个角是否落在矩形2之内。

核心问题是判断单独一个点是不是落在一个矩形内。因为矩形的内角都是直角,只需要判断该点在矩形相邻两条边的投影是否落在线段内就可以。实现的时候使用了向量的内积。具体的讲解参考这里:https://math.stackexchange.com/questions/2157931/how-to-check-if-a-point-is-inside-a-square-2d-plane

剩下的事情就是用张量化的思想,让这个function可以并行计算BxN对矩形。

zzybj commented 3 years ago

这个function可以判断矩形1的四个角是否落在矩形2之内。

核心问题是判断单独一个点是不是落在一个矩形内。因为矩形的内角都是直角,只需要判断该点在矩形相邻两条边的投影是否落在线段内就可以。实现的时候使用了向量的内积。具体的讲解参考这里:https://math.stackexchange.com/questions/2157931/how-to-check-if-a-point-is-inside-a-square-2d-plane

剩下的事情就是用张量化的思想,让这个function可以并行计算BxN对矩形。

thank you