自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

deep_love1314的博客

学习是人类进步的阶梯

  • 博客(174)
  • 资源 (4)
  • 收藏
  • 关注

转载 C++笔记之多线程编程3

本篇文章继续写线程中的join和detach。详细说明二者的区别!一、线程状态:在一个线程的生存期内,可以在多种状态之间切换,不同的操作系统可以实现不同的线程模型。定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,下面几种状态是通用的:1)就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行。2)运行:占用CPU,正在进行中。3)休眠:暂不参与调度,等待特定事件发生。4)中止/终止:已经运行完毕,等待回收线程资源。二、线程环境:线程存在于进程之中,

2021-12-27 17:17:54 149

转载 C++笔记之多线程编程2

本篇文章,还是主要学习记录join()函数和detach()函数每个程序至少拥有一个线程,那就是执行main()函数的主线程。而多线程则是出现两个或两个以上的线程并行运行。即主线程和子线程在同一时间段同时运行。而这个过程中会出现以下几种情况:1)主线程先运行结束2)子线程先运行结束3)主线程和子线程同时结束在一些情况下,需要在子线程结束后,主程序才能结束。而一些情况则不需要等待,但需要注意一点,并不是主程序结束了其他子线程就立即停止,其他子线程会进入后台运行。一、join

2021-12-27 15:10:16 169

原创 linuxmint20.1安装一系列库

前言之前将linuxmint19.3的显卡驱动由440系列(到底是440多少我忘记了,应该是440.33)在驱动管理中升级显卡驱动版本为460,结果导致重启电脑后进不去渲染界面,一直黑屏光标闪动。后面卸载驱动,又重新安装440.64、440.86、440.100,但是全部都没法使用。之后我索性直接安装linuxmint20.1,该linux发行版是基于ubuntu20的,直接解决了这种问题,成功地安装了460.32.03的显卡驱动。新系统装好后:(1)更新软件源换为国内源(2).

2021-01-25 14:20:19 414 1

原创 linuxmint20.1 opencv4.5.0安装并在cmakelists中添加opencv库

安装教程参考:https://blog.csdn.net/qq_34907927/article/details/111647393?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.con

2021-01-21 10:53:35 442

原创 caffe源码编译安装

这个宏定义,这些都是API不兼容,但是NVIDIA声明cudnn8不支持了,caffe的代码也没人去更新了,所以不能指望NVIDIA或者berkeley,只能自行修改。最后在build文件夹下找到Caffe.sln文件,用VS2015打开,然后右键ALL_BUILD进行生成,等几分钟后编译完,(注意:这个要自己调整路径,我这边懒得调整了,所以你们看是报错了路径问题,就不再修改了,直接用下文的命令处理即可)要按照官网来转成LMDB格式,那么需要能在windows下运行.sh的程序, 需要安装。

2024-03-31 00:47:31 587

原创 多线程libtorch推理问题

介绍一下libtorch多线程的问题

2024-03-22 17:58:21 118

原创 libtorch c++输出接收方式

forward函数的输出,根据原始tracing的网络输出,对输出进行类别转换。这个函数在高版本上无法进行列表接收了。

2024-03-12 08:43:50 61

原创 sam和mobilesam的c++ dll打包

前面我们已经成功导出分割模型和预处理模型了:因此接下来就是要c++推理的测试了。

2023-11-27 09:27:26 224

原创 ONNX实践系列-将dbnet.onnx的hardsigmoid op用hardsigmoid.onnx整个去替换掉

这个dbnet.onnx是paddleocr转出来的,自带的有paddle的那个hardsigmoid算子 ,这个不好转到trt等框架,因此我们想把这个hardsigmoid 算子op替换成我们常规的pytorch框架转出来的hardsigmoid onnx那种。

2023-11-24 16:41:20 227

原创 ONNX实践系列-修改yolov5-seg的proto分支输出shape

