- 博客(54)
- 收藏
- 关注
原创 目标跟踪中的匈牙利算法
首先,我们需要定义一个成本矩阵CCC,其中每个元素CijC[i, j]Cij表示第iii个目标框和第jjj个目标框之间的匹配成本。匹配成本可以基于多种度量方式,例如欧氏距离、IoU(Intersection over Union)、马氏距离等。C4132053223 & 2 & 2C423102352通过匹配结果可能是 ((0, 1), (1, 0), (2, 2))。
2024-09-20 16:04:01
1643
原创 Softmax函数防止溢出,稳定计算
输出饱和:Softmax输出接近0或1时,梯度∂yi∂zi∂zi∂yi和∂yj∂zi∂zi∂yj都会变得非常小。梯度消失:梯度变小导致反向传播时参数更新的步长变小,训练过程变得缓慢。数值稳定性:输入值分布分散会导致数值计算不稳定,进一步影响梯度的计算。为了缓解这种问题,可以使用一些技术,如Batch Normalization、Gradient Clipping等,或者在网络结构设计时避免过深的网络层数。
2024-08-27 14:36:50
743
原创 MNN部署、集成
交叉编译是指在一种平台(称为主机平台,通常是开发者的机器,比如 x86_64 的 Linux 或 Windows)上编译生成可以在另一种不同的平台(称为目标平台,如 ARM 架构的 Android 设备或嵌入式系统)上运行的可执行文件或库的过程。换句话说,你在一台开发机器上编写和编译代码,生成的二进制文件是为了在另一台不同架构的设备上运行的。交叉编译是生成可以在不同架构或操作系统上运行的二进制文件的过程。你在目录下看到的和mnn-linux目录,正是通过不同配置进行交叉编译(或本地编译)的结果。
2024-08-15 19:19:30
1105
原创 FP16/INT8 MNN 量化
是的,经过QAT训练之后,通过convert指令将模型转换为量化模型后,使用torch.save保存下来的.pth文件就是量化后的模型。这种量化模型的.pth文件可以被用作推理或转换为其他格式。推荐流程: 先将 PyTorch 模型转换为 MNN,然后再使用 MNN 的原生工具进行量化。这种方式能确保量化过程适应 MNN 的推理引擎,避免跨框架量化引入的不兼容问题。理由: MNN 框架对量化的支持和优化是基于其特定的推理引擎,因此通过 MNN 的量化工具量化的模型通常能获得更好的推理性能和精度。EMA。
2024-08-15 15:25:15
1447
原创 PyTorch FP16模型转换
在使用 MNN 进行 INT8 量化推理时,你不需要在预处理阶段将图像转换为 INT8 格式。相反,你应该按照常规的图像预处理步骤,将图像转换为浮点数格式,然后将其输入到量化模型中。MNN 推理引擎会自动处理输入数据的量化。PyTorch:需要手动将输入数据转换为相应的推理格式(如 FP16 或 INT8)。MNN:不需要手动将输入数据转换为 INT8 格式,MNN 推理引擎会自动处理输入数据的量化。你只需按照常规的图像预处理步骤,将图像转换为浮点数格式即可。
2024-08-15 13:49:57
2532
原创 相机内外参矩阵/Mono2Depth相机转换矩阵,位姿矩阵
mono是2d图像,通过转换矩阵可以将3d空间投影到2d空间,也就是图像中的物体有了深度信息。位姿矩阵通常指的是描述物体或相机在3D空间中的位置和方向的矩阵。c. 通过SLAM(同时定位与地图构建): 在动态环境中,SLAM算法可以同时估计相机的运动(外参)和环境的3D结构。物体在空间中的姿态可以理解为坐标+方向,一个向量(6个数),那么一个四维的转换矩阵参数是够用的。位姿矩阵描述了一个物体在3D空间中的位置和方向。内参矩阵描述的是相机的内部光学特性,它将相机坐标系中的3D点转换为图像平面上的2D点。
2024-08-07 21:14:44
1450
原创 eco_tracker
在跟踪过程中,如果目标丢失,跟踪模块会调用重识别模块进行目标的重新识别。VGG是第一个提出使用块的想法,通过使用循环和子程序,可以很容易地在任何现代深度学习框架的代码中实现这些重复的架构。:调用 ReID 模块的 match 方法,根据设置的条件和当前的输入图像进行 ReID 匹配,返回匹配结果。:在处理匹配结果之前,先将面部和身体的边界框和状态重置为默认值,以确保之后的更新是基于最新的匹配结果。检测模块检测到目标后,将目标的位置传递给跟踪模块,跟踪模块初始化跟踪器,开始跟踪目标。
2024-08-05 19:05:23
491
原创 链表(指针)
在C++中,指针之间的赋值是非常直接的,因为指针本质上就是存储地址的变量。这种指针之间的赋值在处理链表、树结构或其他复杂的数据结构时非常常见,因为它允许在不同的函数或代码块中传递对同一块内存区域的引用。是不正确的,因为它试图将一个节点的值赋给一个指针变量,这在类型上不匹配,并且不是我们想要的操作。这样做的目的是创建一个新的指针,而不是试图获取或修改链表中的节点。对节点进行修改,这些修改将反映在另一个指针所指向的节点上,因为它们指向的是同一个对象。是正确的赋值方式,因为它创建了一个指向相同节点的新指针。
2024-04-15 11:21:40
869
原创 sort(); .front()、.back()、.begin() 和 .end()
当两个向量的左端点相同时,std::sort 会查看下一个元素(右端点)以确定顺序,这样可以确保具有相同左端点的区间会根据右端点被排序,从而保持了整体的排序稳定性。对于 std::vector<std::vector<int>> 类型的容器,std::sort 会逐个比较容器中的元素,首先比较第一个元素(即区间的左端点),如果相等,则比较第二个元素(即区间的右端点),依此类推。这意味着,排序首先是基于区间的左端点进行的,如果左端点相同,则会根据右端点进行次级排序。在 C++ 标准模板库(STL)中,
2024-04-07 19:33:59
431
原创 num_set.insert(num) 和 num_set.count(num)
这是因为每个元素最多只会被访问两次:一次是在构建哈希表时,另一次是在检查连续序列时。空间复杂度是O(n),因为哈希表存储了数组中的所有唯一元素。被用于检查当前元素的前一个数字是否存在于集合中,这是为了确定当前元素是否可以开始一个新的连续序列。容器的两个成员函数,它们用于管理和查询集合中的元素。这个算法的时间复杂度是O(n),其中n是数组。不存在,那么当前元素是连续序列的起始点。这个函数的目的是找出一个未排序整数数组。数组中所有唯一元素的集合。中最长连续子序列的长度。在提供的代码示例中,
2024-03-25 11:16:31
734
原创 emplace_back和push_back
等序列容器的成员函数,它们都用于在容器的末尾添加新元素。然而,它们在添加元素的方式上有所不同,这导致了它们在性能和使用场景上的差异。避免了临时对象的创建和随后的复制或移动,因此在性能上通常更优。对象,没有创建临时对象。则直接使用提供的参数在。对象,然后将其添加到。
2024-03-24 21:28:33
485
原创 TypeError: ‘torch.Size‘ object is not callable 错误
是一个张量的属性,而不是一个方法,所以不应该在其后面加上括号。属性时错误地将其作为一个方法。在PyTorch中,错误是因为在尝试调用。
2024-01-29 09:43:17
693
原创 12.12
理解目标硬件的能力,包括计算能力、内存架构等,以便优化计算操作和内存访问。实现高效的图优化技术,比如层融合、常量折叠、消除冗余计算等,以提升推理性能。根据硬件特性优化基础深度学习操作(如卷积、池化等),确保高效执行。提供不同的精度选项(如 FP32、FP16、INT8),并确保数值稳定性。提供易于使用的 API,支持不同的模型格式和编程语言。提供工具以帮助用户分析和优化模型的推理性能。提供详细的文档和用户支持,建立用户社区。考虑支持不同的操作系统和环境(如云、边缘设备)。
2023-12-12 18:39:35
1246
原创 Something about Transformer
这样的矩阵作为输入,送入后续的Transformer编码器中,实现对整张图像的建模,就如同NLP中的Transformer对一个句子进行建模一样。综上,这种基于Transformer编码器的跟踪器,可以采用在线预测和更新掩码的方式,来提供额外的监督信号,增强网络跟踪鲁棒性。所以综合来说,虽然原始论文的Vision Transformer没有卷积层,但在实际使用中加入一定数量的卷积层作为补充,可以给模型带来性能或参数效率上的提升。所以全连接层依靠可训练的权重矩阵,实现高维到低维的线性映射转换。
2023-11-01 10:12:53
181
原创 定义单向列表
这个结构体可以用来表示一个单向链表,单向链表是一种线性数据结构,每个节点都有一个值和一个指向下一个节点的指针。这段代码的功能是定义一个名为ListNode的结构体,结构体是一种可以存储多个不同类型数据的复合数据类型34。
2023-10-13 11:37:19
159
原创 自制框架学习记录
生成器表达式适用于需要逐个迭代元素的场景,不需要构建完整列表,可以提高效率。列表推导式会构建出一个完整的列表,占用更多内存,但可以多次重复使用。所以如果仅仅是获取最大值,使用生成器表达式 max(x.generation for x in inputs) 更加高效。如果需要重复使用列表,则使用列表推导式 max([x.generation for x in inputs])。:使用列表推导式,会先构建一个完整的列表,然后再调用max()。:使用生成器表达式,不会构建完整的列表。
2023-09-04 21:22:32
101
原创 大目标跟踪多模板策略
与直接通过模型端到端学习更新模板相比,手动设计策略可以更明确地控制模板更新的方式,降低模型随机性,保证模板质量。1. 更新部分子模板不要全部子模板一起更新,而是每次只更新一两个子模板,让其他模板保持原样。2. 增量更新子模板不要完全替换子模板,而是基于原模板做增量更新,只更新关键部分,保持模板历史信息。在多模板跟踪器初始化时,多个子模板通常是从同一目标区域提取的,所以初始阶段子模板是一样的。4. 当跟踪框稳定后,定期更新子模板,attention区域改变时优先更新对应模板。质量低的模板优先更新。
2023-09-01 17:48:14
425
原创 C++中 static 关键字
const 还可以修饰函数的参数或返回值,表示参数或返回值是常量,不能被修改。const 还可以修饰类的成员函数,表示该函数不能修改类的非静态成员变量。,延长它们的生命周期,也可以使变量或函数只能在本文件或本类中访问,隐藏它们的实现细节。static 还可以修饰类的成员变量或成员函数,表示它们属于整个类而不是某个对象,可以通过类名直接访问,也可以被所有对象共享。static 和 const 是 C++ 中两个不同的关键字,它们的主要区别在于它们的作用和含义。static 用来修饰变量或函数,表示它们的。
2023-08-21 17:10:12
87
原创 CMake
背景:vscode编译C++程序时,导入第三方库要在c_cpp_properties.json和tasks.json中分别指定路径。感觉不如使用CMakeLists.txt。
2023-08-05 22:12:48
428
原创 TensorRT
3.使用 API 或 Parser 构建 Network。6.传输计算数据(H2D)8.传输计算结果(D2H)TRT转换优化引擎(离线)→engine。1.创建 Builder。2.创建 Network。2.kernel自动调优。5.序列化和反序列化模型。TRT执行引擎(线上)
2023-08-05 20:06:28
1058
原创 BERT 模型到 TensorRT 的转换
5. 最终模型测速要对比ONNX模型和原始PyTorch模型,看TensorRT优化的效果如何。2. 在转为TensorRT模型时,可以适当调整最大batchsize、workspace大小等参数,以取得最佳的性能。2. 获取预训练BERT模型:可以直接下载官方提供的PyTorch模型,或训练自定义BERT模型。1. 模型转换要注意输入输出格式的对应,确保ONNX模型和原始PyTorch模型的输入输出一致。8. 推荐使用onnx-simplifier等工具简化模型,可以减少不必要的运算,提高转换性能。
2023-08-04 08:48:09
893
原创 cublas 矩阵乘法问题
可以考虑使用cublas提供的GPU端内存分配和矩阵设置函数,避免主机和设备之间的数据传输。2. cublas的默认配置可能不是针对您的特定矩阵大小进行了优化的。3. 手动CUDA实现可能进行了更多特定问题的优化,例如利用了共享内存,或者针对更好的内存访问模式进行了调整。cublas的额外开销在小矩阵上的影响可能更大。2. cublasSetMatrix(): 将主机内存中的矩阵复制到设备上已分配的内存中。3. cublasSetVector(): 将主机数组中的向量复制到设备上已分配的内存中。
2023-07-28 13:00:01
633
原创 nvcc 编译 .cu 源代码的基本用法
指定了 GPU 计算能力、C++11 标准、优化等选项,并链接了 CUDA runtime 库。nvcc 是 NVIDIA 提供的 CUDA C/C++ 的编译器。即分别编译.cu和.cpp文件,然后链接生成可执行文件。,并输出一个叫 vectorAdd 的可执行文件。注意链接顺序,先放CUDA库。这将使用默认参数编译。
2023-07-24 11:40:50
4623
1
原创 CUDA - 共享内存及核函数
staticReverse使用了一个固定大小的共享存储器数组,即__shared__ int s[64],其中64是数组元素的个数,也是每个线程块内线程的个数。核函数的调用方式是使用符号,其中包含了执行配置(execution configuration),即指定了线程块(thread blocks)和线程(threads)的数量和大小,以及可选的共享存储器(shared memory)的大小和流(stream)的编号。这段代码的目的是实现一个数组的反转,即将数组中的元素按照逆序重新排列。
2023-07-23 11:01:17
325
原创 CUDA C编程
如果使用流水线前传,那么第一条指令在执行阶段(EX)就可以将R1的结果直接传递给第二条指令的执行阶段(EX),而不需要等待写回阶段(WB),这样就可以避免数据冒险和流水线暂停。流水线前传(forwarding)是一种解决数据冒险(data hazard)的技术,它可以在流水线中将一个阶段的输出直接传递给后续阶段的输入,而不需要等待结果写回寄存器。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令,属于CPU硬件电路层面的并发。
2023-07-21 16:07:11
617
原创 Google Test
TEST_P(test_case_name, test_name):这是一个宏,用来定义一个参数化的测试用例,它也有两个参数,第一个是测试用例的名称(test_case_name),第二个是测试用例的子集(test_name)。在这个宏内部,可以使用gtest提供的断言来进行检查。- TEST(test_case_name, test_name):这是一个宏,用来定义一个简单的测试用例,它有两个参数,第一个是测试用例的名称(test_case_name),第二个是测试用例的子集(test_name)。
2023-07-19 16:54:30
110
原创 可见与SAR
可见和SAR是两种不同的遥感数据获取方式。可见光和SAR图像融合是一种利用可见光和SAR图像的互补性,得到更全面的地物信息的方法。的方法:这类方法将可见光和SAR图像分解为不同尺度的子带,然后对不同尺度的子带进行融合规则,最后通过逆变换得到融合图像。的方法:这类方法将可见光和SAR图像转换到其他变换域,如傅里叶域、小波域、PCA域等,然后对变换系数进行融合,最后通过逆变换得到融合图像。的方法:这类方法将可见光和SAR图像表示为稀疏系数和字典的乘积,然后对稀疏系数进行融合,最后通过字典重构得到融合图像。
2023-05-17 22:14:31
2108
原创 4/22 LSS-视锥点云
BEV pillar是一种用于表示激光雷达点云的特征的方法,它是由PointPillars提出的,基于VoxelNet的思想。将激光雷达点云在XY平面上离散化,形成多个柱状体(pillar),每个pillar包含若干个点。对每个pillar中的点进行特征提取,得到一个固定长度的特征向量。将每个pillar的特征向量分配到BEV网格中,形成BEV特征图。用卷积神经网络处理BEV特征图,输出感知结果。BEV pillar的优点是可以快速地将点云转换为BEV特征图,提高感知效率和性能。
2023-04-22 16:40:31
1571
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人