- 博客(535)
- 资源 (23)
- 收藏
- 关注
原创 [BEV感知] --- 世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
世界坐标系:用于表示空间物体的绝对坐标,使用 (XwX_{w}XwYwY_{w}YwZwZ_{w}Zw)表示,世界坐标系可通过旋转和平移得到相机坐标系。相机坐标系:以相机的光心为坐标系原点,XcX_{c}XcYcY_{c}Yc轴平行于图像坐标系的x,y轴,相机的光轴为ZcZ_{c}Zc轴,坐标系满足右手法则。相机的光心可理解为相机透镜的几何中心。
2026-05-07 18:53:48
440
原创 [BEV感知] --- BEV感知中view transform方法
View Transform(视图变换)就是把图像视角特征 → 转换成 BEV 鸟瞰特征的核心模块,也是所有 BEV 算法最核心、最区分路线的部分。
2026-05-07 14:22:42
217
原创 [C++] --- Pimpl设计模式
Pimpl(Pointer to Implementation,指针指向实现)是 C++ 中接口与实现分离的经典设计模式,核心是通过 “指针封装实现细节”,解决头文件依赖、编译效率、二进制兼容等问题。
2025-12-05 10:24:41
276
原创 [C++] --- 程序性能分析,程序瓶颈定位
gperftools(Google Performance Tools)是一套由 Google 开发的性能分析工具集,主要用于 C/C++ 程序的性能诊断和优化,包含多个实用工具,覆盖内存管理、CPU 性能分析、堆内存检测等场景。1. CPU Profiler(CPU 性能分析器)功能:定位程序中 CPU 消耗较高的函数(热点函数),生成函数调用关系和耗时统计。特点:基于采样(默认每 10ms 采样一次调用栈),对程序运行干扰小;支持多线程程序,能区分不同线程的 CPU 消耗;
2025-10-17 11:03:39
1281
原创 [C++] --- 内存模型
L1缓存(一级缓存)访问CPU发出数据请求后,首先会查找L1缓存。L1缓存非常小(一般为32KB到128KB)且访问速度非常快,因此它能提供非常低的延迟。缓存命中(Cache Hit):如果L1缓存中有需要的数据(命中),CPU直接从L1缓存中获取数据,不需要访问更慢的L2或主存。缓存未命中(Cache Miss):如果L1缓存中没有数据(未命中),CPU就会查找L2缓存。L2缓存(二级缓存)访问如果L1缓存没有找到所需数据,CPU接下来会查找L2缓存。
2025-09-10 16:42:46
1214
原创 [C++] --- 死锁
只要四个条件同时满足,就可能发生死锁。我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。
2025-09-08 16:04:06
1231
原创 [C++深入] --- CRTP实现静态多态
定义一个模板基类 Shape,它接受一个派生类作为模板参数。public:基类中,area 调用了派生类 computeArea 方法。用 static_cast 可以确保在编译时进行类型检查。定义两个派生类Circle 和 Rectangle。public:private:public:private:每个派生类实现 computeArea 方法。
2025-05-28 10:23:25
574
原创 [C++ 11] --- 线程异步
C++11 提供了std::future类模板,future 对象提供访问异步操作结果的机制,很轻松解决从异步任务中返回结果。在 C++ 标准库中,有两种“期望”,使用两种类型模板实现唯一期望(unique futures,std::future<>) 实例只能与一个指定事件相关联。共享期望(shared futures, std::shared_future<>) 实例能关联多个事件。
2025-04-26 15:14:45
237
原创 [深度学习入门] --- 深度学习概念扫盲
卷积神经网络(CNN):CNN是图像分类中最常用的深度学习模型,通过多层卷积层和池化层来提取图像的特征,并通过全连接层来进行分类。数据增强:为了让模型具有更好的泛化能力,通常会对训练数据进行各种变换,如旋转、缩放、裁剪等。模型结构:从LeNet、AlexNet到VGG、Inception、ResNet等,模型结构的创新也是提升分类性能的关键。迁移学习:在数据量不足时,可以通过迁移学习的方式使用预训练模型,迁移已有的知识以提高性能。
2024-11-05 14:23:12
1295
原创 [深度学习入门] --- 神经网络基础
人工神经网络中常用到激活函数(activation function):ReLu和Sigmoid。定义:卷积核大小是指卷积核在输入数据上滑动时所覆盖的维度大小。通常用一个二维的数字表示,如 3×3 或 5×5,表示卷积核是一个 3 行 3 列或 5 行 5 列的矩阵。影响:卷积核的大小决定了它能够捕捉的局部特征的范围。较小的卷积核(如 3×3)更适合于捕获细粒度的特征,如边缘、纹理等。较大的卷积核(如 5×5 或更大)则能够捕获更大范围内的特征,适合于捕捉更复杂的模式。设计考虑。
2024-11-05 14:22:41
1219
原创 [yolov5] --- yolov5入门实战「土堆视频」
下载好之后放到根目录,同时把这里改成对应的模型名train.py 中参数如下下面对这34个参数进行逐一讲解。
2024-09-07 17:41:47
1319
原创 [pytorch] --- pytorch GPU和CPU模型相互加载
第二种方法则只是保存参数,在读取模型参数前要先定义一个模型(模型必须与原模型相同的构造),然后对这个模型导入参数。虽然麻烦,但是可以同时保存多个模型的参数,而第一种方法则不能,而且第一种方法有时不能保证模型的相同性(你读取的模型并不是你想要的)。加载模型参数的时候,在GPU和CPU训练的模型是不一样的,这两种模型是不能混为一谈的,下面分情况进行操作说明。pytorch 允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上。CPU训练的模型,在CPU上使用,
2024-09-05 18:39:49
804
原创 [pytorch] --- pytorch基础之模型验证套路
结果分析:最终的输出结果通过print(output.argmax(1)),找到数组 output 中每行的最大值的索引,最终结果是tensor[5]。利用已经训练好的模型,拿出训练集中的部分数据进行测试。也即我们放了狗的图片,识别出来的是狗,模型识别正确。
2024-09-05 18:39:33
540
原创 [pytorch] --- pytorch基础之模型训练套路
习惯上把模型单独存一个py文件里面,这里也把这个代码块存在"model.py"下。为了方便,我们这里直接使用pytorch官方的CIFAR10数据集进行训练。下面以具体实例给出上面的步骤。明确定义训练设备是GPU。
2024-09-05 18:39:11
995
原创 [tensorrt] --- tensorrt安装及使用
本教程基于ubuntu20.04,默认安装好了nVidia驱动、cuda版本、cudnn版本,选择与之匹配的Tensorrt安装。
2024-09-05 18:38:47
1826
原创 [pytorch] --- pytorch基础之损失函数与反向传播
Loss Function的作用:(1)计算实际输出和目标之间的差距(2)为我们更新输出提供一定的依据,这个提供依据的过程也叫反向传播。我们可以看下pytorch为我们提供的损失函数:https://pytorch.org/docs/stable/nn.html#loss-functions。
2024-09-02 15:37:22
1743
原创 [pytorch] --- 神经网络的基本骨架-nn.Module的使用
class Sequential(Module): # 继承Moduledef __init__(self, *args): # 重写了构造函数def forward(self, input): # 重写关键方法forward。
2024-09-02 10:52:21
2304
原创 [pytorch] --- pytorch基础之transforms
transform使用方法是:1> 首先 关注 它的 输入 需要什么样的 数据类型,是PIL,是Numpy,是Tensor …2> 关注 它的 输出是什么样的数据类型3> 查看 官方文档的参数上面实验使用到的全部代码# 下面是 把图像的像素值从[0, 255]缩放到[0.0, 1.0]print(img_tensor) # 将图像数据 转换为 tensor 类型的数据# 归一化# 初始化参数: mean, std, inplace=False。
2024-09-01 21:37:35
1129
原创 [pytorch] --- pytorch基础之tensorboard使用
TensorBoard是一个用于可视化机器学习实验结果的工具,可以帮助我们更好地理解和调试训练过程中的模型。在PyTorch中,我们可以使用TensorBoardX库来与TensorBoard进行交互。TensorBoardX 是一个PyTorch的扩展,它允许我们将PyTorch的训练中的关键指标和摘要写入TensorBoard的事件文件中。
2024-09-01 21:02:10
2033
原创 [pytorch] --- pytorch基础之dataset和dataloader
torch.utils.data.Dataset 是代表这一数据的抽象类(基类),即:Dataset 类是 pytorch 中图像数据中最为重要的一个类,也是 pytorch中所有数据集加载类中应该继承的父类。(1)dataloader 本质上是一个可迭代对象,使用 iter() 访问,不能使用 next() 访问,它本身就是一个可迭代对象, 使用 for i, data in enumerate(dataloader) 来访问。() 两个方法,会用到 transform 对数据进行扩充;
2024-09-01 20:47:52
1884
1
原创 [CUDA编程] --- CUDA内存模型
用表格进行总结:设备存储器的重要特征下图表达的更加直观一些。Local, Global, Contant, Texture为片外DRAM,其中Global, Constant, texture内存在Host端代码声明,所有线程可见。SM拥有私有的Registers和Shared Memory(其实还有SM私有的L1 cache以及共有的L2 cache,下一篇会详细说明),Constant和Texture内存有专有的Caches, 这些在片上。
2024-08-25 12:46:12
1589
原创 [CUDA编程] --- cuda线程模型
threadIdx是一个uint3类型,表示一个线程的索引。blockIdx是一个uint3类型,表示一个线程块的索引,一个线程块中通常有多个线程。blockDim是一个dim3类型,表示线程块的大小。gridDim是一个dim3类型,表示网格的大小,一个网格中通常有多个线程块。
2024-08-25 12:45:40
1293
原创 [CUDA编程] --- CUDA计时
计时通常分为两种情况:1)直接得到接口函数的时间,一般用于得到加速比;2)获得接口函数内核函数、内存拷贝函数等所耗时间,一般用于优化代码时。情况(1)方法有两种,CPU计时函数和GPU计时函数。情况(2)有三种工具nsight,nvvp,nvprof本博客会详细介绍情况(1)的两种方法;情况(2)nsight不会用,简单介绍一下nvvp和nvprof的用法。
2024-08-25 12:45:14
1324
原创 [CUDA编程] --- nvcc编译过程和GPU计算能力
nvcc编译流程具体可参看官方文档:nvcc编译过程:https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html下面结合这张图进行具体讲解NVCC的编译过程分为离线编译和即时编译两部分组成:离线编译(绿色虚线框内):CUDA源程序(即xxx.cu文件)在编译前的预处理会被分为主机端代码和设备段代码(即图中的左右分支):1.如图右分支:在设备端代码会被编译成ptx文件(可以看作是用于设备端的汇编文件)或是直接可运行的二进制文件xx
2024-08-25 12:44:21
1858
原创 [CUDA编程] --- 函数关键字介绍
CUDA编程模型是一个ie异构模型,需要CPU和GPU协同工作。在CUDA中,host和device是两个重要的概念,我们用host指代CPU及其内存,用device指代GPU及其内存。CUDA程序中既包含host程序,又包含device程序,他们分别在CPU和GPU运行。同时host和device之间可以通信,这样他们之间可以进行数据拷贝。
2024-08-25 12:43:30
556
原创 [数据结构与算法] ---双指针解数组题目技巧
在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:对撞指针和快慢指针。在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,本文主要讲数组相关的双指针算法。本文就总结一下数组双指针的基本技巧,每个技巧都对应着至少一道算法题:1、删除有序数组中的重复项2、移除元素3、 两数之和4、 反转数组5、 回文串判断6、 最长回文串12快慢指针3456对撞指针。
2024-07-24 10:47:20
402
原创 [数据结构与算法] ---双指针解链表题目技巧
本文就总结一下单链表的基本技巧,每个技巧都对应着至少一道算法题:1、合并两个有序链表2、链表的分解3、合并 k 个有序链表4、寻找单链表的倒数第 k 个节点5、寻找单链表的中点6、判断单链表是否包含环并找出环起点7、判断两个单链表是否相交并找出交点这些解法都用到了双指针技巧,所以说对于单链表相关的题目,双指针的运用是非常广泛的,下面我们就来一个一个看。
2024-07-24 08:38:28
429
原创 [基础算法] --- 位运算
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JUn5T7U-1721627042685)(https://i-blog.csdnimg.cn/direct/552453030c454160ab0a304c60be24ca.png)]
2024-07-22 13:44:15
1727
原创 [基础算法] --- 递归算法
递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举个简单的例子来了解一下递归算法。比如阶乘的计算方法在数学上的定义为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3plTPNY1-1721614561192)(https://i-blog.csdnimg.cn/direct/f7d5d612e5e1485c8411bd97c58d667c.png)]
2024-07-22 10:16:12
921
原创 [基础算法理论] --- 滑动窗口
1 滑动窗口算法介绍在计算机网络中,滑动窗口协议(Sliding Window Protocol)是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。我们所要讲解的滑动窗口算法也是利用了同样的特性。滑动窗口算法(Sliding Window):在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。滑动操作:窗口可按照一定方向进行移动。最常见的是向右侧移动
2024-07-22 10:15:08
1060
原创 [基础算法理论] --- 双指针
双指针分为「对撞指针」、「快慢指针」、「分离双指针」。对撞指针:两个指针方向相反。适合解决查找有序数组中满足某些约束条件的一组元素问题、字符串反转问题。快慢指针:两个指针方向相同。适合解决数组中的移动、删除元素问题,或者链表中的判断是否有环、长度问题。分离双指针:两个指针分别属于不同的数组 / 链表。适合解决有序数组合并,求交集、并集问题。
2024-07-22 10:14:50
935
原创 [基础算法] --- 枚举算法
枚举算法(Enumeration Algorithm):也称为穷举算法,指的是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。枚举算法的核心思想是:通过列举问题的所有状态,将它们逐一与目标状态进行比较,从而得到满足条件的解。由于枚举算法要通过列举问题的所有状态来得到满足条件的解,因此,在问题规模变大时,其效率一般是比较低的。
2024-07-19 15:23:44
1031
原创 [UDS] --- ReadDTCInformation 0x19
19服务允许客户端从任何服务器或车辆内的服务器组,读取存储在服务器中的诊断故障代码 (Diagnostic Trouble Code,DTC)信息的状态。除非特定子功能另有要求,否则服务器应返回所有DTC信息(例如,与排放相关和非排放相关)。19服务允许诊断仪/上位机从车辆内的任何ECU读取故障诊断码(DTC)信息的状态。此服务常用的操作如下:在ISO 15031中对DTC故障码各Bit格式进行了定义:DTC的八个状态位分别代表含义:在ISO 14229中定义了28个Sub-Function,大家可以参
2024-07-19 11:16:14
2764
1
原创 [数据结构] --- 堆
将根节点最大的堆叫做,根节点最小的堆叫做。常见的堆有二叉堆、斐波那契堆等。如下,小堆的父亲节点总是小于其孩子节点,所以小堆的根节点一定是最小的。而大堆的父亲节点总是大于其孩子节点,所以大堆的根节点一定是最大的。Note:现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
2024-07-16 08:48:32
1016
原创 [数据结构] --- 线性数据结构(数组/链表/栈/队列)
链表是由一个个结点串联而成的,而每个结点分为两块区域,一块是数据域,相当于数组中存储的那个数据;另一块是指针域,这里存放的是指向下一个结点的地址。//定义结点类型int data;//数据类型,你可以把int型的data换成任意数据类型,包括结构体struct等复合类型//单链表的指针域//Node表示结点的类型,LinkedList表示指向Node结点类型的指针类型栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
2024-07-04 13:18:08
1289
原创 [数据结构] --- 树
*二叉树是每个节点最多有两个子树的树结构。**它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。我们知道,实际应用当中,我们经常使用的是查找和排序操作,这在我们的各种管理系统、数据库系统、操作系统等当中,十分常用。数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查找,二分查找要求数组的构造一定有序,二分法查找解决了普通数组查找复杂度过高的问题。
2024-07-03 13:23:43
1446
JNI实现java cpp相互调用
2023-07-06
PCB封装库---经过很多次画板检验
2018-09-27
Linux网络编程-网络基础-socket编程-高并发服务器.pdf
2021-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