自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(438)
  • 资源 (1)
  • 收藏
  • 关注

原创 二进制人工智能 博客精选

机器学习的数学基础机器学习PytorchPython信号与系统图像处理与计算机视觉OpenCV C++ Python

2022-06-04 19:09:16 1659 1

原创 【C++并发编程】(十三)递归锁

递归锁允许同一线程多次锁定同一个锁,而不会导致死锁。每次加锁操作会增加锁的计数器,但不会阻塞线程;每次解锁操作会减少计数器,当计数器为零时释放锁。与互斥锁一样,递归锁同样可以使用锁管理器,例如。,进行生命周期的自动管理。

2024-07-19 15:43:42 318

原创 【C++并发编程】(十二)自旋锁

在多线程并发的环境中,线程的阻塞和唤醒通常需要涉及操作系统的调度器,进行线程上下文的切换。自旋锁通过忙等待的方式,避免了线程阻塞和系统调度器介入,从而减少了这部分开销。但也需要注意,自旋锁适用于临界区较小且短时间内能够获取锁的情况。如果临界区较大,自旋锁会导致线程长时间占用CPU资源,反而降低系统的整体性能。与传统的互斥锁相同,自旋锁也是一种用于保护共享资源的同步机制,不同都是,自旋锁在尝试获取锁时不会立即进入阻塞状态,而是循环检查锁的状态(自旋),“忙等”直到获取到锁为止。只有两种状态:被设置(

2024-07-17 22:17:09 320

原创 【C++并发编程】(十一)读写锁

读写锁是一种同步机制,它允许多个线程同时以共享模式(读模式)访问共享资源,从而提高了并发读取的效率;然而,在任何一个线程需要独占访问(写模式)以修改共享资源时,它将阻止其他所有线程(无论是读模式还是写模式)访问该资源,以确保数据的一致性和完整性。

2024-07-16 16:37:49 185

原创 【C++并发编程】(十)生产者-消费者模型

生产者-消费者模型是一种经典的并发编程模型,旨在解决多线程环境中负责生成数据或任务的线程(生产者)与负责处理数据或任务的线程(消费者)之间的协作与数据共享问题。:用于存放由生产者生产,被消费者处理的数据或任务。这个缓冲区通常是一个队列。:用于确保生产者和消费者线程之间的有效协调和数据安全共享。

2024-07-08 22:18:12 238

原创 【C++】Google Test(gtest)单元测试

测试夹具(Test Fixture)用于提供一个环境,允许开发者在多个测试用例之间共享设置和清理的代码,确保每个测试用例都在相同或可控的初始状态下运行。是一种软件测试方法,它旨在将应用程序的各个部分(通常是方法或函数)分离出来并独立测试,以确保每个部分都能够按预期工作。为测试用例的名称,用于将相关的测试分组在一起,以便在测试结果中更容易地识别和归类。味前缀的致命断言,其在测试失败时程序立即终止。为前缀的非致命断言,其在测试失败时程序会继续执行;为具体测试的名称,一般描述测试的目的。方法中,初始化了一个。

2024-07-06 19:44:12 1667 2

原创 【C++设计模式】(二)设计模式简介

亚历山大提出了一系列在建筑设计中常见的、能够解决特定问题的模式,这些模式可以在不同的建筑设计中重复使用。:包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。这些设计模式关注的是对象之间的交互和职责分配,通过解决对象间职责分配和通信问题来应对需求变化对多个交互对象带来的影响。:包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。:包括单例模式、工厂方法模式、抽象工厂模式、生成器模式、原型模式。

2024-07-05 22:26:44 555

原创 【C++设计模式】(一)面向对象编程的八大原则

面向对象编程有一系列的设计准则来保证软件的质量,包括:单一职责原则,开放-关闭原则,里氏替换原则,接口隔离原则,依赖倒置原则,迪米特法则/ 最少知识原则,合成复用原则,针对接口编程而不是针对实现编程原则。接口,然后让战士、法师、盗贼等角色类都实现这个接口,那么我们就可以在不修改已有代码的情况下,通过添加新的角色类或者修改接口的实现来扩展或修改游戏的行为。例如,USB接口能够连接不同类型的设备(如打印机、键盘、鼠标),这些设备通过共同的接口(USB接口)与电脑通信,而不需要知道每个设备的具体实现细节。

2024-07-04 19:32:36 1085

原创 【C++并发编程】(九)线程池

在这个表达式中, 工作线程在无限循环中等待新任务: 每个工作线程在等待时,会尝试获取任务队列的互斥锁。一旦有任务添加到任务队列中,或者接收到停止信号,线程会被唤醒,并执行后续的指令。它的基本概念是将一组预先创建的线程放入一个池中,需要执行任务时,从池中获取空闲线程来处理任务,任务完成后,线程不会被销毁,而是返回池中等待下一个任务。当线程池中的工作线程空闲时,它们会从任务队列中取出任务并执行。线程池在初始化时创建一定数量的工作线程,并在销毁时确保所有工作线程都正确结束。:工作线程负责执行分配给线程池的任务。

2024-06-27 16:33:35 504

原创 【C++并发编程】(八)信号量

信号量的计数值是一个非负整数,表示可用资源的数量。如果信号量的计数值为0,则线程或进程将被阻塞,直到信号量的计数值大于0。为了有效管理这些预订,店主可以采用类似于计数信号量的系统来确保桌子的合理分配和预订管理。二值信号量只有两个状态(0 和 1),类似于互斥锁,主要用于控制单个资源的访问。信号量可以用于线程间的同步,使得某些操作按特定顺序执行,从而避免竞态条件的发生,也可以限制对共享资源的并发访问数量,以防止资源过载。创建,并指定其最大计数值(桌子数量)和初始计数值(空闲的桌子数量)。

2024-06-25 10:11:01 815

原创 【C++面向对象编程】(二)this指针和静态成员

当我们创建一个类的多个对象时,这些对象的成员函数的代码是共享的,也就是说,无论我们创建多少个类的对象,这些函数的代码都只有一份。为了在这些共享的成员函数内部引用和修改特定对象的成员变量,C++提供了。类的静态成员(包括静态成员变量和静态成员函数)在所有类的对象之间是共享的,只存在于一个数据存储区域。类的非静态成员(包括成员变量和成员函数)是类的每个对象所独有的。指针传递自己的地址给该函数,以便函数能够访问和修改该对象的成员变量。指针是一个隐式的指针,它指向调用非静态成员函数的对象。使用C++17新增的。

2024-06-07 20:57:19 1015

原创 【C++面向对象编程】(一)类,对象和四大机制(封装,继承, 多态 ,抽象)

当我们说“我的朋友叫张三”时,“张三”就是一个对象,他是根据“人类”这个类制造出来的具体实例。张三可能有他自己的名字、肤色、年龄等独特的属性,并且他的说话风格,走路姿势,思考方式等也会与其他人不同。对象:每一个对象都是根据类创建的具有其属性和方法的实例,并且具有唯一的身份标识(如内存地址)和自己独特的属性值。成员变量是类中的变量,用于存储与类相关的数据。封装隐藏了对象的内部实现细节,只暴露必要的接口,提高了代码的可维护性和安全性。换句话说,类的成员包括变量(也称为类的属性)和函数(也称为类的方法)。

2024-05-30 16:03:42 767

原创 【C++】GNU Debugger (GDB) 使用示例

如果使用CMake编译你的C++项目,并希望包含调试信息以便使用GDB进行调试,你需要在CMakeLists.txt文件中指定构建类型为Debug。GDB(GNU Debugger)是一种Unix下的程序调试工具,用于调试C、C++等编程语言编写的程序。中,编写一个简单的C++程序,该程序包含一个错误的函数。在项目的根目录下,创建一个构建目录并运行CMake。现在,我们已经构建了程序,可以使用GDB进行调试。首先,我们创建一个目录,并在其中创建必要的文件。函数中的错误,然后重新构建并再次调试。

2024-05-08 14:36:44 1116

原创 【C++泛型编程】(二)标准模板库 STL

C++ 的标准模板库(Standard Template Library,STL)旨在通过模板化的设计,提供一种通用的编程模式,使程序员能方便地实现和扩展各种数据结构和算法,提高程序的开发效率和执行效率。仿函数/函数对象是一个行为类似于函数的对象,可以被调用,并且可以在泛型编程中用作函数参数,用于定义算法的行为策略 (允许我们为算法提供自定义的比较、判断或操作规则)。关联式容器内部通常使用红黑树(对于有序的容器)或哈希表(对于无序的容器)来实现,以支持高效的查找、插入和删除操作。

2024-05-07 20:58:09 1054

原创 【C++泛型编程】(一)函数模板和类模板

C++泛型编程(Generic Programming)是一种编程范式,它允许程序员编写与参数无关的代码,也就是说这些代码可以在多种数据类型上重用,而无需为每个类型重新编写。函数模板允许程序员编写一个通用的函数,该函数可以接受不同类型的参数,并在编译时根据提供的参数类型生成特定的函数版本。类模板则允许你编写一个通用的类,该类可以在编译时根据提供的类型参数生成特定的类版本。全特化:全特化是指对模板的所有模板参数都进行特化处理。在使用类模板时,需要为模板参数指定具体的类型。这样的具体类型提供特定的实现。

2024-05-07 10:40:02 306

原创 【C++并发编程】(七)异步编程

在这个示例中,异步任务(计算5的平方)需要2秒钟来完成。异步编程(Asynchronous Programming)是一种编程模型,它允许程序在等待某个操作(如I/O操作、网络请求等)完成时,不阻塞当前线程的执行。在并发编程中,可以使用异步编程来避免线程阻塞,提高资源的利用率。这个函数接受一个可调用的对象(如函数、Lambda 表达式、函数对象等)作为参数,并在一个单独的线程(或可能是线程池中的线程,具体取决于实现)上异步执行它。,这时如果异步任务还没有完成,主线程将会被阻塞,直到结果可用。

2024-05-06 15:57:15 226

原创 【C++并发编程】(六)死锁问题

死锁(Deadlock)是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(或线程)称为死锁进程(或线程)。为了解决上述代码中的死锁问题,我们可以使用一种称为“锁顺序”或“锁排序”的策略,即确保所有线程都以相同的顺序请求锁。函数会尝试以原子方式锁定多个互斥锁,如果无法立即获得所有锁,它会阻塞直到所有锁都变得可用,或者抛出异常(取决于。来协调多个锁的锁定顺序了。

2024-05-06 09:17:50 402

原创 【C++并发编程】(五)原子操作

在多线程环境中,由于处理器缓存、指令重排和编译器优化等因素,内存访问的顺序可能并不总是按照代码中的顺序执行。原子操作通常比互斥锁具有更高的性能,但原子操作通常针对单个数据项(如一个整数或指针)进行,它们确保了对该数据项的访问是原子的,即不会被其他线程打断。原子操作是不可中断的操作,一旦开始,就必须完全执行完毕,不受其他线程干扰,可以确保多个线程在访问和修改共享数据时不会发生冲突,从而避免了数据竞争和相关的并发问题。类型提供了一系列操作保证了操作的原子性,即操作在执行过程中不会被其他线程打断。

2024-05-05 14:07:58 626

原创 【C++并发编程】(四)条件变量

条件变量(Condition Variable)用于线程间的同步,允许一个或多个线程在特定条件不满足时等待,并在条件满足时被其他线程唤醒。: 唤醒在该条件变量上等待的一个线程(如果有的话)。如果没有线程在等待,那么这个调用就没有效果。在这个例子中,我们创建了5个线程,每个线程都试图打印其ID。时,所有等待的线程都会被唤醒,并重新尝试获取互斥锁以继续执行。函数时,都会唤醒一个等待的线程来处理任务。因此,在需要使用条件变量(: 等待直到另一个线程调用该条件变量的。: 唤醒在该条件变量上等待的所有线程。

2024-05-04 15:24:35 383

原创 【C++并发编程】(三)互斥锁:std::mutex

当一个任务(或线程)持有互斥锁,且该互斥锁处于闭锁状态,那么这个任务可以执行访问共享资源的代码,其他任务(或线程)则不被允许。开锁后,该线程将失去了对互斥锁的所有权,其他正在等待的线程现在有机会获取这个互斥锁,以访问共享资源。如果互斥量当前没有被其他线程锁定(即它是可用的),则调用线程会成功获取锁,并继续执行其后续代码。如果互斥量已经被其他线程锁定,则调用线程会被阻塞(即它会停止执行,直到锁变得可用)。一旦线程获取了锁,它就可以安全地访问共享资源,而不必担心其他线程同时修改它。进行互斥锁的闭锁和开锁。

2024-05-04 13:04:03 840

原创 【C++并发编程】(二)线程的创建、分离和连接

在C++中,线程的分离(detach)和连接(join)是用于管理线程生命周期的两种主要方式。当创建一个线程时,你可以选择让它独立运行(即分离),或者等待它完成执行(即连接)。方法时,你告诉线程库你不再关心这个线程的结束时间,并且你不需要获取它的返回值。线程将在后台独立运行,直到其函数返回,结束。当你想在线程中执行某个有参数或无参数的函数时,你可以将该函数传递给。方法时,你告诉线程库你想要等待这个线程完成执行后再继续下去。你还可以传递类的成员函数和类的实例给线程。的线程将被阻塞,直到被连接的线程执行完毕。

2024-05-03 23:17:05 895

原创 【C++并发编程】(一)基本概念

多进程可以利用多核处理器,实现真正的并行处理。除此之外,还可以通过在同一时间段内,交替执行多个任务实现并发(多线程),只要交替的速度够快,在宏观上看起来就像是并行的。C++标准并未对进程间通信提供任何原生支持,所以使用多进程的方式实现,这会依赖与平台相关的API。线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位,使用进程所拥有的资源,并由进程中的一个执行序列来执行。进程是操作系统进行资源分配和调度的基本单位,它拥有独立的内存空间和系统资源,负责执行一个特定的程序或任务。

2024-05-02 21:39:12 795

原创 【C++】C++ 11 新特性:使用示例

是一个引用计数智能指针,它在构造时会将引用计数初始化为 1,每当有新的 std::shared_ptr 指向相同的对象时,引用计数加 1,当有 std::shared_ptr 超出作用域或被显式置为 nullptr 时,引用计数减 1。关键字用于显式指示一个成员函数覆盖了基类中的虚函数,它可以帮助检测错误,如果子类中的函数并没有正确地覆盖基类中的虚函数,编译器将产生错误。智能指针用于管理动态分配的内存的智能对象,可以在对象不再被使用时自动释放内存,避免了内存泄漏和悬空指针的问题。用于推导表达式的类型。

2024-05-01 00:38:30 1289

原创 【Numpy】np.add.at 示例

【代码】【Numpy】np.add.at 示例。

2024-04-29 14:09:21 245

原创 【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

ONNX Runtime(ORT) 是一个用于运行和执行 ONNX 模型的推理引擎。ONNX Runtime 提供了高性能、低延迟的深度网络模型滚推理,并且是跨平台的,支持各种操作系统和设备。为了验证ONNX Runtime和PyTorch原始网络模型计算的值是否近似,我们在一个进程进行。在使用ONNX Runtime进行推理之前,我们先使用ONNX API检查ONNX模型。指定,否则所有输入尺寸的输出ONNX图形中的输入大小都是固定的。将PyTorch中定义的模型转换为ONNX格式。

2024-04-25 16:29:27 2886

原创 【Pytorch】(十四)C++ 加载TorchScript 模型

要在C++中加载序列化的TorchScript模型,必须依赖于PyTorch C++API(也称为LibTorch)。最新的稳定版本的LibTorch可以从。下面将使用CMake和LibTorch构建一个C++应用程序,该应用程序加载并执行一个序TorchScript模型。以下内容将介绍如何在C++环境下加载和运行TorchScript 模型。include/文件夹包含程序需要包含的头文件,应该是解压缩的libtorch的完整路径。lib/文件夹包含必须链接的共享库,将Step 1相同的。

2024-04-25 10:32:20 856

原创 深度学习推理框架汇总

它支持跨平台部署,包括 CPU、GPU、移动设备等,并提供了 C++、Python 和 Java 等多种语言的 API。它提供了高性能、可扩展、灵活的模型部署和推理服务。TensorRTX:TensorRTX 是英伟达推出的一款基于 TensorRT 的深度学习推理框架,提供了更多的优化和扩展功能,适用于高性能和低延迟的推理需求。OpenVINO 是英特尔推出的深度学习推理工具包,支持针对英特尔 CPU、GPU、VPU(Vision Processing Unit)等硬件进行优化的推理。

2024-04-24 20:57:29 722

原创 【Pytorch】(十三)模型部署: TorchScript

用于将一个具体的输入示例追踪(trace)模型的一次计算过程,从而生成一个 TorchScript 模型。对于动态控制流(如条件语句),它只会记录每个分支中的一种情况。因此,它不适用于无固定形状输入、具有动态控制流的模型。用于将整个 PyTorch 模型转换为 TorchScript 模型,包括模型的所有逻辑和控制流。script适用于无固定形状输入、具有动态控制流的模型。但是,它可能会把保存一些多余的代码, 产生额外的性能开销。因此,可以将两者混合使用,扬长避短。

2024-04-24 19:32:27 2064 2

原创 【C++】项目级的组织结构与Cmake编译

并在其中写函数的定义。:存放编译生成的对象文件。,并在其中写函数的声明。(1) 创建后缀名为。(2) 创建后缀名为。:存放可执行程序文件。将在bin目录下生成。

2024-04-23 16:20:10 546

原创 【数字图像处理】二值图和灰度图的形态学处理

也就是说用结构元素找出在目标图像内部可以完全放下该结构元素的值为 1 的区域。腐蚀具有缩小图像中的物体和消除图像中比结构元素小的成分的作用。将原图中的一个非零点不断膨胀,然后与原图相交,得到连通分量,之后将连通分量从原图去掉;求某点的腐蚀运算就是计算该点结构元素覆盖范围内各点最小值作为该点的腐蚀结果。求某点的膨胀运算就是计算该点局部范围内各点的最大值作为该点的膨胀结果。经膨胀运算后,图像亮的区域范围将扩大。使用击中击不中获取与结构元素相同形状的图像边缘像素,然后将其删除,通过迭代多。, 那么称B击不中A。

2024-04-02 19:29:14 1175

原创 【Vim】单行与多行缩进

单行缩进多行缩进

2024-04-02 10:23:41 447

原创 【数字图像处理】颜色空间的转换

HSI/ HSV 颜色空间模型是从人的视觉系统出发, 用 H (Hue)、 S(Saturation)、 I(Intensity) 或 V(Value) 分别代表色调、 色饱和度、 亮度三种独立的颜色特征。CMY 颜色空间正好与 RGB 颜色空间互补, 即用白色减去 RGB 颜色空间中的某一颜色值就等于这种颜色在 CMY 颜色空间中的值。YCbCr 颜色空间采用一个亮度信号 (Y) 和两个色差信号 (Cb , Cr ) 来表示。对于[0,1]的 R、G、B 值,HSV 各个分量计算如下。

2024-04-01 14:46:33 1162

原创 【数字图像处理】图像的最近邻插值、双线性插值和双三次插值

用OXY表示H×W的原始图像,GXY表示H×Y的目标图像。

2024-04-01 10:53:38 945

原创 【数字图像处理】图像的频域滤波

高斯陷波滤波器:陷波滤波器可以阻止或允许以某个频率为中心的邻域里的频率通过,例如,设。分别为两个频率中心到矩阵中包含的任意一点。是频率矩阵中心到矩阵中包含的任意一点。竖直条纹噪声反应在频谱图中的。高频提升滤波器是高通加全通。

2024-03-28 09:50:34 673

原创 【数字图像处理 】 灰度变换增强图像

对数变换的作用是对图像的低灰度范围进行扩展,并对高灰度范围进行压缩,得到的结。时,扩展图像暗区、压缩图像亮区。暗区对比度增强、亮区对比度减弱。时,压缩图像暗区,扩展图像亮区。暗区对比度减弱,亮区对比度增强。直方图均衡化映射函数。

2024-03-26 21:12:14 969

原创 【数字图像处理】改变图像灰度级别

灰度级别为4时,原始图像中属于[0, 64)的值被量化为0,属于[64,128)的值被量化为64,属于[128,192)的值被量化为128,属于[192, 256)的值被量化为192.灰度级别为2时,原始图像中属于[0,128)的值被量化为0,属于[256)的值被量化为128。灰度级别256,128,64,32,16,8,4,2 对应。改变图像灰度级别与压缩量化的区别?首先,进行灰度级量化。

2024-03-26 10:36:30 1247

原创 【OpenCV C++&Python】(五)图像平滑(模糊)

高斯滤波它在滤除图像中噪声信号的同时,也会对图像中的边缘信息进行平滑。下面简单介绍OpenCV中常用的滤波方法,包括均值滤波、高斯滤波中值滤波和双边滤波。最常见的滤波器是线性的,其输出的像素值(即。高斯滤波是线性的,通过高斯核与输入图像的卷积进行计算,在OpenCV中可以通过函数。图像平滑,又称图像模糊,是一种简单而常用的图像处理操作,常用于图像去噪。中值滤波器遍历图像的每个元素,并将每个像素替换为核区域内所有像素的中值。输出的每个像素是它的核覆盖的所有像素的平均值。均值滤波(核大小递增:1,3,5,…

2024-03-22 11:05:22 1442

原创 多进程并发 v.s.多线程并发

如果任务需要大量的数据共享和高效的任务切换,那么多线程可能更加适合,因为线程间的上下文切换比进程要快且共享同一进程的内存空间。如果任务需要更多的数据隔离和安全性,多进程可能是更好的选择,因为进程拥有独立的内存空间。

2024-03-19 10:01:57 515

原创 【PCL】(三十四)基于八叉树的点云空间变化检测

【代码】【PCL】(三十四)基于八叉树的点云空间变化检测。

2024-03-18 19:06:47 431

原创 【PCL】(三十三)八叉树搜索

八叉树是一种用于管理稀疏三维数据的基于树的数据结构。每个内部节点正好有八个子节点。在本教程中,我们将学习如何在点云数据中使用八叉树进行空间分区和邻居搜索。特别地,我们解释了如何执行“体素搜索中的邻居”、“K最近邻居搜索”和“半径搜索内的邻居”。

2024-03-18 17:03:33 359

基于法线差的点云分割 数据

基于法线差的点云分割 数据

2024-03-09

基于法线差的点云分割 数据样例

基于法线差的点云分割 数据样例

2024-03-09

PCL(十八)从距离图像中提取点云的边界 数据

PCL(十八)从距离图像中提取点云的边界 数据

2024-03-05

PCL (十七)距离图可视化 点云数据

PCL (十七)距离图可视化 点云数据

2024-03-04

实例讲解Dataset 和 DataLoader的 zoro数据集

【pytorch】(二)实例讲解Dataset 和 DataLoader 用到的数据

2022-01-22

空空如也

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

TA关注的人

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