自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 pytorch dataloader 中collate_fn是什么

collate_fn(collate function)是在 PyTorch 中 DataLoader 中使用的一个参数,用于自定义数据加载和批处理的方式。在训练神经网络时,通常会将数据划分成小批量进行处理,collate_fn 就是用来指定如何将单个样本组合成小批量的。collate_fn 接受一个批量的样本列表作为输入,并将它们组合成一个批量的数据。在自定义 collate_fn 时,可以根据数据的不同特点和需求,灵活地进行处理。以下是一个简单的示例,说明了如何定义一个 collate_fn:im

2024-02-08 18:05:22 1115 1

原创 点云transformer算法: FlatFormer 论文阅读笔记

由于普通的MHSA核心无法有效支持可变序列长度,SST将大小相似的窗口分批处理,并在每批中将所有窗口填充到批中的最大组大小(即填充到相同的长度)。更糟糕的是,将点分配到相等的窗口还引入了显著的延迟开销:在Waymo上,每个场景需要18毫秒,甚至比CenterPoint模型的总运行时间还要慢。例如,在VoTr模型中,为Waymo上的单个场景准备邻居的步骤需要22毫秒(即总运行时间的36%),这已经比整个CenterPoint模型更慢。K2*D),N是点数,D是每个点的特征通道数,K是一个点附近点点数。

2024-02-05 14:15:37 1820

原创 openpcdet中的优化器

优化器用于对梯度、学习率等进行调整下面来看每个配置的具体作用和含义:按照配置的功能,可以分为以下几组:首先是和BATCH_SIZE_PER_GPU: 4 # 表示每个GPU上一次迭代的batch size 是4NUM_EPOCHS: 10 # 表示一共训练40个epoch然后是OPTIMIZER: adam_onecycle # 表示使用的优化器是adam_onecycle。

2024-02-05 10:58:20 814

原创 【Apollo CyberRT】源码分析之 “component” 模块

与组件类不同,定时组件类在 Initialize() 中没有创建任何的 Reader 读者,也没有搞出调度器、协程工厂、创建任务等一系列复杂的操作,任务全部交给时间轮处理。Component类是各个组件的基类实现,组件类似与ros里的node,每个算法模块都可以自己实现为一个Component的基类,从而加入到CyberRT的框架中。定时调度模块没有绑定消息收发,需要用户自己创建reader来读取消息,如果需要读取多个消息,可以创建多个reader。定时组件类与组件类有所不同,它比组件类多了定时器。

2024-01-28 22:06:51 842

原创 C++中, barrier的使用

在 C++20 中引入了类(C++17中是),它是一种同步原语,用于在线程间同步和协调。可以在一组线程中设置一个栅栏(barrier),使得这些线程在执行到栅栏之前必须等待所有其他线程都到达栅栏,然后一起继续执行。这种行为对于一些并行算法或任务分解中的同步非常有用。以下是在这个示例中,我们首先创建了一个对象bar,并指定了需要等待的线程数量。然后,我们创建了多个线程,并将bar的地址作为参数传递给每个线程的线程函数。在线程函数中,每个线程都会执行一些任务,并在执行完任务后调用函数等待其他线程到达栅栏。

2024-01-28 21:17:24 538

原创 C++中,latch的使用

特别适用于那些需要等待多个事务完成后才能继续执行的场景,比如并行算法的不同部分需要在继续之前同步完成状态,或者在启动时,程序需要等待多个资源加载完成后才能继续。),它提供了一个同步原语,使得一组线程可以等待直到某个事件被一定数量的线程观察到后才能继续执行。这是通过一个计数器来实现的,该计数器在。在这个例子中,主线程创建并启动了5个工作线程,每个工作线程在完成其任务后都会通过。的计数减至0,这时它继续执行。是单次使用的,一旦计数器达到0,就不能再重置计数器的值。会将计数器减1,直到计数器为0,此时所有调用。

2024-01-28 20:57:18 436

原创 C++中,函数签名是什么意思?

