自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tecsai的博客

呼哥,听我说!

  • 博客(118)
  • 资源 (4)
  • 问答 (4)
  • 收藏
  • 关注

原创 卡尔曼滤波(1):初探黄金五公式

卡尔曼滤波是一个递归算法,可以用在任何存在不确定信息的系统中。

2024-05-21 14:52:34 415

原创 C++(24): C++17探索:std::variant的使用

std::variant是C++标准库中的一个模板类,它允许我们在一种类型安全的方式下存储多种类型的值。它的行为类似于C语言中的联合体(union),但提供了更多的类型安全性和功能。与C语言的联合体不同,std::variant跟踪其当前持有的类型,并确保在使用时不会出现未定义的行为。

2024-05-21 14:13:15 255

原创 C++(23): C++:STL中的时间库(std::chrono)

C++ STL库中的 chrono 是一个关于日期和时间的库,它提供了一套丰富、灵活且类型安全的API,用于测量和操作时间。chrono 库是C++11标准的一部分,它使得我们可以进行高精度的时间测量,以及执行基于时间点的算术操作。

2024-05-15 13:43:37 564

原创 C++(22): C++:STL中的部分计算接口(std::accumulate、std::partial_sum等)

C++ STL库中的算法组件提供了大量用于操作序列的算法函数。这些函数通常以迭代器范围为操作对象,可以非常方便地对容器中的元素进行各种操作,而不需要写循环。下面我会详细介绍几个常用的算法函数,特别是accumulate,并提供相应的例程。 本文将简单介绍std::accumulate、std::sort、std::find、std::count、std::partial_sum等函数,并给出其使用例程。

2024-05-15 13:39:31 982

原创 C++(21): C++:std::vector与std::deque比较

std::vector和std::deque都是C++标准库中的容器,它们有一些相似之处,但也有很多重要的区别。以下是它们的相同点和不同点,以及各自的优点。

2024-05-13 09:58:43 858

原创 C++(20): C++:异常的抛出与捕获(throw, try-catch)

在C++中,异常捕获与处理是一个强大的错误处理机制,它允许程序在执行过程中遇到错误时,能够以一种更加结构化和控制良好的方式来处理这些错误。C++提供了try, catch, throw等关键字来实现这一功能。

2024-05-11 08:04:22 302

原创 Linux系统应用与设置(1):比较、生成补丁以及应用补丁(diff与patch指令)

在我们应用Linux系统或基于Linux系统做一些软件应用开发时,经常会遇到需要将文件的改动记录下来,并且讲这些改动和差异应用到其他的Linux系统时,我们会用到diff和patch指令。 在Linux中,diff和patch是两个非常有用的命令行工具,它们通常一起使用,用于比较文件差异和应用这些差异。这两个工具在软件开发、版本控制和系统管理中特别有用。

2024-04-28 17:26:38 910 1

原创 C++(19): C++:std::string的使用

C++的 std::string 类是C++标准库中的一个非常重要的类,用于表示和操作字符串。std::string 提供了大量的成员函数,可以方便地对字符串进行各种操作,如连接、比较、查找、替换等。相比于C语言的字符数组,std::string 更加安全,易于使用,且功能更加强大。

2024-04-28 13:53:42 1092

原创 C++(18): C++:std::bind的使用

std::bind是C++11标准库中的一个功能强大的函数适配器,它可以将一个可调用对象(函数、函数指针、函数对象或者成员函数指针)与其参数绑定,生成一个新的可调用对象。这个新的可调用对象可以像普通函数一样被调用,但是其内部实际上执行的是我们绑定的原始可调用对象。 虽然在C++11之后引入了lambda表达式可以替代并实现std::bind的功能,但是我们在此还是做一下简单的介绍。

2024-04-27 16:26:33 539

原创 Linux应用开发(11):Linux进程间通信(IPC):共享内存

Linux系统中实现进程间通信(IPC,Inter-Process Communication)有多种手段,共享内存(Shared Memory)作为一种其中比较高效的IPC机制,允许两个或多个进程共享一个给定的存储区。 这种通信方式是(几乎是)最快的IPC方式,因为进程是直接对内存进行访问,不需要像管道和消息队列一样进行数据的拷贝。持有相同区域共享内存的进程可以直接读写这块内存,无需进行数据拷贝,从而提高了通信速度。

2024-04-24 14:22:50 460 1

原创 Linux应用开发(10):Linux进程间通信(IPC):信号