本文主要介绍要将原始yolov5分割的输出掩膜从[b,c,h,.w]修改为[b, h, w, c]一般的做法就是使用:onnxsim里面带的推断shape的函数过一遍onnxsim就行了!这个是基于yolov5s-seg的,实际其他的m,l等模型那个节点的索引就不是208了。(2)上面我们看到转置完成后,detect的还是没有显式地显示出来。这个以后修改就要相应的去修改!

2023-11-24 16:03:59 582

原创 多线程的重要资料-信号量

(1)https://www.cnblogs.com/ike_li/p/8984186.html(2)C#关于AutoResetEvent的使用介绍 | 康瑞部落(3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客(4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5) c# - What is the C++ equivalent for Au

2023-11-22 09:56:54 180

原创 C++并发与多线程(14) | condition_varible、wait、notify_one、notify_all

当谈到并发编程,特别是在多线程或多进程的上下文中,条件变量(Condition Variables)、等待(wait)、通知一个(notify_one)和通知所有(notify_all)是常见的概念。它们用于协调线程的执行,以实现同步并避免竞争条件。: 条件变量是一种用于阻塞线程直到满足某种条件的同步原语。通常用于协调多个线程的活动。在许多编程语言和库中,条件变量被实现为允许线程等待特定条件满足的对象或结构。等待操作用于线程主动释放锁或互斥锁,并等待某个条件变为真。当线程在条件变量上调用等待。

2023-11-02 18:09:49 505 4

原创 C++并发与多线程(11) | unique_lock Ⅱ

这与一开始的锁定方式不同,因为在某些情况下你可能希望先尝试获取锁,然后在需要的时候再锁定。是C++标准库中的互斥量使用相关工具,它们通常不必直接一起使用,但它们的概念和用途有时会在互斥量的管理中互相关联,具体取决于你的使用情境。所以,unique_lock对象这个mutex的所有权是可以转移(但是不可复制的)。尝试给互斥量加锁,如果拿不到锁,则返回false,如果拿到了锁,返回true,这个函数是不阻塞的。来尝试获取锁,如果无法获取到锁,则不会阻塞,而是立即返回。以下是一个示例C++代码,演示如何使用。

2023-11-01 15:15:52 108

原创 C++并发与多线程(11) | unique_lock Ⅰ

unique_lock也可以带std::adopt_lock标记,含义相同,就是。我们会尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,我也会立即返回,并不会阻塞在那里。像lock_guard一样,unique_lock支持很多标记,例如adopt_lock.unique_lock是个类模板,工作中,一般lock_guard(推荐使用);用这个defer_lock的前提是 你不能自己先lock,否则会报异常。这样等待一段时间的时候,另一个线程也在等待这个锁头,就会造成阻塞。

2023-10-30 19:31:28 101

原创 C++并发与多线程(10) | 死锁

只有两个互斥量才会产生死锁问题。举个例子:两个锁——金锁,银锁和两个线程A,B(1)A执行时,这个线程先锁金锁,把金锁Lock()成功了,然后它去lock银锁。出现了上下文切换(2)B执行了,这个线程先锁银锁,因为银锁还没有被锁,所以银锁lock()成功了,B然后就去lock金锁。这个A因为拿不到银锁头,流程走不下去,是不是意思是因为银锁被B锁定了,所以这个A里面去lock银锁的代码运行不下去,被卡着不动!在这个情况下,线程 A 因为无法获得银锁而被阻塞,因为银锁已经被线程 B 锁定了。

2023-10-30 17:01:23 168

转载 C++并发与多线程(9) | 线程安全访问控制

由于两个线程函数是同时的,因此这个时候在线程函数thread2中,由于mutex1已经在线程函数thread1中被锁定了,所以在线程函数thread2中拿不到mutex1的锁头了,因此这个时候是被在。必须保证加锁的顺序是一样的,比如先加的锁后解锁, Lock1 Lock2 Unlock2 Unlock1 ,则其他地方的加锁顺序,必须与这里的顺序一样,这个<<输出运算是全局的,因此也是本身线程不安全的,可以被多个线程访问,因此我们常常发现用cout打印输出,控制台的输出顺序是混乱的。

2023-10-30 10:43:29 145

原创 C++并发与多线程(8) | 互斥量