C++编译器通常会对函数名称进行修饰(或称之为名称改编或名称混淆),以包含更多有关函数的信息,如函数参数类型等,这是因为C++支持函数重载与多态。在C++中,函数签名是用来唯一标识函数的一组属性。函数签名允许编译器在函数重载的情况下正确识别和调用相应的函数。在函数重载时,编译器使用函数签名来判断哪一个函数被调用;如果两个函数除了返回类型外其他都相同,编译器会报错,因为它不能仅凭返回类型来区分这两个函数。以上就是关于C++中函数签名的概念以及其在函数重载和区分中的作用。当函数是类的成员函数时,

2024-01-28 18:19:19 431

原创 Linux进程间通信方法和代码示例

Linux进程间通信(IPC, Inter-Process Communication)包括了多种不同的技术,例如管道(pipe)、信号(signal)、共享内存(shared memory)、消息队列(message queues)、信号量(semaphores)以及套接字(sockets)等。管道是最基本的IPC机制之一,这里指匿名管道,允许一个进程和另一个进程之间的单向数据流。套接字允许在同一台计算机上的进程或不同计算机上的进程之间进行通信。共享内存允许两个或两个以上的进程共享一个给定的存储区。

2024-01-28 17:54:23 327

原创 std::shared_mutex的概念及其使用示例

是C++17引入的一种同步原语,用于提升在多线程环境下对共享资源的访问效率。与传统的互斥锁(如std::mutex)不同,允许多个线程以只读模式共享对资源的访问,但写入操作必须独占资源,防止同时有其他线程对共享资源进行读取或写入。这允许了更高的并行性,特别适用于读操作远多于写操作的场景。

2024-01-28 09:46:51 472

原创 为什么在使用类成员函数指针时,需要 &Myclass::myfunc ,而不是直接 Myclass::myfunc

成员函数指针类型可以用来声明变量,指向相应的成员函数,并且可以通过变量来调用相应的成员函数。需要注意的是,使用成员函数指针时,需要提供一个对象来调用相应的成员函数。成员函数指针类型的语法比较复杂,它包含了类的类型信息,以及函数的参数列表和返回类型等信息。我们知道一个函数的函数名就是这个函数的地址,那么我们使用类成员函数的地址时,为什么还要在前面加上取地址符号。传递成员函数时,需要使用对象的引用或指针,并且在成员函数前面加上 & 符号以获取成员函数的地址。的类,拥有一个成员函数。是成员函数的返回类型,

2024-01-27 22:40:28 341

原创 通过手撕std::ref来了解其工作原理

函数的原理基本相同:它们都是接受一个引用并返回一个包装了该引用的对象。通过包装引用,我们可以将一个对象传递给函数对象或函数时,使函数对象或函数能够修改对象的值,而不是修改其副本。,用于保存传入的引用。它有一个构造函数,接受一个引用并保存它。它还重载了解引用运算符和成员访问运算符,使得。的原理可以通过一个简单的模板类来实现。对象,它接受一个引用并返回一个包装了该引用的。对象可以像引用一样被使用。类模板包含一个成员指针。假设有变量int a;, 而不是 int&

2024-01-27 22:17:05 363

原创 通过手撕std::bind来了解其工作原理

是 C++11 中的一个函数模板,用于创建一个可调用对象(函数对象或者函数指针)的绑定副本,其中一部分参数被固定为指定值,从而生成一个新的可调用对象。绑定副本可以作为一个新的可调用对象,可以直接调用,也可以传递给其他接受可调用对象的函数,从而实现部分参数固定的函数调用。时,会生成一个新的可调用对象,其中一部分参数被绑定为指定值,剩余的参数保留为占位符(placeholder)。在调用绑定副本时,传递给绑定副本的参数会替换掉占位符,从而形成最终的参数列表,并调用原始函数或函数对象。生成了一个新的可调用对象。

2024-01-27 21:45:06 520

原创 taskflow 源码阅读笔记-1

本文是commitid: b91df2c365c20fa4cb43951192f6939fbe876abf 版本的源码学习记录,其他版本可能会有不同简介可以参考代码仓库的README。

2024-01-26 22:42:40 1446

原创 C++实现并行和异步任务,DAG流水线的开源库-Taskflow

