温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么使用python在2D中计算多边形IoU

发布时间:2022-02-23 10:33:47 来源:亿速云 阅读:202 作者:iii 栏目:开发技术

这篇文章主要介绍了怎么使用python在2D中计算多边形IoU的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用python在2D中计算多边形IoU文章都会有所收获,下面我们一起来看看吧。

  1. 假设每个多边形的点是顺时针在圆圈中排列的。如果我们发现签名区域为负值,我们可以通过增加角度 w.r.t x 轴或倒车点来确保这一点。

  2. 将两个多边形的点合并到单个列表中,跟踪每个点属于哪个多边形。我们还需要能够确定每个点在原始多边形中的上一点和下一点。L

  3. 通过增加角度来排序w.r.t x轴。L

  4. 如果输入多边形相交,则从一个多边形到另一个多边形的过渡次数将大于两个。L

  5. 遍历。如果连续点属于不同的多边形,则第一点与其下一点和第二点之间的线的交叉点及其前一点将属于两个多边形之间的交点。L

  6. 将步骤 4 中确定的每个点添加到新的多边形中。将按顺序遇到积分。II

  7. 每个多边形的面积之和将等于其联盟加上交叉口的区域,因为这将计算两次。

  8. 因此,将的价值由两个多边形的面积之和减去面积之和来表示。IoUII

唯一需要的几何形状是使用Shoelace 公式计算简单多边形的面积,并确定步骤 5 所需的两条线段之间的交汇点。

这里有一些Java代码(Ideone)来说明 - 你也许可以使它在Python更紧凑。

double[][] coords = {{-0.708, 0.707, 0.309, -0.951, 0.587, -0.809},
                       {1, 0, 0, 1, -1, 0, 0, -1, 0.708, -0.708}};

double areaSum = 0;
List<CPoint> pts = new ArrayList<>();
for(int p=0; p<coords.length; p++)
{
    List<CPoint> poly = new ArrayList<>();
    for(int j=0; j<coords[p].length; j+=2)
    {
        poly.add(new CPoint(p, coords[p][j], coords[p][j+1]));
    }
    
    double area = area(poly);
    if(area < 0)
    {
        area = -area;
        Collections.reverse(poly);
    }
    areaSum += area;
    
    pts.addAll(poly);

    int n = poly.size();
    for(int i=0, j=n-1; i<n; j=i++)
    {
        poly.get(i).prev = poly.get(j);
        poly.get(j).next = poly.get(i);             
    }
}       
        
pts.sort((a, b) -> Double.compare(a.theta, b.theta));
        
List<Point2D> intersections = new ArrayList<>();
int n = pts.size();
for(int i=0, j=n-1; i<n; j=i++)
{
    if(pts.get(j).id != pts.get(i).id)
    {
        intersections.add(intersect(pts.get(j), pts.get(j).next, pts.get(i).prev, pts.get(i)));
    }
}

double areaInt = area(intersections);
double iou = areaInt/(areaSum - areaInt);
System.out.println(iou);

输出:

0.12403616470027268

和支持代码:

static class CPoint extends Point2D.Double
{
    int id;
    double theta;
    CPoint prev, next;
    
    public CPoint(int id, double x, double y)
    {
        super(x, y);
        this.id = id;
        theta = Math.atan2(y, x);
        if(theta < 0) theta = 2*Math.PI + theta;
    }
}   

static double area(List<? extends Point2D> poly)
{
    double area = 0;
    for(int i=0, j=poly.size()-1; i<poly.size(); j=i++)
        area += (poly.get(j).getX() * poly.get(i).getY()) - (poly.get(i).getX() * poly.get(j).getY());
    return Math.abs(area)/2;
}

// https://rosettacode.org/wiki/Find_the_intersection_of_two_lines#Java
static Point2D intersect(Point2D p1, Point2D p2, Point2D p3, Point2D p4)
{
  double a1 = p2.getY() - p1.getY();
  double b1 = p1.getX() - p2.getX();
  double c1 = a1 * p1.getX() + b1 * p1.getY();

  double a2 = p4.getY() - p3.getY();
  double b2 = p3.getX() - p4.getX();
  double c2 = a2 * p3.getX() + b2 * p3.getY();

关于“怎么使用python在2D中计算多边形IoU”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么使用python在2D中计算多边形IoU”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI