算法 [64]

C++ STL容器的底层原理

C++ STL 容器是使用频率超高的基础设施,只有了解各个容器的底层原理,才能得心应手地用好不同的容器,做到用最合适的容器干最合适的事情 [1]。 看了文章 [1] 开头,以为必有高论,然而对容器方法的底层几乎没有提及,那就自己边查边写吧。本文大部分内容来自 cplusplus.com/refere

矩阵乘法

向量 向量点积 点积(Dot product)也叫标量积(Scalar product)。在 Euclidean 空间中,点积也是最常见的内积(Inner product)形式。 点积的计算方式很直接:两个向量的对应元素分别相乘,再把结果相加。最终结果是一个标量,也就是一个数。 对于二维向量: \v

学习Transformer

Transformer 在谷歌 2017 年的论文 [\1706.03762] Attention Is All You Need 中首次被提出,主要用于 NLP(Natural Language Processing,自然语言处理)的各项任务。 后来在 CV 领域,研究者们基于 Transform

单目相机的相对速度估计

前言 单目相机的目标距离估计本身就已经充满了挑战,那么目标的相对速度估计也必然十分困难。 目前,基于单目相机的相对速度估计算法大致可以分成两类:传统方法和深度学习方法。没错,什么任务都可以深度学习。 传统方法中,最经典的是 Mobileye 在 2003 年一篇论文中提出的算法。这套算法同时包含目标

道路目标流量统计算法

实现流量统计算法有两个前提: 能够实现目标检测,最基本的前提,必须能够识别到视频帧中的车辆和行人。 能够进行目标跟踪,在检测的基础上,为目标分配一个唯一的ID。流量计数依赖于目标的唯一ID。 目标检测算法以YOLO系列为例。 跟踪算法以 ByteTrack 跟踪结果为例。将检测结果的 objects

面向自动驾驶的端到端感知技术及发展趋势

摘要:近年来,随着深度学习技术的发展和硬件算力的持续增强,自动驾驶技术被越来越多地应用到不同场景中。视觉感知、激光雷达感知和多传感器融合感知技术也在这些年得到了迅速发展。本文首先回顾近年来自动驾驶感知技术的相关工作,然后介绍这些工作所使用的方法与技术,随后整理并介绍自动驾驶感知常用的数据集和评价指标

多目标跟踪算法的评价指标

多目标跟踪(MOT,Multiple Object Tracking)。 评价指标 MOTA MOTA 全称 Multiple Object Tracking Accuracy,计算公式为: MOTA = 1 - \frac{\sum_t(FN_t + FP_t + IDSW_t)}{\sum_t

多目标跟踪中的目标匹配算法

多目标跟踪算法 自动驾驶领域中的目标跟踪算法通常都是多目标跟踪算法,即 MOT(Multiple Object Tracking)。因为在这种场景中,要跟踪的目标往往不止一个。也有些文献会把这类问题称为 MTT(Multiple Target Tracking)。 MOT 问题中,并不是所有目标都会

我还在学CUDA编程(四)——内存管理及访问模式

内存管理 内存分配和释放 CUDA 编程模型中存在 Host 和 Device 两个异构系统,每个系统都有相对独立的内存空间。 在 Host 代码中,可以使用下面的函数分配 Device 全局内存: cudaError_t cudaMalloc(void **devPtr, size_t count

单目相机像素坐标系到世界坐标系的转换

世界坐标系 -> 像素坐标系 转换过程可参见这篇文章:FunnyWii's Zone 机器视觉 - 单目相机入门,其中描述了世界坐标系 -> 像素坐标系的转换过程。可以归结为下述公式: Z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{

我还在学CUDA编程(四)——内存的层次结构

CUDA 内存模型 存储器的类型有两种: 可编程:显式控制哪些数据存放。 不可编程:不能决定数据存储位置。 在 CPU 层次结构中,一级缓存(L1 Cache)和二级缓存(L2 Cache)都是不可编程的。 可编程的存储器类型包括: 寄存器 共享内存 本地内存 常量内存 纹理内存 全局内存 下图为上

OpenCV 的 remap() 函数中的 map1 和 map2

今天在 StackOverflow 上看到这么个问题:想把原图像中的一个点 \textstyle g,通过内参和畸变参数映射到去畸变图像中的点 \textstyle p,并获取这个点的坐标。 你以为我接下来会说,xxx 和我想的一样,但是我想错了,其实并不是这样。 现在,我想说的只有其实并不是这样,

继续学CUDA编程(三) —— CUDA执行模型(下)

并行归约问题 先解释一下什么是 归约(Reduction),归约是将某个计算问题变换为另一个问题的过程。在 CUDA 运算中,在向量中执行满足交换律和结合律的运算,被称为归约问题。每次迭代计算方式都是相同的(归),从一组多个数据最后得到一个数(约)^{[1]}。比如当给定 N 个数值,求其 SUM/

单目相机的深度图,以及绝对深度和相对深度

深度图 深度图(Depth Image, Depth Map)会将图像中的每个像素编码为相机到场景中某个点的距离,从而提供图像中物体的空间信息。 需要注意的是,不同场景下深度的定义可能略有差异。有些传感器中,深度表示的是相机坐标系下沿光轴方向的 Z 值;有些场景中,深度也可能表示空间点到相机中心的欧

使用Python控制海康球头相机运动的方法

控制海康球头的 3 种方法 做了一些调查,目前控制海康球头相机的方法主要有三种: 海康官方 SDK。海康开放平台提供了多个平台的 SDK,包括 Windows、x86 Linux 和 ARM Linux(Jetson)等。Jetson 平台通常应选择 ARM 64 位 Linux 版本 ONVIF。

Jetson Orin部署Mediapipe Holistic检测

安装 JDK JetPack 一般不带 JDK,可以先安装 OpenJDK 11: sudo apt install openjdk-11-jdk 安装 Bazel 针对 MediaPipe 这个项目,需要使用的 Bazel 版本通常取决于当前 MediaPipe 版本指定的 Bazel 版本。更

继续学CUDA编程(三)——CUDA执行模型(上)

这一部分是 CUDA 的核心部分,涉及到了硬件和程序的执行模型。 CUDA 的执行层级是 Grid → Block → Warp → Thread,而真正被硬件调度的基本单位其实是 Warp,而不是 Thread。 然后必须先记住 CUDA 的约定: threadIdx.x → 列(col) thr

“我还要学CUDA编程!”(二)——CUDA编程模型

CUDA 编程结构 在 GPU 上执行的函数称为 CUDA 核函数(Kernel Function),核函数会被 GPU 上多个线程执行。典型的 CUDA 程序遵循如下模式: 把数据从 CPU 内存(Host)拷贝至 GPU 内存(Device) 调用该 Kernel 函数,对 Device 中的数

”我要学CUDA编程!“ —— 来自一个废物的自白

写在前面(废话,请跳过) 本来自己的脑子里是不存在 CUDA 编程这个东西的,没错,就是压根儿没听说过。 之所以了解到这个东西,是因为最近开始做 AVM(Around View Monitor),或者说 SVS(Surrounding View System),利用 4 个广角相机,实现车辆周围的

车道线的多项式曲线拟合

离散点平滑 基于优化的离散点平滑 模型检测到的车道线,最终输出的是车道线的点坐标 \textstyle (x,y),这些点能够大致描述车道线在画面中的位置。但如果想要拟合出车道线的高阶方程,可能还是不够平滑,一些离散点会影响拟合的效果。 优化变量:车道线点坐标 \textstyle (x_i,y_i