在Linux系统中,信号是一种原始且功能强大的进程间通信(IPC)机制。信号可以被发送给一个进程,以通知它发生了某些事件,进程可以选择处理信号或忽略它。信号主要用于通知进程某些紧急情况,或者触发进程执行特定的操作。 信号是一个软件中断,用于通知进程发生了某种情况。每个信号都有一个唯一的编号和一个预定义好的默认动作。当进程接收到一个信号时,它会根据信号的类型和进程对该信号的处理方式来作出响应。信号可以用于多种目的,如终止进程、中断系统调用、或者在进程中执行一个预设的信号处理函数。

2024-04-23 10:35:29 899

原创 Linux应用开发(8):Linux进程间通信(IPC):管道

我们在前面已经介绍了进程间通信(IPC)常用的“消息队列”。本节将讲解另外一种常用的IPC机制,我们称作管道。 管道可以理解为一种特殊的文件,也可以理解为一种特殊的缓冲区,它允许两个进程通过一个半双工的通道进行数据通信。

2024-04-23 10:29:28 843

原创 Linux应用开发(8):Linux进程间通信(IPC):管道

无名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程),它之所以成为无名管道,是因为它们不需要文件系统中的文件支持。管道可以理解为一种特殊的文件,也可以理解为一种特殊的缓冲区,它允许两个进程通过一个半双工的通道进行数据通信。在使用时,首先需要文件系统中有一个路径和名称,因此命名管道是可以允许不相关的进程进行通信。无名管道顾名思义,是没有被命名的管道,其存在于内存中,仅允许相关的两个进程间进行通信。在构建模块化的C++应用程序时,管道可以帮助你将不同的功能模块化为独立的进程,并通过管道进行通信。

2024-04-21 14:53:45 882

原创 PyTorch学习(7):常用损失函数(CrossEntropyLoss, BCELoss, BCEWithLogitsLoss, L1Loss, MSELoss)

在深度学习训练过程中,损失计算是非常重要的一环。有一种论调叫做“损失函数的设计在一定程度上决定了模型能干什么”。 PyTorch提供了许多损失计算函数,包括torch.nn.L1Loss,torch.MSELoss,torch.nn.CrossEntropyLoss,torch.nn.BCELoss,torch.nn.BCEWithLogitsLoss等。 具体可以参考如下连接:torch.nn — PyTorch 2.2 documentation

2024-04-19 15:34:46 1228

原创 OpenCV杂记(2):图像拼接(hconcat, vconcat)

OpenCV提供了多种图像拼接的API,包括水平拼接cv:hconcat,垂直拼接cv::vconcat。此外,还可以通过创建一张大图,然后使用copyTo接口将小图像依次覆盖的形式进行拼接。

2024-04-19 10:14:53 889 2

原创 YOLOv9(5):YOLOv9可编程梯度信息PGI(Programable Gradient Infomation)

PGI是YOLOv9的一大特色。为了丰富网络训练过程中,梯度反馈的路径(主要是梯度反馈宽度),尽量减少在训练过程中的网络信息丢失,作者添加了一个PGI(Programable Gradient Infomation)模块。 PGI模块的引入,从宏观上看,就像是网络新加了一条Detect分支(此处将类似以往YOLOv3/5/8等的3条不同分辨率的head路线称为一个Detect分支)。作者将这一条增加的分支乘坐“辅助可逆分支”,用来产生“可信梯度信息”。

2024-04-18 16:47:00 371

原创 C++(17): C++:模板函数与模板类

泛型编程是一种编程风格,可以开发一套代码适应不同的数据类型。C++中,泛型编程是通过模板来实现的。模板是C++支持参数化多态的工具,使用模板可以使用户为类属类型(如数组的元素类型和容器的数据类型)编写通用的代码,然后再编写特定的类型来创建类属类型的特定实例。模板是一种对类型进行参数化的工具,通常有两种形式:模板函数和模板类。

2024-04-18 16:46:32 156

原创 Linux应用开发(7):Linux进程间通信(IPC):POSIX消息队列

消息队列是Linux提供进程间通信的一种方式。当多个进程需要共享或交换数据时,就会用到消息队列。此外,消息队列还可以作为一个缓冲区,可以在处理速度不同的进程间提供数据交换。

2024-04-17 16:54:13 948

原创 OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)

我们使用OpenCV时,有时会在图像的某个位置绘制OSD信息,如绘制一些字符串作为指示信息。本文将简要介绍在图像(cv::Mat)上绘制固定的字符串信息。

2024-04-17 14:31:23 1414

原创 Linux应用开发(6):Linux信号量:POSIX和System V信号量