它提供了一个灵活而高效的框架,使得开发者能够方便地定义和执行任务流程,利用多核处理器的并行性能。Taskflow 支持任务之间的有向无环图(DAG)结构,通过图中的节点和边来表示任务和它们之间的依赖关系。这使得任务之间的关系更加清晰,有助于提高代码的可读性和维护性。以上代码创建了一个包含两个简单任务的任务流程图,并定义了任务之间的依赖关系。Taskflow 提供了一个强大而灵活的工具,适用于需要高效处理并行和异步任务的 C++ 项目。适用于有复杂任务依赖关系的场景,通过任务流程图清晰地表示任务之间的关系。

2024-01-26 22:23:35 552

原创 关于视觉3d目标检测学习像素深度的一点理解

但是,在像素坐标系上的像素,由于相机的原理,导致它的深度信息已经没有了,所以原理上是没法得到其真实深度的(即3d位置)在真实世界的一个物体,可以通过相机矩阵将其投影到像素坐标系上。那么现在的深度学习方法又为什么能预测出物体的深度呢?

2024-01-24 20:48:41 743

原创 C++原子变量及内存模型

C++中的原子变量通过原子操作提供了一种管理并发访问的机制,它是在C++11及以后的标准中引入的。这些操作确保了当多个线程尝试同时更新同一个变量时,该变量的行为是可预测和一致的。

2024-01-20 16:29:50 411

原创 面试题-操作系统中进程的状态有哪些

在操作系统中,进程是一个执行中程序的实例。操作系统为了管理多个进程,通常会为每个进程维护一个状态。当进程刚刚创建时,它处于新建状态。在这个阶段,操作系统对进程进行初始化,为其分配所需的资源和内存空间。进程已经准备好开始执行,但由于正在使用CPU的其他进程,它暂时不能执行。处于就绪状态的进程会被放入就绪队列,等待分配CPU时间。进程获得CPU时间,开始执行其指令。一个时间片结束或者由于其它原因需要让出CPU时,进程会离开运行状态。

2024-01-18 11:10:15 369

原创 理解pytorch系列:contiguous是怎么实现的

这涉及到复制数据到新的内存区域,并返回一个新的张量,该张量在内存中实际是连续的。在内存中连续排列的张量有一个特性:对于张量中任意两个相邻的元素,它们在物理内存中的位置也是相邻的。换句话说,张量在物理存储上的排列顺序与在张量形式上的逻辑排列顺序一致。这些操作通常返回一个张量的视图,它们改变的是数据访问的方式,而不是实际的数据存储方式。方法来创建当前张量数据的副本,然后返回连续排列的新张量。这个副本操作包含显式的内存复制,从原来的张量到一个新连续排列的内存块。方法的作用是确保张量在内存中是连续存储的。

2024-01-18 11:01:43 683 1

原创 理解pytorch系列:transpose是怎么实现的

实现这一点的关键在于不实际移动数据,而是通过改变张量的元数据(包括步长(stride)和尺寸(size))来达到效果。在PyTorch的底层C++实现中,同样接口会调用ATen库(张量操作库,是PyTorch的核心)中的对应函数,ATen函数会修改张量对象所关联的元数据以实现。这种"懒惰"操作提高了性能,特别是对于大型张量,因为它避免了不必要的数据拷贝。时,交换了两个维度的步长。在行优先存储的张量中,行的步长通常比列的步长大。元数据,使得原本第一个维度(行)的大小与第二个维度(列)的大小交换。

2024-01-18 10:56:58 639

原创 理解pytorch系列:整型索引是怎么实现的

在PyTorch中使用整型索引时,需要遵循一些基本规则来确定如何从原始张量中选择数据。整型索引可以是Python中的列表或者数组、NumPy数组,或者是PyTorch的LongTensor。整型索引允许在任何维度上进行复杂的数据选取操作,例如选择特定的行、列或者任意的元素。:如果你对一个维度使用整型索引(比如通过传递一个整数列表),你将根据列表中的每个整数值得到被索引维度上对应的切片。索引列表中的每个整数指定要选择的数据在该维度上的位置。

