适用于4D毫米波雷达的目标矩形框聚类

news/2024/5/20 7:54:08 标签: 聚类, 算法

目录

一、前言

二、点云聚类分割

三、基于方位搜索L型拟合

四、评价准则之面积最小化

五、评价准则之贴合最大化

六、评价准则之方差最小化


 

3da15d2e63e047c9a39ad39831be0075.png

一、前言

对于多线束雷达可以获取目标物体更全面的面貌,在道路中前向或角雷达可能无法获取目标车矩形框但可以扫到两边或者一边,在做目标方向估计时这些信息至关重要。看到一篇文章不错的思路,拿来记录借鉴下。

整体算法
Step1: 将距离点按照预先设定的距离阈值进行聚类划分簇
Step2:基于方位搜索+特定准则进行L型拟合,得出4边参数
2.1 矩形面积最小化
2.2 点到边靠近最大化
2.3 点到边方差最小化

二、点云聚类分割

对于所有点,在距离r一点内找到它的相邻点,将相邻点设置为未检测,对未检测点继续找到距离r内的任何一个点,把邻近点放在这个簇中直到集群不再增长。

afe7f40da3d2461b9b171fd9a93dd7cd.png

def _adoptive_range_segmentation(self, ox, oy):
        # Setup initial cluster
        segment_list = []
        for i, _ in enumerate(ox):
            c = set()
            r = self.R0 + self.Rd * np.linalg.norm([ox[i], oy[i]])
            for j, _ in enumerate(ox):
                d = np.hypot(ox[i] - ox[j], oy[i] - oy[j])
                if d <= r:
                    c.add(j)
            segment_list.append(c)
        # Merge cluster
        while True:
            no_change = True
            for (c1, c2) in list(itertools.permutations(range(len(segment_list)), 2)):
                if segment_list[c1] & segment_list[c2]:
                    segment_list[c1] = (segment_list[c1] | segment_list.pop(c2))
                    no_change = False
                    break
            if no_change:
                break
        return segment_list

 

三、基于方位搜索L型拟合

80db7156348e427c8728232643489652.png

dec3357dea4545cc8dba368502134009.png

step2:基于方位搜索的L 型拟合

遍历矩形的所有可能方向;在每次迭代中,可以找到一个该方向并包含所有扫描点的矩形;进一步可以得到所有点到矩形四条边的距离,并根据这些距离将点分为P和Q,并计算相应的平方误差作为(1)中的目标函数;在迭代所有方向并获得所有相应的平方误差后,寻找实现最小平方误差的最优方向,并根据该方向拟合矩形

22c4e7b4cc9e40dcacb79cd1621fee38.png

def _rectangle_search(self, x, y):


        xy = np.array([x, y]).T


        d_theta = np.deg2rad(self.d_theta_deg_for_search)
        min_cost = (-float('inf'), None)
        for theta in np.arange(0.0, np.pi / 2.0 - d_theta, d_theta):


            c = xy @ rot_mat_2d(theta)
            c1 = c[:, 0]
            c2 = c[:, 1]


            # Select criteria
            cost = 0.0
            if self.criteria == self.Criteria.AREA:
                cost = self._calc_area_criterion(c1, c2)
            elif self.criteria == self.Criteria.CLOSENESS:
                cost = self._calc_closeness_criterion(c1, c2)
            elif self.criteria == self.Criteria.VARIANCE:
                cost = self._calc_variance_criterion(c1, c2)


            if min_cost[0] < cost:
                min_cost = (cost, theta)


        # calc best rectangle
        sin_s = np.sin(min_cost[1])
        cos_s = np.cos(min_cost[1])


        c1_s = xy @ np.array([cos_s, sin_s]).T
        c2_s = xy @ np.array([-sin_s, cos_s]).T


        rect = RectangleData()
        rect.a[0] = cos_s
        rect.b[0] = sin_s
        rect.c[0] = min(c1_s)
        rect.a[1] = -sin_s
        rect.b[1] = cos_s
        rect.c[1] = min(c2_s)
        rect.a[2] = cos_s
        rect.b[2] = sin_s
        rect.c[2] = max(c1_s)
        rect.a[3] = -sin_s
        rect.b[3] = cos_s
        rect.c[3] = max(c2_s)


        return rect

 

四、评价准则之面积最小化

a1cfde486c4943778a0e82a655695eb8.png

