- 博客(244)
- 资源 (2)
- 收藏
- 关注
原创 22.C++中的原子操作
是一个模板,除了前面介绍的bool外还支持等多种类型特化。原子操作在多线程编程中是非常有用的,可以帮助我们避免很多问题,但是原子操作也有一定的代价,它可能会影响程序的性能。所以,在程序中使用原子操作时,需要根据实际情况,权衡性能与并发性的关系。欢迎访问个人网络日志🌹🌹知行空间🌹🌹。
2024-03-28 00:46:07 667
原创 21.Linux进程间通信IPC之共享内存和信号量
信号量是一种用于多线程或多进程之间同步的机制。信号量(Semaphore),是在多进程环境下使用的一种设施, 它负责协调各个进程, 以保证它们能够正确、合理地使用公共资源。信号量分为单值和多值两种,单值信号量只能被一个进程获得,多值信号量后者可以被若干个进程获得。需要包含头文件信号量可以用来保证两个或多个关键代码段不会被并发调用。共享内存可以说是Linux下最快速、最有效的进程间通信方式。
2024-03-26 01:12:22 926
原创 目标检测7-DETR算法剖析与实现
DETR是的等于2020年05月提交的论文中提出的。论文地址:开源代码:将目标检测问题看成是集合预测的问题,所谓集合预测是指一次输出一张图像中的所有待检测对象。DETR使用来做目标检测,直接预测检测框到检测框中心点归一化的距离。在模型训练时,使用的算法是一对一的匈牙利算法,通过query的方式获取最后的输出。以上介绍的策略,使得DETR实现了目标检测算法的端到端训练,不需要使用NMS和先验anchor。
2024-02-21 22:40:26 792
原创 21.图形化桌面环境的shell文本菜单
建好菜单布局和函数后,就需要设置菜单逻辑了,这需要用到case命令。case命令应该根据菜单中输入的字符来调用相应的函数。;1);2);3);*)clear;;1);2);3);*)clear;esacdoneclear上面的脚本中echo -en是输出非打印字符,其中n表示不换行。上面的脚本,只有在输入的。
2024-01-14 22:34:22 973
原创 5.Pytorch模型单机多GPU训练原理与实现
当我们使用的模型过大,训练数据比较多的时候往往需要在多个GPU上训练。使用多GPU训练时有两种方式,一种叫,一种是。方式,是在模型比较大导致一张显卡放不下的时候,将模型拆分然后分别放到不同的显卡上,将同一份数据分别输入进行模型训练。这种对模型结构各模块之间有联系时很不友好,有可能都不支持拆分。因此,应用更广泛的是的方式。方式,是将相同的模型拷贝到不同的显卡上,然后将数据平均划分后输入到相应显卡上进行计算,然后根据计算结果更新模型的参数。方式更新模型参数。
2024-01-14 15:20:02 949
原创 18.numpy.where的使用
condition: 条件x:数组,shape同condition或支持广播y:数组,shape同condition或支持广播根据condition从x或y中取数值,如果condition条件为True取x对应位置的元素,否则取y对应位置的元素。
2024-01-10 22:23:22 444
原创 20.Linux Shell自定义函数
在脚本中一遍又一遍地编写同样的代码会很烦人,为了避免这种麻烦,可以将代码封装成函数,多次引用。采用关键字functioncommands }函数名后跟空括号name() {commands }执行,$ ./test.sh # ./test.sh: 行 3: sayHello:未找到命令 # Hello, Bash Shell. # Hi, Bash Shell. # Hi2, Bash Shell.每次引用函数名时,bash shell会找到函数的定义并执行在那里定义的命令。从上面的例子可以看到,
2024-01-10 21:37:15 1078
原创 17.Linux Shell输入输出流管理
前面介绍的是3个标准的文件描述符的重定向,除此之外每个进程还支持自定义6个打开的文件描述符。可以用exec命令来给输出分配文件描述符。/bin/bash执行,以上就是自定义了输出文件描述符3到文件test3out中,上面会创建新文件test3out,也可以不创建新文件,而使用追加的方式,可以分配另外一个文件描述符给标准文件描述符,这样就可以恢复已重定向的文件描述符了。/bin/bashexec 3>&1exec 1>&3执行,上面的例子,是先将文件描述符3重定向到STDOUT,再将STDOUT。
2024-01-06 17:49:41 1051
原创 14.bash shell中的for/while/until循环
命令允许定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码 0。在 test 命令返回非零退出状态码时, while 命令会停止执行那组命令。命令用空格来划分列表中的每个值。将一系列值都集中存储在了一个变量中,然后需要遍历变量中的整个列表。在上面的命令中使用重定向,可以将循环中命令的结果保存到文件中。命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。会执行指定的多个测试命令,只有在最后一个命令成立时停止。命令中,只要定义的测试命令返回的是退出状态码。
2023-12-26 23:59:12 1227
原创 19.C++ 中将一维数组转成多维的三种方式
操作符可用于将一个指向基类的指针转换为指向子类的指针。但是这样的转换不总是安全的。reinterpret_cast作用为:允许将任何指针转换为任何其他指针类型。数组的首地址,reinterpret_cast后将这个转换结果赋值给了。它可以强制性的将一个指针类型转换成另一种不会做检查,因此就不需要先转成。的引用,如此就完成了类型转换。是取指针的值,也就是数组的首地址,类型转换是有保护的,如果同样能使用。指针中的元素个数,防止越界。欢迎访问个人网络日志🌹🌹。转换约束的限制,如果使用。是一个数组变量的引用,
2023-12-02 10:43:19 292
原创 17.PIL报错`AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘`
欢迎访问个人网络日志🌹🌹🌹🌹。
2023-11-30 21:49:02 1914 1
原创 1.UML面向对象类图和关系
关联关系表示的是对象之间的引用关系,其对应到现实世界中通常是动词连接的两个主体类别之间的关系,像老师教学生,学生选择课程。现在我们一起来看下。泛化是一般的类和更具体的类之间的关系。依赖关系的表示的是一种使用关系,考虑一个类的对象的方法中使用了另一个类的对象,作为函数参数或方法的局部变量,这时就是依赖关系。其表示的是部分和整体的关系,一个类是另一个类的一部分,两个类有单独的生命周期,可以分离存在。组合是一种比聚合更强的关联关系,聚合中整体和个体可以分别单独存在,但在组合关系中表示的是个体无法脱离整体存在。
2023-11-05 19:34:52 536
原创 18.自监督视觉`transformer`模型DINO
这篇文章旨在探索自监督训练有没有给视觉带来相对于CNN没有的新特性。除了观测到自监督训练ViT工作特别好外,作者还有两个新发现,一个是自监督训练得到的特征图包含明显的语义信息,有可能将自监督的结果直接拿来做语义分割和目标检测,另外一个是直接拿自监督得到的特征向量应用KNN分类,得到了非常好的效果。ps:本人在工程数据(20W张)上验证的直接使用KNN分类的效果比efficient-net还好。正如DINO的名字缩写,这整个算法使用了知识蒸馏的架构,通过一个teacher网络引导student。
2023-11-01 22:31:18 301
原创 17.基干模型Swin-Transformer解读
Swin-Transformer是2021年03月微软亚洲研究院提交的论文中提出的,比ViT晚了半年左右,相对于ViT而言,的改进,使能作为新的视觉任务backbone,用于分类分割和检测,姿态估计等任务。是,作者指出了将应用到视觉任务中需要解决的两个问题,一个是在ViT中就已经提到的计算时QKTdkVdkQKTV复杂度是序列长度L(在视觉任务中是image size)的平方,着限制了处理大分辨率图像的能力。
2023-10-31 22:08:22 319
原创 16.ViT模型介绍
自2017年06月由谷歌团队在论文中提出后,给自然语言处理领域带去了深远的影响,其并行化处理不定长序列的能力及自注意力机制表现亮眼。根据以往的惯例,一个新的机器学习方法往往先在NLP领域带来突破,然后逐渐被应用到计算机视觉领域。时间来到2020年10月,同样是谷歌团队提出了将应用到视觉任务的方法,。关于对的介绍可以参考。将应用于视觉任务的一种想法是将图像每个像素都flatten,得到一个表示图像的序列,作为模型的输入。但对使用自注意力模块的来说,这种方法随着图像分辨率的变大,计算复杂度也变得很高,因为。
2023-10-31 21:38:14 166
原创 18.C++中模板参数类型推断与引用
第一个编译规则,当将一个左值传递给模板函数的模板类型右值引用的参数时,编译器推断模板类型参数为实参的左值引用类型。所以调用。
2023-10-20 22:17:55 227
原创 4.迭代最近点ICP及非线性优化求解
欢迎访问个人网络日志🌹🌹知行空间🌹🌹在迭代最近点算法ICP及SVD求解中介绍了问题及使用分解求解的方法。除了,还可以使用非线性优化的方法来求解。还记得,优化的目标函数为:minR,t12∑in∣∣pi−(Rqi+t)∣∣22\min\limits_{R,t}\frac{1}{2}\sum\limits_{i}^n||p_i-(Rq_i+t)||_2^2R,tmin21i∑n∣∣pi−(Rqi+t)∣∣22我们知道旋转和平移可以写成齐次变换的形式,T=[Rt00]T=\begin{bma
2023-09-27 23:47:41 341 2
原创 3.迭代最近点算法`ICP`及`SVD`求解
在使用相机时,我们可以通过图像的特征匹配,找到两组三维点之间每个点的匹配关系。而在使用激光雷达时,由于点云是稀疏的,但是采集频率很高,通常认为两帧之间离的最近的点就是匹配点,因此称此算法为迭代最近点算法。图像找到两个位置图像中匹配点,再计算匹配点的三维坐标,然后利用。所需的量,所以得到的方程组都是超定的,只能求解其最小二乘解。中的点是传感器坐标系中的表示,这两组点对应的是世界坐标系。是待求量,一般情况下可以得到的匹配点对都会远远多于求解。关键的两个函数,一个是特征点匹配,是三维空间中的点差,因此是。
2023-09-09 18:00:18 244
原创 4.矩阵的几何意义、变基与迹
矩阵迹的定义我们都知道,是方阵对角元素的和。考虑上面是我们常用的建立坐标系的方式,当然可以使用其他方式建立坐标系,如。我们知道空间中一点的坐标可以表示以原点为起点以该点为终点的向量。通过上面的计算可以证明,进行纯旋转的变基操作不会改变矩阵的迹。尺度不相同都是可以的,譬如我们选择如下向量作为基。因此从这个角度理解,矩阵表示的是线性变换矩阵。的视频展示的更加直观,可以直接在这里看。中的表示,观察上式可以写成,的每一列为基的坐标系变换到以。的每一列为基的坐标系中,因此。欢迎访问个人网络日志🌹🌹。
2023-09-07 21:47:53 540 1
原创 点云处理库Open3D基础操作1
Open3D是英特尔公司于2015年发布的开源3D视觉算法库,截至2023年03月已经更新到了0.17.0版本。基于MIT协议开源许可。其后端使用C++11实现,经过了高度优化,使用OpenMP并行运算优化。通过,其提供前端Python API。Open3D的介绍论文发布在。更多详细的介绍可以参考这里。值得一提的是在另外一个大名鼎鼎的3D视觉算法库是PCL由实验室开源于2011年,与同出一源。关于PCL的介绍可以参考这里。在Open3D的介绍论文中,作者指出,PCL作为较早出现的3D。
2023-09-03 21:21:13 535 2
原创 (一)KITTI数据集用于3D目标检测
KITTI是德国卡尔斯鲁厄科技学院和丰田芝加哥研究院开源的数据集,最早发布于2012年03月20号。对应的论文发表在CVPR2012上。KITTI数据集搜集自德国卡尔斯鲁厄市,包括市区/郊区/高速公路等交通场景。采集于2011年09月号及10月03号的白天。KITTI数据采集使用的平台如下图,上面平台中包括从上图中可以看到IMU/GPS总结,KITTI数据集是由4个相机,1个激光雷达,1个IMU/GPS惯导系统共同组成,我们所要厘清的是这6个传感器之间的坐标系关系和时间同步信息。
2023-08-30 23:31:52 564
原创 15.矩阵运算与img2col方式的卷积
矩阵乘法运算(CABA∈Rm×kB∈Rk×nC∈Rm×nCmnk1∑KAmkBkn;mnk∈R矩阵的乘法操作可以写成如下图所示,从上面可以看到使用普通的矩阵乘法运算,其复杂度是On3,这个复杂度相对来说是很高的,当矩阵的维度很大时,运算量会显著增加。矩阵运算作为基础运算,有大量的科学家对其进行研究,试图降低其运算复杂度。以为例,其将矩阵乘法的运算复杂度降低到了Onlog27≈On。
2023-07-23 11:35:34 306
原创 8.LEETCODE72.编辑距离
很自然的一个想法是采用哪个动作后接下来需要的编辑距离最小,就采用哪个动作。通过上面的理解,很容易写出递归形式的解答代码,需要给上面的伪代码加入终止条件,也就是当。给两个单词 s1 和 s2, 返回将 s1 转换成 s2 所使用的最少操作数。可以使用备忘录优化递归代码,或者将代码写成动态规划的形式。,因此存在重复路径,也就意味着有大量的重复运算。上面的自顶至底的状态转移过程,从。位置的子串所需要的最小编辑距离。欢迎访问个人网络日志🌹🌹。上图初始状态表示的含义,欢迎访问个人网络日志🌹🌹。
2023-07-21 23:55:55 144
原创 4.GIT中的diff命令
这个命令会输出文件当前状态与其上次提交之间的发生的修改。的创建和应用,还有一些其他的操作。时可以跟一些参数来处理不同的情况。的所有修改,不包括未跟踪的文件。仓库两个文件,两个分支或者两个。使用这个文件可以同时查看使用。将修改添加到缓冲区后,使用。还能查到文件上所做的修改。欢迎访问个人网络日志🌹🌹。命令,将会输出本地还没有。到仓库中的所有文件修改。欢迎访问个人网络日志🌹🌹。这个命令给出当前分支与。
2023-07-15 16:38:55 1300
原创 17.C++类型别名之typedef 与 using
这个关键字的引人是为了满足这种情况,当希望从表达式的类型推断出要定义的变量类型,但并不想用表达式的值初始化变量的时候,会使用。因为使用派生类创建对象时,会先调用基类的构造函数再调用派生类的构造函数。不过,上面的代码就很丑了,而且还新定义了不必要的结构体,十分繁琐。方法,就需要对基类中的构造方法进行“补齐”,十分麻烦。类型的函数指针,虽然两者功能相同,但从代码看上使用。看下面这种情况,先定义了基类,又定义了派生类。来定义的话,代码在编译的时候就会报错如下,声明后,就可以在派生类中使用基类的函数了。
2023-07-15 15:21:38 531
原创 18.Lucas-Kanade光流及OpenCV中的calcOpticalFlowPyrLK
光流描述了像素在图像中的运动,就像彗星☄划过天空中流动图像。同一个像素,随着时间的流逝,会在图像中运动,光流法就是追踪它的运动过程。光流法根据追踪的像素数又可以分成稀疏光流法和稠密光流法。稀疏光流法:计算部分像素的运动,稀疏法以光流为代表,可以用来目标追踪中跟踪特征点的位置。稠密光流法:计算所有像素的运动,稠密光流法以光流为代表。在光流中,将相机的图像看成是随时间变化的,图像III在ttt时刻位置为xy(x,y)xyIxytI(x,y,t)Ixyt。
2023-07-09 15:49:37 1783
原创 17.OpenCV中的GFTTDetector类
类用来提取对线的角点特征,角点检测(Corner Detection)也称为特征点检测,是图像处理和计算机视觉中用来获取图像局部特征点的一类方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模以及目标识别等领域中。可以看到检测的结果还是很好的,不过中间大六边形上面的两个角点还是没有检测到,感兴趣可以改小。这里考虑的是左右上下边沿与图像高宽平行组成的角点,对于旋转和缩放的角点需要单独讨论。的定义可以看到,对于角点有左右边沿或上下边沿组成,是一个经验常数,用来控制检测到角点的数量,欢迎访问个人网
2023-07-08 13:42:53 1251
原创 16.C++中的多线程
线程同步是指线程间需要按照预定的先后顺序进行的行为,比如我想要线程1完成了某个步骤之后,才允许线程2开始工作,这个时候就可以使用条件变量来达到目的。对于线程间共享的变量,进行读取和写入操作时,常用的同步方式就是加锁,但是每一次循环都要加锁解锁会导致程序开销很大。当一个线程访问时,先给该线程所获取的资源上锁,防止其他线程修改资源,一个线程访问结束时,通过解锁释放资源。原子类型是封装了一个值的类型,它的访问保证不会导致数据的竞争,并且可以用于在不同的线程之间同步内存访问。没有承诺的未来没有意义,什么都不会有。
2023-07-07 20:16:42 343
Springer-handbook-of-robotics-second-edition,pdf,epub
2017-11-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人