这就是为什么在多线程编程中,你需要使用同步机制,如互斥量、条件变量等,来确保线程之间的正确协作和共享资源的安全访问,而不是依赖于线程的创建顺序。然而,当涉及多个线程时,线程之间的执行顺序是不确定的,因此在多线程编程中,你需要格外小心,确保多个线程之间的共享资源访问是线程安全的。这意味着线程内的操作通常是原子的,不需要额外的同步措施来保护线程内的数据访问,因为在同一个线程内,不会有其他线程干扰。线程的执行顺序是由操作系统调度的,取决于各种因素,包括处理器的可用性、线程的优先级等。对象超出作用域时自动解锁。

2023-10-25 21:51:44 130

原创 C++并发与多线程(7) | 创建多个线程时数据共享的问题

借助vector存放多个线程thread对象,借助查看运行结果,发现有些乱,因为各个线程是并发执行的,与操作系统内部的运行调度机制有关。主线程也是等待了所有子线程运行结束才结束。

2023-10-25 13:38:37 448

原创 C++并发与多线程(6) | 传递临时对象作为线程参数的一些问题Ⅲ

(1)mutalbe的中文意思是“可变的,易变的”,是constant(即C++中的const)的反义词。在C++中,mutable也是为了突破const的限制而设置的,被mutable修饰的变量将永远处于可变的状态。使用这个函数修饰子线程的临时对象,这样成员变量m_i不用mutable进行修饰,而且myprint2()的输入参数(引用的方式)也不需要const进行修饰了。可以发现m_i值修改的时候,对象的地址实际上是不一样的,即使前面是const修饰的类对象。这里有一个需要注意的地方,就是在子线程中,

2023-10-24 11:40:01 401

原创 c++ 并发与多线程(5)传递临时对象作为线程参数的一些问题Ⅱ

上一篇()提出了传递临时对象作为线程参数的问题,本节借助一个线程ID的概念来更好地理解。

2023-10-23 19:02:53 158

原创 c++ 并发与多线程(12)线程安全的单例模式-2

(1)内部静态变量的懒汉单例是一种线程安全的懒汉单例模式,它利用了C++11的特性,即在局部静态变量(local static variable)上使用线程安全的延迟初始化。(6)在类的成员函数内部声明的静态变量通常用于维护特定于该函数或方法的状态,而不是与整个类相关的状态。(4)内部静态变量来实现懒汉单例模式的优势在于它具有很好的线程安全性,而不需要额外的锁定。(2)请注意,C++11内部静态变量的线程安全性是由C++标准库来保证的,因此无需手动加锁,代码非常简洁和高效。可以看到控制台输出终于正常了!

2023-10-23 15:36:56 633

原创 c++ 并发与多线程(12)线程安全的单例模式-1

单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。

2023-10-23 08:41:26 384

原创 C++并发与多线程(4) | 传递临时对象作为线程参数的一些问题Ⅰ

(1)若传递int这种简单类型参数,建议都是值传递,不要用引用,避免节外生枝。(2)如果传递类对象,避免隐式类型转换(eg: char *->string)。全部都在创建线程这一行就构建出临时对象(

2023-10-08 22:09:47 249

原创 C++并发与多线程(3) | 其他创建线程的方式

,所以执行完主线程后,ta会被销毁,但是所复制的TA对象依旧存在,因此就不存在对于main中所创建的对象ta,也就不会出现因为ta对象被销毁时,子线程崩溃的问题!即使对象(Ta类的对象ta)被析构了,拷贝得到的对象还是能继续在子线程中运行。这里就是子线程复制的对象(ta的复制对象)先析构,然后主函数里的ta对象在join()之后结束主线程时析构了。所以对于这个问题,只要保证这个类对象中没有引用,没有指针,就不会产生问题了。),所以执行完主线程后,ta会被销毁,但是所复制的TA对象依旧存在。

2023-10-08 19:41:02 101

原创 C++并发与多线程(2) | 线程运行开始和结束的基本方式

