1.å¦ä½å©ç¨python使ç¨libsvm
2.DETR3D模型源码导读 & MMDetection3D构建流程
3.Python 重采样遥感数据 Pyresample (一)
4.3d稀疏卷积——spconv源码剖析(三)
å¦ä½å©ç¨python使ç¨libsvm
åå¤å·¥å ·libsvm软件å ï¼
çµèï¼
æ¥éª¤æä½
æå 解åå¨Cçä¹ä¸ï¼å¦ï¼C:\libsvm-3.ï¼
ç¨libsvmèªå¸¦çèæ¬grid.pyåeasy.py,源码éè¦å»å®ç½ä¸è½½ç»å¾å·¥å ·gnuplot,解åå°cçï¼
è¿å ¥c:\libsvm\toolsç®å½ä¸ï¼ç¨ææ¬ç¼è¾å¨ï¼è®°äºæ¬ï¼edité½å¯ä»¥ï¼ä¿®æ¹grid.pyåeasy.py两个æ件ï¼æ¾å°å ¶ä¸å ³äºgnuplotè·¯å¾çé£é¡¹ï¼æ ¹æ®å®é è·¯å¾è¿è¡ä¿®æ¹ï¼å¹¶ä¿åï¼
ä¾å举ä¾
常ç¨æ¥å£
æé«é¢æµçåç¡®ç
DETR3D模型源码导读 & MMDetection3D构建流程
本文主要梳理了学习理解DETR3D模型源码与MMDetection3D构建流程的过程。首先,源码介绍model dict的源码配置与模型参数设置,指出在模型部分按照backbone、源码neck、源码head顺序定义,源码证书查询系统php源码体现模型结构。源码
MMDetection3D在模型构建中利用类之间的源码包含关系递归实例化组件。在构建模型后,源码借助于registry机制实例化每一个组件,源码展现其层次性与模块化设计。源码
在初始化流程中,源码首先在train.py的源码build_model开始,通过调用build方法逐级初始化各子结构,源码直至最底层结构,源码遵循初始化顺序:Detr3D -> backbone -> neck -> head -> head_transformer -> head_transformer_decoder -> 最终组件。其中,app源码小项目许多类继承自官方提供的框架结构,通过super()调用在父类中实现子结构初始化。
关于DETR3D的组件,backbone、neck、head分别负责特征提取、融合、和目标检测的关键阶段。Detr3DHead继承自mmdet3d的DetrHead类,是模型的头部组件,实现特定检测任务。
DETR3DTransformer位于模型底层,是实现论文创新点的关键部分。其通过传感器转换矩阵预测reference points,并将投影到特征图,结合Bilinear Interpolation抓取固定区域特征,卡片瀑布流源码通过object queries refinement改善queries,用于目标预测。这一部分负责查询、特征捕捉与优化。
Decoder是DETR3D的核心,专注于实现object queries refinement。这一过程在论文中被详细探讨,并在代码中得到具体实现。值得注意的是,F.grid_sample()在特征处理过程中扮演着关键角色,展示其在变换与映射任务中的应用。
Python 重采样遥感数据 Pyresample (一)
处理宽幅扫描遥感卫星数据时,如Sentinel-5、Ecostress和Modis等L1级或更低级别的数据,传统的影像重采样工具往往显得力不从心。GDAL虽然提供了将非规则化数据转换为规则化栅格的语音对话软件源码功能,但面对大规模数据时,其内存和CPU消耗问题令人头疼。在尝试过失败的编程实践后,Pyresample作为解决方案崭露头角。它依托于先进的kd-tree算法和Xarray、Dask等并行计算技术,尤其在应对大规模、非规则遥感数据重采样时表现出色。
Pyresample是一款专为地理空间影像数据重采样设计的Python包,是SatPy库的核心组件,也可独立使用。重采样是将位置数据点转化为目标投影和区域的过程。它支持栅格数据和经纬度采样数据,使用AreaDefinition和SwathDefinition等不同的“geometry”对象进行描述。
Pyresample提供多种重采样算法,如最近邻和双线性插值,柯林wap源码采用由pykdtree库支持的快速KDTree算法。它支持numpy数组和numpy掩码数组,以及XArray对象(包括对dask数组的支持),并辅以Cartopy进行数据可视化。从版本1.开始,Pyresample不再支持Python 2和Python 3.4以下版本。
要使用Pyresample,需要安装pyproj、numpy(版本1.以上)、pyyaml、configobj和pykdtree(版本1.1.1以上)。为了使用绘图功能,还需安装Cartopy和matplotlib(版本1.0以上)。若需dask和xarray支持,还需额外安装相关库。测试Pyresample时,所有可选包(如rasterio、dask等)需已安装。
安装方法包括pip从PyPI获取、conda通过conda-forge通道安装或直接从源码安装。开发模式安装可通过`pip install -e .`命令进行。Pykdtree的多线程支持可通过环境变量控制,而numexpr会优化处理性能。
在Pyresample中,`pyresample.geometry`模块包含了描述不同地理区域的类,如AreaDefinition(用于均匀间隔像素的区域)和SwathDefinition(处理非均匀像素的区域)。创建AreaDefinition对象时,需要指定投影方法或EPSG代码,而GridDefinition则适合已知像素经纬度值的场景。所有几何定义对象都提供访问像素坐标的方法,如get_lonlats()获取经纬度数据。
总的来说,Pyresample是处理大规模、非规则遥感数据重采样的高效工具,它通过优化算法和并行计算技术,简化了遥感数据分析过程。
3d稀疏卷积——spconv源码剖析(三)
构建Rulebook
下面看ops.get_indice_pairs,位于:spconv/ops.py
构建Rulebook由ops.get_indice_pairs接口完成
get_indice_pairs函数具体实现:
主要就是完成了一些参数的校验和预处理。首先,对于3d普通稀疏卷积,根据输入shape大小,kernel size,stride等参数计算出输出输出shape,子流行稀疏卷积就不必计算了,输出shape和输入shape一样大小
准备好参数之后就进入最核心的get_indice_pairs函数。因为spconv通过torch.ops.load_library加载.so文件注册,所以这里通torch.ops.spconv.get_indice_pairs这种方式来调用该函数。
算子注册:在src/spconv/all.cc文件中通过Pytorch提供的OP Register(算子注册的方式)对底层c++ api进行了注册,可以python接口形式调用c++算子
同C++ extension方式一样,OP Register也是Pytorch提供的一种底层扩展算子注册的方式。注册的算子可以通过 torch.xxx或者 tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。
构建Rulebook实际通过python接口get_indice_pairs调用src/spconv/spconv_ops.cc文件种的getIndicePairs函数
代码位于:src/spconv/spconv_ops.cc
分析getIndicePairs直接将重心锁定在GPU逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,优先子流行3d稀疏卷积。
代码中最重要的3个变量分别为:indicePairs,indiceNum和gridOut,其建立过程如下:
indicePairs代表了稀疏卷积输入输出的映射规则,即Input Hash Table 和 Output Hash Table。这里分配理论最大的内存,它的shape为{ 2,kernelVolume,numAct},2表示输入和输出两个方向,kernelVolume为卷积核的volume size。例如一个3x3x3的卷积核,其volume size就是(3*3*3)。numAct表示输入有效(active)特征的数量。indiceNum用于保存卷积核每一个位置上的总的计算的次数,indiceNum对应中的count
代码中关于gpu建立rulebook调用create_submconv_indice_pair_cuda函数来完成,下面具体分析下create_submconv_indice_pair_cuda函数
子流线稀疏卷积
子流线稀疏卷积是调用create_submconv_indice_pair_cuda函数来构建rulebook
在create_submconv_indice_pair_cuda大可不必深究以下动态分发机制的运行原理。
直接将重心锁定在核函数:
prepareSubMGridKernel核函数中grid_size和block_size实则都是用的整形变量。其中block_size为tv::cuda::CUDA_NUM_THREADS,在include/tensorview/cuda_utils.h文件中定义,大小为。而grid_size大小通过tv::cuda::getBlocks(numActIn)计算得到,其中numActIn表示有效(active)输入数据的数量。
prepareSubMGridKernel作用:建立输出张量坐标(通过index表示)到输出序号之间的一张哈希表
见:include/spconv/indice.cu.h
这里计算index换了一种模板加递归的写法,看起来比较复杂而已。令:new_indicesIn = indicesIn.data(),可以推导得出index为:
ArrayIndexRowMajor位于include/tensorview/tensorview.h,其递归调用写法如下:
接着看核函数getSubMIndicePairsKernel3:
位于:include/spconv/indice.cu.h
看:
上述写法类似我们函数中常见的循环的写法,具体可以查看include/tensorview/kernel_utils.h
NumILP按默认值等于1的话,其stride也是gridDim.x*blockDim.x。索引最大值要小于该线程块的线程上限索引blockDim.x * gridDim.x,功能与下面代码类似:
参考: blog.csdn.net/ChuiGeDaQ...