2024-01-18 10:38:42 565

原创 理解pytorch系列:布尔索引是怎么实现的

在更底层的实现中,PyTorch会使用它的C++后端来提高这个过程的效率,通常是通过直接在内存中对张量数据进行操作实现。在一些情况下,你可能需要确保布尔索引张量的维度与被索引张量的某些维度要完全匹配,以避免出现错误。在PyTorch中,布尔索引是使用布尔类型的张量来选择元素的一种方式。布尔索引在PyTorch中使用时,并不要求布尔索引的张量与被索引的张量维度完全一致,但它们需要满足广播(broadcasting)规则。的值,它会选择原来张量相对应位置的元素,并将选中的元素组成一个新的Tensor返回。

2024-01-18 10:18:42 702

原创 C++版BatchNormalization的实现

注意,这个实现简化了多维特征和多个数据点情况。在实践中,你可能需要考虑多维特征的情况,调整代码来执行矩阵操作(并可能使用库如Eigen或者直接使用深度学习框架如PyTorch、TensorFlow或oneDNN的C++接口)。为了进行反向传播,你还需要实现Batch Normalization的梯度计算。这就需要额外的导数计算,以便对。参数进行更新,通常和优化算法(如SGD、Adam等)配合使用。是一个平铺的向量,代表了一批特征值,参数,这需要通过反向传播算法完成。是学习到的放缩和偏移参数,

2024-01-18 09:32:47 359

原创 面试题-手撕稳定版softmax

软件开发中,实现一个稳定版本的softmax函数,需要考虑数值稳定性的问题。由于指数运算可能会产生非常大的值,导致计算不稳定,因此需要使用一些技巧来处理。这段代码中,我们首先找到输入向量中的最大值,并在计算指数时减去该最大值,以减少指数的大小。然后计算每个元素的指数值,并将其存储在结果向量中。最后,将每个指数值除以总和,得到最终的稳定版softmax结果。这样实现的稳定版本softmax函数考虑了数值稳定性的问题,避免了指数运算可能带来的数值不稳定性,是在实际应用中常用的处理方式。

2024-01-18 09:22:27 464

原创 面试题-回溯算法解法模板

【代码】面试题-回溯算法解法模板。

2024-01-12 23:02:01 674

原创 Cylinder3D论文阅读

● 目前用于自动驾驶场景的最好的点云分割算法常见的做法是将3D点云投射到2D空间,从而使用2D卷积进行处理,但是这种做法会损失掉一些3D信息。● 三维体素化和三维卷积网络在室外点云中获得的改进相当有限。● 究其原因是:sparsity and varying density,即室外开发环境的点云的稀疏性和密度不均匀性● 提出了一种新的框架,用于室外激光雷达点云分割作者怎么做的(how):● 圆柱形分区(3D cylindrical partition)

2024-01-11 21:50:08 1190

原创 pytorch导出onnx时遇到不支持的算子怎么解决

然后再自己实现custom_domain::customOp2这个算子,如果用TensorRT,就需要自己实现一个插件。

2024-01-10 21:24:29 754

原创 c++ std::move()到底干了什么

实际上,std::move() 并不执行任何实际的操作,它只是一个简单的类型转换工具,用于告诉编译器将一个对象视为右值,以便在移动语义的上下文中使用。通过使用 std::move(),你可以在某些情况下提高程序的性能,例如在移动语义可用的情况下,显式地调用移动构造函数或移动赋值运算符。std::move() 是 C++ 中一个很有用的函数,它用于将传递给它的对象转换为右值引用。std::move()的实现非常简单,它实际上只是将传递给它的对象强制转换为对应的右值引用。

2024-01-09 21:03:35 1079 2

原创 面试题-手撕NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS)是一种常用于目标检测和计算机视觉中的算法,用于去除重叠的边界框,保留最可能是真实目标的边界框。其核心就是对一组检测框,找出其中属于同一个类别且分数最高的那个框,然后把和这个框的IOU值大于阈值的那些框都删掉。

2024-01-09 20:51:36 551

原创 rosbag 源码阅读笔记-1