当程序运行起来,生成一个进程,该进程所属的主线程开始自动运行。当主线程从main()函数返回,则整个进程执行完毕。主线程从main()开始执行,。,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,一般情况下,。。(这条规律有例外,后续说明)子线程创建的步骤:1)包含头文件thread2)要写初始函数3)在main中写启动这个子线程。运行效果:这个代码是有两个线程在跑的——有两条线同时在走。即使一条线堵住了,另一条还是可以走的。(1)创建了线程,线程执行起点(入口)myprint()

2023-10-07 21:21:11 195

转载 C++并发与多线程(1) | 并发、进程和线程的基本概念

(1)线程是用来执行代码的;(2)把线程理解成一条代码的执行通路,一个新线程代表一条新的通路。(3)一个进程自动包含一个主线程,主线程随着进程默默地启动并运行,我们可以通过编码来创建多个其他线程(非主线程);但是创建的数量最大都不建议超过200-300个,至于到底多少个合适,大家在实际的项目中可以不断调整和优化,有时线程太多的时候效率反而会降低。(4)因为主线程是自动启动的,所以一个进程中最少也是有一个线程(主线程)。(5)多线程程序可以同时做多个事,所以运行效率高。

2023-10-07 12:57:49 89

原创 SAM资料

(5)(6)(7)(8)(13)

2023-10-06 15:44:08 138

原创 sam和mobilesam导出onnx的问题

环境:python==3.10,torchvision==0.12.0+cu113 onnx==1.12.0 onnxruntime==1.13.1我们在mobilesam工程(sam工程一样的)导出onnx的时候默认出现:”ValueError: Unsupported ONNX opset version: 16“然后我们就按照一些资料,将opset降低到使用13,结果还是不行:”repeat_interleavefor idx, r_split in enumerate(r_splits):

2023-10-06 10:57:33 746

原创 In-Place操作及onnx导出

out-of-place只是分配新对象并保留对旧计算图的引用,而in-place操作则需要将所有输入的创建更改为代表此操作的函数。out-of-place只是分配新对象并保留对旧计算图的引用,而 in-place 操作则需要将所有输入的创建更改为代表此操作的函数。这就是为什么我建议使用 PyTorch 标准的in-place 操作(如上面的in-place ReLU) ,而不是手动实现。就地操作:是直接更改给定Tensor的内容而不进行复制的操作,即不会为变量分配新的内存(不分配新的对象)。

2023-09-19 20:44:44 171

原创 QT学习之资料

(1)(2) (3)(4)(5) (6)(7)

2023-09-18 13:52:04 66

原创 Transformer和attention资料

(6)(7)(8)(9)(10) (11)(21)

2023-09-15 18:17:17 101

原创 openvino资料

(1)(2)(3)(4)(5) (6)(7)(8)(9)(10)

2023-09-15 15:18:05 57

原创 Halcon学习之一维测量实战之测量矩形(一)

大家还记不记得,我们之前文章中介绍的芯片那个,芯片那个就是每次旋转都用模板匹配找到它,然后测量矩形跟着它转,然后来做测量。我们后面还会涉及到拟合的问题,这个地方测量是测量直线、弧形这种距离。后面我们涉及到求角度,点到直线的距离,点到弧线的距离,这就会涉及到拟合。然后我们可以看到上面的代码,仍然是形成测量矩形,2个测量矩形,两次测量,然后关闭两个测量句柄!测量充电器的引脚,然后每次旋转充电器,让测量矩形都跟着它转,这就是定位+测量,我们要测量这个钥匙的尺寸,就是要当我们的相机垂直我们的待测物体钥匙的时候。

2023-08-02 00:05:08 617

原创 openvino批量推理资料汇总

1、2、3、 4、 5、6、 7、21、

2023-08-01 09:06:28 226

原创 openvino资料(1)

1、2、3、4、5、6、7、 8、9、10、24、25、26、

2023-07-27 15:10:56 110

原创 Halcon学习之弧形测量