def _calc_area_criterion(c1, c2):
        c1_max, c1_min, c2_max, c2_min = LShapeFitting._find_min_max(c1, c2)
        alpha = -(c1_max - c1_min) * (c2_max - c2_min)
        return alpha

 

五、评价准则之贴合最大化

f211f7c1262c4bf58064bb454ff0e3c4.png

def _calc_closeness_criterion(self, c1, c2):
        c1_max, c1_min, c2_max, c2_min = LShapeFitting._find_min_max(c1, c2)


        # Vectorization
        d1 = np.minimum(c1_max - c1, c1 - c1_min)
        d2 = np.minimum(c2_max - c2, c2 - c2_min)
        d = np.maximum(np.minimum(d1, d2), self.min_dist_of_closeness_criteria)
        beta = (1.0 / d).sum()


        return beta

六、评价准则之方差最小化

0d70e1efa8b144a7b8e136647ddb8ed3.png

def _calc_variance_criterion(c1, c2):
        c1_max, c1_min, c2_max, c2_min = LShapeFitting._find_min_max(c1, c2)


        # Vectorization
        d1 = np.minimum(c1_max - c1, c1 - c1_min)
        d2 = np.minimum(c2_max - c2, c2 - c2_min)
        e1 = d1[d1 < d2]
        e2 = d2[d1 >= d2]
        v1 = - np.var(e1) if len(e1) > 0 else 0.
        v2 = - np.var(e2) if len(e2) > 0 else 0.
        gamma = v1 + v2


        return gamma

 

Result:

1fb1bca4ecd647febd4ef8a1b9b25d69.png

 

 

 

参考:《Efficient L-Shape Fitting for Vehicle Detection Using Laser Scanners》

 

 

 

 


http://www.niftyadmin.cn/n/5168944.html

相关文章

Android修行手册 - POI操作Excel常用样式(字体,背景,颜色,Style)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

更安全的ssh协议与Gui图形化界面使用

目录 前言&#xff1a; 一.Gui图形化界面的使用 二.ssh协议 SSH的主要作用包括&#xff1a; 相比其他网络协议&#xff0c;SSH的优势包括&#xff1a; 三.idea集成Git 前言&#xff1a; 上一篇讲解了git的命令用法以及https协议&#xff0c;但是这个协议放在做团队项目的…

多级缓存之缓存同步

缓存数据同步的常见方式有三种&#xff1a; 设置有效期&#xff1a;给缓存设置有效期&#xff0c;到期后自动删除。再次查询时更新 优势&#xff1a;简单、方便缺点&#xff1a;时效性差&#xff0c;缓存过期之前可能不一致场景&#xff1a;更新频率较低&#xff0c;时效性要…

【GIT】Git中的Gui介绍,使用Git中的ssh协议介绍,使用使用idea集成Git

目录 一&#xff0c;Git中的Gui介绍&#xff0c;使用 二&#xff0c;Git中的ssh介绍&#xff0c;使用 三&#xff0c;使用idea集成Git 一&#xff0c;Git中的Gui介绍&#xff0c;使用 1.1什么是Gui&#xff1f; 图形化管理工具是一种通过可视化界面来操作计算机系统或应用程…

使用github copilot

现在的大模型的应用太广了&#xff0c;作为程序员我们当然野可以借助大模型来帮我们敲代码。 下面是自己注册使用github copilot的过程。 一、注册github copilot 1. 需要拥有github账号 &#xff0c;登录github之后&#xff0c;点右侧自己的头像位置&#xff0c;下面会出现…

深度学习之pytorch第一课

学习使用pytorch&#xff0c;然后进行简单的线性模型的训练与保存 学习代码如下&#xff1a; import numpy as np import torch import torch.nn as nn x_value [i for i in range(11)] x_train np.array(x_value,dtypenp.float32) print(x_train.shape) x_train x_train.r…

node插件MongoDB(四)—— 库mongoose 操作文档使用(新增、删除、更新、查看文档)(二)

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 三、修改文档…

Rust逆向学习 (4)

Reverse for Struct Rust中的结构体是一个重要的内容&#xff0c;由于Rust中没有类的概念&#xff0c;因此其他编程语言中的封装、继承、多态与Rust中的表现都有较大差异。 我们使用参考书中的一个示例开始进行分析。 Struct 初始化 struct User {username: String,email: …