这篇文字想通过在自己的机器上查找rosbag的源码在哪里(而不是通过google搜索),来和大家分享一些ros和python的常用命令,了解一下rosbag的调用过程。

2024-01-07 21:07:14 1123

原创 [飞书 + 服务器] 怎么在服务器开机时给飞书群推送提示消息

有时候训练服务器会发生一些异常、或者人为的重启,导致训练中断,如果能及时推送消息,就可以及时发现,对于个人开发或者小公司,没有专业运维的情况下,还是挺有用的。

2024-01-07 13:37:11 376

原创 C++性能优化- perf 和火焰图的安装使用

工欲善其事必先利其器,要想做Linux下的程序性能优化,就得先知道当前性能的瓶颈在哪里。这里主要介绍一下常用的工具:perf工具和火焰图的使用方法本文中的命令都是自己在Ubuntu18.04系统上测试可用的,在其他系统可能会需要不同的版本,但是方法都是一致的。先简单介绍一下perf工具和火焰图:Linux的perf工具是一个性能分析工具,用于收集系统的性能数据。它可以提供对CPU使用情况、内存操作、磁盘 I/O、软件事件等的详尽分析。

2024-01-06 23:00:20 460

原创 使用nsight system 分析python进程

得到nsys-rep文件后,使用nsys-ui,选择文件->open打开。就可以进行分析了(当然前提是已经会使用nsys-ui)首先直接nsys profile 后面跟要执行的python命令就行。如果我们想用nsight system 分析性能,该怎么搞呢?python脚本调用TensorRT engine进行推理。

2024-01-06 07:39:27 933 1

原创 面试题-DAG 有向无环图

有向无环图用于解决前后依赖问题,在Apollo中用于各个组件的依赖管理。在算法面试中,有很多相关题目。

2024-01-05 19:26:28 387

原创 nsight system 使用时需要注意的问题

使用时报错:Status: TargetProfilingFailed参考:然后发现status状态对了没装cudnn也会报错,需要安装和当前cuda对应的cudnn先查看我用的nsys的版本:https://forums.developer.nvidia.com/t/nsys-profile-error-invalidargumentexception/265759这个老哥和我用的一样的版本,也报这个错,nvidia建议升级nsys版本使用新版本没有错了:终于可以愉快的使用了

2024-01-05 19:11:02 425

原创 使用gpu_burn对显卡进行压测

GPU Burn是一个用于测试图形处理器(GPU)性能和稳定性的工具。通过向GPU发送大量的计算任务来测试其性能。通过利用GPU进行大量计算,GPU Burn可以在短时间内使GPU处于高负载状态,从而测试其在高负载下的温度、稳定性和性能表现。这种工具通常被用于评估GPU的散热性能、检查GPU的稳定性以及测试超频设置是否稳定。尤其在进行超频测试、GPU散热解决方案的评估或者简单地测试GPU在极限负载下的表现时,GPU Burn都是一个有用的工具。什么是gpu_burn?

2024-01-04 21:44:32 1386

原创 面试题-手撕IOU计算

一般在面试中只会考察二维无旋转矩形框IOU的计算,更复杂的二维框带旋转、三维框等一般不会让写。

2024-01-04 20:00:35 451

原创 面试题-手撕dbscan

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,适用于发现具有不同密度的点集的聚类。它不需要预先指定聚类的数量,并且能够识别出噪声点(不属于任何聚类)。

2024-01-04 19:46:29 333

原创 eigen 由于-match=native 使用不一致导致的coredump

但是在某些时候,这个编译选项又不会带来错误。经过更多测试,发现这个问题发生在接口类存在Eigen数组作为成员变量的时候。因此需要对这个问题进行原理理解。

2024-01-04 07:34:49 882

原创 eigen源码阅读笔记-1

eigen库源码阅读笔记

2024-01-04 07:24:40 1421

原创 Apollo cyberRT中的class load机制

每个component 调用CYBER_REGISTER_COMPONENT进行注册。apollo里各个模块被定义为component, 类似于ros的node的概念。

2024-01-03 20:10:12 366

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除