# Point_project **Repository Path**: hanxiaoyang1/point_project ## Basic Information - **Project Name**: Point_project - **Description**: SRTP2021USTB - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-16 - **Last Updated**: 2022-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **1.KNN** 在Pointnet中对于邻居粒子点的提取,因为点的数量不多因此对于资源的使用可以接受。但在流体中粒子数量很大,动辄1,000,000个粒子,因此改造库函数是必要的。 - 源代码未对KNN使用cuda编程,需先进行KNN的cuda编程。 - 测试该CUDA-KNN能支持多少个粒子计算 - 改写CUDA-KNN,可使用分权制衡的思路,使算法对粒子数没有上限要求。 **2.球面查找** 在pointnet中对于粒子的取舍有时不符合流体方面的要求。以其中一个点为例,找其球面距离内的粒子,pointnet2中定义邻居粒子数为64。 **2.1** 如果邻居粒子数不满足64,则需要对分配的剩余内存空间补0。但是在“坐标域”中,0不是没有意义的意思,而是的确存在的坐标。因此需要把“位置”补一个离中心粒子足够远的位置,比如5倍的球面半径外。 **2.2** 如果邻居粒子数多于64,则随机选择先找到的64个粒子。而在流体中,离得更近的点的作用是更大的,因此原代码不能满足流体方面。经过考察,决定需要取最近邻的64个点。 **3.球面查找嵌入网络** 接续2,但是不再补全64个邻居粒子,而是在cuda每个线程(对应每个粒子)中针对不同数量的邻居粒子进行MLP操作,每个线程最终经过SUM操作得到[1, 512]的特征,输出到cpu。 符合新要求的球面查找算法实现在`./tf_grouping`文件夹。暂时没有进行排序的方式进行计算也就是2.2 需要进行tensorflow2的下载。我使用的是2.6的版本 下载链接见官网。 相应的编译bash脚本也有更新,编译完成后产生`out.so`文件 调用方式与初步测试见`./tf_grouping/test.py` block内没有做多线程。 可以考虑针对一个粒子周围的粒子采用多线程计算距离,最后进行一个同步然后再计算排序。 但这样做的弊端就是需要在gpu内开辟数组,(同之前的KNN一样,受总粒子数影响,大小未知)。 ### KNN改进的测试 ,单位(s) | 计算次数 | 原KNN | 改进KNN | | -------- | ------------------- | --------------------- | | 10 | 0.14142203330993652 | 0.0033354759216308594 | | 100 | 1.1393418312072754 | 0.008875608444213867 | | 1000 | 10.760242938995361 | 0.08214497566223145 | | 10000 | 106.03392553329468 | 0.625659704208374 | 输入变量大小:(64,512,3) (64,128,3)