Linux的同步于互斥大致可以分为三个方式,分别是互斥锁,条件变量和信号量。他们针对不同的应用场景而被设计出来,其中互斥锁主要用于对共享资源的保护,条件变量用于控制操作的顺序,而信号量则用来控制对共享资源的访问数量。 Linux信号量是一种用于进程间同步和互斥的低级同步机制。信号量可以在多个进程或线程之间协调对共享资源的访问。在Linux中,主要有两种信号量:POSIX信号量和System V信号量。它们各自有不同的特性和用途。

2024-04-17 10:09:38 689

原创 Linux应用开发(5):通过系统服务部署应用自启动

在Linux系统中,将应用以服务的方式启动意味着该应用会在系统启动时自动运行,且通常以某种方式在后台持续运行。

2024-04-16 14:27:17 908

原创 C++(16): STL:函数对象(仿函数)

函数对象是“重载函数调用操作符”的类,由于其使用时类似于调用一个函数,所以也称作“仿函数”。 通俗来讲,就是我们构建一个类,在类的内部重载了“()”操作符,然后在使用的时候我们可以像调用函数一样来调用类的对象。 不同于普通的函数,函数对象可以拥有自己的状态。

2024-04-15 14:32:15 179

原创 C++(15): STL算法:排序(sort)

std::sort 是 C++ 标准库 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。 在实际应用中,std::sort 通常会根据输入数据的大小和特性自适应地选择一种合适的排序算法。例如,对于小型数据集,它可能会选择插入排序或选择排序等简单算法,因为这些算法在小规模数据上通常具有较低的常数因子。对于大型数据集,它可能会选择快速排序、归并排序或堆排序等更高效的算法

2024-04-11 15:58:33 680

原创 Linux应用开发(4):POSIX条件变量: pthread_cond_t

条件变量是多线程编程中用于线程同步的一种机制,它允许线程在某个条件不满足时挂起,直到该条件变为真。在这种情况下,条件变量起着线程间同步的作用。 在Linux系统中,默认提供了POSIX线程库pthread。 在POSIX线程(pthread)库中,条件变量通过pthread_cond_t类型表示。

2024-04-11 07:24:33 239

原创 C++(14): STL条件变量std::condition_variable

在C++的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继续执行。

2024-04-10 18:45:53 1316

原创 Linux应用开发(3):Linux时间操作(time、mktime、localtime等)

在Linux系统中,时间操作函数是编程中经常使用的一部分,它们允许程序获取和设置系统时间,以及对时间进行各种处理。以下是一些常用的时间操作函数的详细介绍。

2024-04-08 18:27:36 563

原创 Linux应用开发(2):Linux线程同步_互斥锁

在Linux系统中,pthread_mutex_t 是由 libpthread 线程库提供的互斥锁机制,它用于同步多个线程对共享资源的访问,以防止竞态条件和数据不一致的问题。pthread_mutex_t 提供了多种类型的互斥锁,包括普通的互斥锁、递归互斥锁、读写锁等,以适应不同的同步需求。 pthread_mutex_t 互斥锁的基本原理是通过原子操作来控制对共享资源的访问。当一个线程尝试获取已经被其他线程持有的互斥锁时,该线程会被阻塞,直到互斥锁被释放。互斥锁内部通常使用原子变

2024-04-08 08:28:10 802

原创 PyTorch学习(6):导出ONNX模型

在使用PyTorch进行模型训练时,我们通常希望将训练好的模型导出为ONNX(Open Neural Network Exchange)格式的文件。 ONNX(Open Neural Network Exchange)是一个开放格式,用于表示深度学习模型。它允许模型被不同的深度学习框架所使用,实现了模型的互操作性和可移植性。ONNX由Facebook和微软在2016年共同推出,旨在解决深度学习模型在不同框架和工具之间的兼容性问题。

2024-04-07 16:55:31 668

原创 C++(10): std::map、std::multimap与std::unordered_map

std::map、std::multimap 和 std::unordered_map 是 C++ 标准模板库(STL)中的三种关联容器,它们提供了存储键值对(pair)的方式,并允许通过键来快速检索值。这三者之间的主要区别在于它们的内部数据结构和对元素的排序方式。

2024-04-07 10:48:45 1103

原创 C++(13): 智能指针shared_ptr

shared_ptr智能指针,本质是“离开作用域会自动调整(减小)引用计数,如果引用计数为0,则会调用析构函数”。这样一来,就进化成类似于int、float等的一种会被自动释放的类型。

2024-04-03 08:53:29 901

原创 Python学习(1):装饰器