本文继续学习记录弧形的测量,之前的章节是一维测量中的直线测量。以上图片是测量弧形图。之前我们学习的叫测量矩形,这里就是测量弧形!在测量的时候只是从创建矩形改为创建弧形,其他的套路是完全一样的!我们在做测量项的时候都是:第一步:采集图像第二步:标定第三步:畸变矫正,这是由于万一你是两条直线,由于畸变变成了两条弧线了,这距离肯定就不对了第四步:测量。创建测量矩形或者创建测量弧形,得到像素距离第五步:将像素距离根据前面标定的相机的内参和外参转化为实际坐标的距离,从而得到尺寸第六步:显示。

2023-07-24 00:15:36 661

原创 2d相机和3d相机的联合标定

这个过程通常涉及到将2D相机和3D相机的投影过程合并成一个统一的模型,并使用优化算法来求解需要注意的是,2D相机和3D相机的联合标定是一个复杂的过程,需要充分理解相机成像模型和优化算法。在相机标定过程中,定义棋盘格的尺寸和数量以及标定板上的角点坐标是为了建立一个理想情况下的标定板模型,以便进行相机参数的估计和校正。因此,使用标定板上的棋盘格作为标定对象,可以通过检测角点并与已知的实际物理尺寸进行比较,从而估计和校正相机的参数,以便后续的计算机视觉任务。标定板和棋盘格是用于相机标定的关键元素。

2023-07-18 19:42:11 926

原创 Halcon学习之一维测量(3)

带定位器的测量。首先看一下“定位”是什么意思?回答:比如我们测量一个芯片,这时候我们设置一个测量矩形,来沿着测量目标进行测量。但是下一张当芯片的位置发生变化时,测量矩形的位置就不对了,就不是沿着测量目标了。这样就不对了!芯片在转,测量矩形也要跟着一起转才行。这个时候就需要“定位”来起作用了!定位之后得到这个芯片的旋转角度之后,测量矩形可以跟着这个角度转。这就是“定位”+“测量”,这是我们工业视觉常用的一个手法,在Halcon里面也是有例子展现的。

2023-07-06 23:07:06 407

转载 pytorch中的torch.argmax函数

结论:dim的取值为[-2, 1]之间,只能取整,有四个数,0和-2对应,得到的是每一列的最大值,1和-1对应,得到的是每一行的最大值。如果参数中不写dim,则得到的是张量中最大的值对应的索引(从0开始)。比如x = torch.randn(3, 5),三行五列的矩阵,就是当dim=1时,就是说明结果是3个数字了,dim=0时,就是结果为5个数字。(2)此外不指定dim维度的时候,是直接按照顺序对所有元素进行遍历。1.6297这个元素就是最大的,其索引等于平铺后的15个元素中的第8个,即索引为9。

2023-07-05 16:04:44 402

原创 Halcon学习之一维测量(2)

通过这个测量边缘的函数,可以获得RowEdge、ColumnEdge、30(最小边缘幅度,即被找边缘的所在边缘的最小灰度值是多少)和Amplitude(所找到的这些边对应的灰度值,边缘幅度)、Distance(两个相邻边缘的距离)。表示所有相邻引脚的距离求和,然后除以距离数组PinDistance的元素个数,这里是74-1=73个,注意这个相邻引脚的距离就是相邻边缘对之间的距离(边缘对之间的距离,前面也说过就是两个边缘对中心点的距离)这个函数就是不使用边缘对的,现在得到的这些边缘都是独立的了。

2023-07-01 01:09:30 181

工业表面缺陷论文的总结

适合研究工业表面缺陷检测的学生和从业人员

2020-12-23

点云数据基本处理及应用

本文档比较适合刚接触激光雷达点云数据的学习者,包括点云数据的获取,处理讲解。

2018-05-25

微信公众平台应用开发方法、技巧与案例

该资源里面是关于微信公众平台开发的方法、详细技术、并且提供开发案例

2018-05-20

统计学习方法(统计学书,适合学习机器学习入门)

该资源是一本很不错的数理统计学方法书,可以当做一本工具书,特别对于机器学习的学习者,必读。

2018-05-20

空空如也

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

TA关注的人

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