Python的装饰器理解起来相对简单,唯一的功能就是允许程序员在不修改原有函数定义的情况下,增加函数的新功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。使用装饰器可以实现很多有用的功能,比如在函数执行前后自动执行某些操作、缓存函数的返回结果、检查函数的参数类型等。装饰器有三种不同的形式,分别是无参装饰器,被装饰函数带参数和装饰器带参数。

2024-04-02 23:06:30 320

原创 PyTorch学习(5):并行训练模型权重的本地化与加载

在训练深度神经网络时,我们一般会采用CPU或GPU来完成。得益于开源传统,许多算法都提供了完整的开源代码工程,便于学习和使用。随着GPU的普及,GPGPU已经占据了大部分的训练场景。 我们在这里仅以GPU训练场景做一些说明。 当我们使用单GPU训练时,我们称之为非并行训练。使用多个GPU共同训练时,我们称之为并行训练。

2024-04-02 16:23:58 516

原创 C++(12): std::mutex及其高级变种的使用

在多线程或其他许多场景下,同时对一个变量或一段资源进行读写操作是一个比较常见的过程,保证数据的一致性和防止竞态条件至关重要。C++的标准库中为我们提供了使用的互斥及锁对象,帮助我们实现资源的互斥操作。

2024-04-02 10:12:55 1248

原创 深度学习评价指标(1):目标检测的评价指标

在计算机视觉/深度学习领域,每一个方向都有属于自己的评价指标。通常在评估一个模型时,只需要计算出相应的评价指标,便可以评估算法的性能。同时,所谓SOTA,皆是基于某一评价指标进行的评估。 接下来,我们将对目标检测领域的评价指标做一个大体的说明,其中涉及Precision,AP,mAP,Accuracy等指标。

2024-03-31 23:29:16 1192

原创 PyTorch学习(4):混合精度训练(torch.cuda.amp)

混合精度训练(Mixed Precision Training)是一种深度学习训练技术,它使用不同精度的数据类型(如单精度FP32和半精度FP16)来执行训练过程中的不同部分,以达到加速训练、减少内存使用和降低计算开销的目的。这种训练方式可以在保持模型精度的同时,显著提高训练效率。

2024-03-31 18:54:00 974

原创 PyTorch学习(3):并行训练DataParallel与DistributedDataParallel

在使用pytorch训练网络时,一般都会使用多GPU进行并行训练,以提高训练速度,一般有单机单卡,单机多卡,多机多卡等训练方式。这就会使用到pytorch提供的DataParallel(DP)和DistributedDataParallel(DDP)这两个函数来实现。

2024-03-29 15:10:34 1218

原创 C++(9): std::stack的使用

std::stack 是 C++ 标准模板库(STL)中的一个容器适配器,它提供了后进先出(LIFO)的数据结构。作为适配器,std::stack 基于其他容器(默认是 std::deque,但也可以指定为 std::vector)来实现其功能。

2024-03-29 07:17:04 234

原创 PyTorch学习(2):torch.device

torch.device 是 PyTorch 中的一个类,它指定了张量(Tensor)和模型应该运行在哪个设备上。在深度学习中,通常会使用 GPU 来加速计算,而 torch.device 允许你轻松地在 CPU 和 GPU 之间切换。

2024-03-28 07:42:00 1245

原创 C++(8): std::deque的使用

std::deque 是 C++ 标准库中的一个双端队列容器。这个容器支持在序列的两端进行快速的插入和删除操作,其时间复杂度为常数时间 O(1)。同时,std::deque 也提供了对序列中任意元素的随机访问。

2024-03-28 07:14:25 452

原创 C++(7): std::list的使用

std::list是 C++ 标准模板库(STL)中的一个顺序容器适配器,它提供了双向链表的数据结构。与 std::vector 不同,std::list 不存储连续的元素,因此它可以高效地在中间插入和删除元素,而不需要移动其他元素。

2024-03-26 11:01:55 857

LT8619C_DataSheet_R1.2.pdf

LT8619C,HDMI转RGB24或LVDS芯片,用于将输出的HDMI输入,转换成RGB24或LVDS信号。可用于无线图传。

2020-04-27

Openvx视觉计算框架了解

Openvx视觉计算框架了解,大体知道openvx的发起者,目的及用途。

2018-12-14

linux多线程间使用共享内存例程,C++版本。

linux多线程间使用共享内存例程,C++版本。可用于大量数据的多线程共享。

2018-12-13

Caffe官方教程中文版

Caffe官方教程的中文版,使用的时候可以参考一下。初学者不建议参考。

2018-12-13

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

TA关注的人

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