自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 收藏
  • 关注

原创 代码规范工具

然后可以在pre-commit的config里面配置需要的代码规范;这样子代码检查的规范的执行就会注册在git的hook当中。有些规范不会帮你修改,只会报错,比如flake8;然后可以在代码仓里面配置pre-commit。commit的时候会触发hook帮你检查;有些规范可以帮你修改,

2024-03-15 15:21:31 700

原创 关于- bounding box reparameterization

因为detr以及大部分detr的变体都是将box的x,y,w,h映射到[0~1]之间;这样对于小目标的检测的话就会比较困难,因为损失被大目标主导了,

2024-03-13 09:52:06 374

原创 三维相机选型主要考虑哪些方面

2024-03-10 17:37:59 346

原创 vslam的优化方向

2024-03-10 17:36:38 334

原创 Group DETR

所以groupDETR提出的方法是在训练的时候用多组query,每组内仍然保持一对一匹配,推理的时候只用任意一组query就可以不用NMS了;1.如果增加query的数量,是可以提升检测性能的,但是计算开销也会增大,原因在于query个数越多,越容易命中目标;2.如果改成一对多的匹配,比如把一个gt匹配上2个positive box,可以加速收敛,提升一点性能;groupDETR要解决的问题是:既能够一对多的匹配,又能够不用NMS,节约计算开销;但是会导致使用的时候需要用到NMS;

2024-02-22 16:14:28 385

原创 mmdetection及mmengine源码结构

mmdet的注册机机制是基于装饰器实现的,Register这个类中有一个装饰器函数register_module(),通过这个装饰器函数可以把类/函数装入到Register这个类的成员变量_module_dict中,_module_dict的目的是维护每个注册器中的类和函数到字符串的映射;个人感觉跟C++中的虚函数的概念和目的是有区别的,虚函数的目的是相同的函数名,不同的对象会调用不同的虚函数实现;然后我们就可以把需要的函数/类注册到对应的register的_module_dict里面;

2023-10-17 15:15:33 276

原创 transformer比CNN好在哪里

1.Dynamic比static好:transformer的参数是随着输入变化的,不像CNN是fixed住的;动态参数提取特征的能力会更强,所以很多CNN也在朝Dynamic的方向发展,比如Dynamic cov,Dynamic relu;2.attention机制更关注不同feature之间的相对关系,对于绝对的value值并不敏感(对于形变和噪声不敏感),所以相对于CNN具有更好的普适性;而CNN更关注对于局部的描述(类似于传统算法中的特征点提取);(在此过程中也会损失掉分辨率);

2023-07-10 14:56:47 931

原创 Tensor core原理

Tensor core是nvidia底层执行运算的硬件单元,不同于nvidia以往的cuda core(全浮点型),Tensor core是近几年推出来的、混合精度的、将累加和累乘放在一起的计算硬件;混合精度指的是在输入、输出的时候使用FP16,计算的时候使用FP32;在GPU编程中,"kernel"一词有特定的含义,与计算机操作系统中的内核不同。在GPU编程中,"kernel"是指在并行计算中由多个线程同时执行的函数。它是在GPU上执行的并行计算任务的入口点。

2023-06-28 14:33:44 3851 3

原创 AI芯片的基础

简言之,就是为了AI算法的运行而专门设计的芯片;

2023-06-27 15:57:58 704

原创 swin-transformer在Jeston Nx部署

1.arm\x86-64的区别指令集不一样2.arm架构上的conda要安装miniforge3.arm上的ubuntu的软件管理器是pacman,这个安装起来也有点麻烦,因为这个库有一些前置依赖库pkg-config;4.如果dockerfile里面的CMD和entrypoint什么都没写的,直接docker run起来的容器会很快退出,而且没有log,如果要在容器中停留比较久的话需要-it进入交互式界面;6.cmake。

2023-06-27 11:17:35 365 3

原创 关于深度学习训练的工程技巧

符号位表示数的正负,指数位用于表示数的指数部分,尾数位用于表示数的尾数部分。线性层和卷积层,本质上都是线性操作,卷积层相当于共享参数的线性操作,但是self-attention是高阶的非线性操作,ResNet是由齐次运算堆叠而成,关注局部区域,而transformer是由非齐次运算堆叠而成,关注更大区域和更高的语义,齐次和非齐次运算的雅可比矩阵有非常不同的特性,会导致不同的优化难度;雅可比矩阵的连乘可以得到对某个参数的导数,根据该导数可以对该参数进行更新,关于具体的更新方式,不同的优化器有不同的方式;

2023-06-20 19:19:02 459

原创 如何用vscode调试第三方库的源码

vscode debug

2022-08-01 11:50:54 941 1

原创 视觉目标检测及分割任务中使用解耦头的好处

什么是解耦头?在做实例分割时,我们需要输出分类置信度图和实例mask图;在做目标检测时,我们需要输出目标的分类和边框位置;所以,这两类任务都需要输出分类和位置!采用两个不同的头解耦输出分类和位置,称为decoupled;其中目标检测的解耦头如下图所示:solov2的解耦头如下图所示:为什么要用到解耦头?因为分类和定位的关注点不同!分类更关注目标的纹理内容!定位更关注目标的边缘信息!如上图所示分类更关注中心的内容区域,而边框回归更关注边缘信息!有实验表明使用解耦头之后目标检测任务

2022-02-07 22:35:16 7566

原创 两个不规则的box求取IOU-python

第一步:构造该框以四条线段表示该框,构造一个二进制的mask因为框里的像素只需满足四个公式,在L4的下面,在L2的上面,在L1的左边,在L3的右边第二步:相与和相或两框的mask相与求交集,相或求交集,载相除得到iouimport osimport numpy as npdef get_k(x1,y1,x2,y2,x3,y3,x4,y4): k1=(y2-y1)/(x2-x1) k2=(y3-y2)/(x3-x2) k3=(y4-y3)/(x4-x3) k4=.

2022-01-26 23:15:30 3591

原创 PSPNet--语义分割网络

简介作者认为不同像素之间的语义信息是有关联的,比如车不可能在水里;所以利用全局像素的语义对单个像素的语义进行调整是有必要的;也就是要用到attention机制;PSPNet的attention是通过不同尺度的pooling+upsample+contact实现的;网络结构这篇文章讲述了具体的细节以及实验结果:https://zhuanlan.zhihu.com/p/97706803...

2022-01-17 16:25:47 815

原创 关于牛顿法梯度下降

2021-12-20 10:38:40 204

原创 本质矩阵 基础矩阵 单应性矩阵

单应性矩阵表示同一个平面在不同相机的图像坐标系下的变换;三个矩阵之间的关系单应性矩阵虽然跟本质矩阵同为点在像素坐标系下的变换,但是单应性是中的点是共面的;本质矩阵与基础矩阵如下图所示:其中E为本质矩阵,KKK及K′K^{'}K′是两个相机的内参,F为基础矩阵,我们可以这么理解:本质矩阵是一个三维点在相机坐标系下的变换,A相机坐标系下的三维点经过内参的转置变换可以其在A相机图像坐标系的位置,经过基本矩阵获得其在B相机图像坐标系的位置,再经过B的内参,获得其在B相机坐标系下的位置;...

2021-12-14 17:14:44 2986

原创 P3P求解相机姿态原理介绍

简介首先,PnP算法是利用相机内参、瞄点在图像坐标系以及对应世界坐标系下的位置 ,求取相机在真实坐标系下姿态的问题 ;其本质上是求解相机坐标系到世界坐标系的变换;p3p利用三个点对,余弦定理来求解 ,可以求出4个解,所以至少需要四个点对才能求取出没有歧义的解;其求解过程可以分为两个步骤1.根据余弦定理估计投射线的长度;2.计算方向参数;我们首先需要知道的是P3P并不是直接根据3D-2D点求出相机位姿矩阵,而是先求出对应的2D点在当前相机坐标系下的3D坐标,然后根据世界坐标系下的3D坐标和当

2021-12-14 15:38:12 4248

原创 残差/shortcur/Resnet 究竟好在哪里

为什么要使用残差?众所周知,更深的网络会遇到退化问题,即在网络的层数达到最大值后,随着网络深度的增加,准确性会降低。并且这种准确性的降低不是由于训练集的过度拟合;因为训练误差开始增加。然而,可以证明(并且作者确实证明了)如果较浅的网络以一定的精度执行,那么任何较深的网络至少可以与较浅的网络一样好。额外的层可以只是恒等映射(什么也不做),并给出与浅层网络相同的结果。但是实验中并不是这样的。这表明优化器难以通过多个非线性层学习恒等映射。残差的本质是将恒等映射变成了残差拟合;深度学习网络在层数加深的过程中,

2021-12-14 14:44:44 1198

原创 简单易懂--可形变卷积deformable convolution

可形变卷积解决什么问题?1.很多目标物体的形状不是固定的,比如纸袋子,再比如动物跑跳、睡觉情况下会有不同的形状,简言之,目标除了光照、位置会发生变化,还有形变!传统CNN对应位置采用固定的系数去卷积,对于形变物体就会缺少建模和表达能力,所以需要可形变卷积!什么是可形变卷积?下图当中a是普通卷积;b,c,d是可形变卷积,可以看到不是固定对应位置的卷积;每个待卷积的点的位置会发生偏移!且偏移不固定!这个偏移也是网络要学习的!可形变卷积如何实现的?其是在卷积核参数的基础上,加上了偏移量参数δx\de

2021-12-13 21:20:18 2603

原创 RANSAC如何动态更新最大迭代次数

简介:RANSAC的流程是:1.随机取一组点model_points,求解出模型方程;model_points为求取模型的最小点数;2.计算满足该模型方程的点数占总点数的比例(即内点占比);3.若内点占比满足一定阈值,或者当前迭代次数大于最大值,则停止迭代;4.若当前内点占比大于当前统计得到的最大内点占比,则根据内点占比更新最大迭代次数;5.继续迭代;那么最大迭代次数是如何更新的?首先,RANSAC的目的是找出内点占比最大的模型;假设当前统计的最大内点占比是(1-ep),也就是对应的外点占

2021-12-13 10:37:11 1138

原创 SeNet--通道注意力卷积

简介SeNet是一种通道注意力卷积,通俗的讲,就是对每层特征图求平均值,得到(N,C,1,1),然后经过全连接得到对应系数(N,C,1,1),再乘到原始的特征图上(N,C,H,W);原理上是挑选出更需要关注的特征,特征图是由卷积核卷积得到,有的卷积核关注横向的梯度,有的关注纵向的梯度,每个卷积核提取的特征不同,如果一个卷积核的系数值比较小,特征图的值也就比较小,也就意味着这个卷积核没有那么重要,那么SENet就希望缩小不重要的特征的系数,增大重要特征的系数;网络流程图介绍SeNet是放在卷积之后,对

2021-12-07 11:11:54 2688 1

原创 多线程与多进程

简介操作系统最小分配资源的单位是进程,操作系统的最小调度单位是线程;一个程序的执行就是一个进程,一个进程可以包含多个线程,单个CPU内核只能执行一个进程;多进程才是真正的并发操作,多线程如果仅仅使用同一个CPU内核,仍然是多线程之间的交替执行,不是真正的并发;每个进程会被分配独立的内存空间;多进程之间的内存共享往往比较麻烦~一个进程下的多线程内存共享,但是如果做到内存同步需要用到锁机制;多进程之间的内存共享的话可以用队列;python的多进程可通过multiprocessing实现多线程可通

2021-11-26 09:52:05 131

原创 稀疏光流与稠密光流

稀疏光流光流用在目标追踪过程中,基于上一帧的位置,预测目标在下一帧的位移;该预测基于的先验条件如下:1.上一帧跟当前帧拍摄的时差较小,物体的位移不大;2.某点像素(待检测目标上)周围的像素与该点具有相同的位移;3.亮度恒定,上一帧与当前帧的变化不大;具体步骤:1.在上一帧中目标所在的区域内提取N个特征点;2.在每个特征点周围划取5*5的像素大小稠密光流稀疏光流在上一帧检测出来的目标区域内利用若干个特征点计算位移;...

2021-11-25 15:44:55 2891

原创 OCRNet

简介这是HRNet+TRansformer在语义分割方面的应用;最近的研究中,把TRansformer用在语义分割中的很多,因为不同位置不同实例的语义是有相关联性的,比如说飞机不可能在厕所里面等等;这是OCRNet官方的解读:https://zhuanlan.zhihu.com/p/43902175网络结构直接上网络结构:OCR 方法的实现主要包括3个阶段:(1) 根据网络中间层的特征表示估测一个粗略的语义分割结果作为 OCR 方法的一个输入 ,即软物体区域(Soft Object Regi

2021-11-05 17:09:05 2630

原创 PSA极化注意力机制:Polarized Self-Attention: Towards High-quality Pixel-wise Regression

摘要在计算机视觉任务中,语义分割和关键点检测是具有挑战的,因为既要尽量保持高分辨率、又要考虑计算量,以及尽量连接全局信息得到结果。由于提取全局信息的有效性以及对全局像素special的注意力,attention机制在计算机视觉领域变得非常的流行。CNN本身是卷积共享的核,且具有平移不变性,也就代表其是local且丧失special注意力的。但是long-range的attention参数量大,训练耗时长且难以收敛;很多学者都在研究轻便易于训练的attention机制。本文提出了一种极化注意力机制,其优势在

2021-11-05 15:14:06 7934 6

原创 vit-transformer模型结构及源码解读

vit简介vit模型是transformer在图像分类领域的首次成功尝试;但是其需要基于大量数据去预训练模型;除了训练难度,现有的 Visual Transformer 参数量和计算量多大,比如 ViT 需要 18B FLOPs 在 ImageNet 达到 78% 左右 Top1,但是 CNN 模型如 GhostNet 只需 600M FLOPs 可以达到 79% 以上 Top1。vit网络结构源码解读import torchfrom torch import nnfrom einops

2021-11-01 20:20:18 5242

原创 Transformer

Transformer简介什么是TransformerTransformer是基于self-attention注意力机制的一种网络结构,同时其网络结构也沿用了seq2seq的主体结构,由Encoder-Decoder流程组成,包含了multi-head(多个self-attention并行堆叠而成)、加入了位置信息编码,以及mask;Transformer的应用或者目的是什么Transformer最早的提出是由谷歌2017年的一篇论文–Attention is All your need;其提出的

2021-11-01 17:13:41 3589

原创 self-attention

self-attention简介什么是self-attention?self-attention顾名思义,就是自注意力机制,简单理解,就是将输入乘以一个矩阵(attention mask),获得输出的过程。那么这个attention mask怎么获得呢?attention mask也是根据输入本身得到的,1.可以通过对输入进行神经网络变换得到;2。大部分通过点积的方式(矩阵相乘,即经典的q,k,v);self-attention的目的是什么?其目的在于:1.融合全局信息对当前的像素信息进行编码;2.

2021-11-01 15:24:53 1195

原创 pytorch累计梯度训练

背景在深度学习的训练中,往往我们需要选择一个适中的batch值取获得最好的训练效果,batch不能太小或者太大。但是有时候我们的显卡内存有限,比如我们的显卡只能容纳一个batch,但是单batch的训练效果不稳定,该如何解决呢?解决方案我们可以累计N个batch的梯度之后再更新参数,而不是传统的每个batch都进行参数更新,这样可以等同于batch=N的训练;代码首先,需要明确以下两点:1.optimizer.zero_grad():会把所有的梯度置为02.loss.backward():添加

2021-10-28 10:59:08 456 1

原创 opencv读取和存储32位图像

读取32位float图像 cv::Mat image = cv::imread(filepath, cv::IMREAD_LOAD_GDAL | cv::IMREAD_ANYDEPTH); cv::Mat image_float(image.rows, image.cols, CV_32FC1, image.data);存储32位float图像 cv::Mat linear_CV8U(image.rows, image.cols, CV_8UC4, linear.data); cv::i

2021-10-27 16:13:35 5368 2

原创 什么是强化学习

强化学习是一种学习方式,跟监督学习、无监督学习并列的学习方式,需要跟环境进行交互,然后更新参数。强化学习是一种通过跟环境交互获取反馈、更新参数的学习方式,目前主要用在游戏中,强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。我们平时也常常用这样的策略来提高自己的游戏水平。在 Flappy bird 这个游戏中,我们需要简单的点击操作来控制小鸟,躲过各种水管,飞的越远

2021-10-20 14:55:58 4777

原创 KCF目标追踪卡尔曼滤波

KCF是一种目标追踪的方法,根据目标在上一帧的位置预测目标在当前帧的位置。以下为KCF流程的代码解读:/*Tracker based on Kernelized Correlation Filter (KCF) [1] and Circulant Structure with Kernels (CSK) [2].CSK is implemented by using raw gray level features, since it is a single-channel filter.KCF

2021-10-19 15:30:33 2271

原创 model.eval()跟torch.no_grad()的区别

model.eval() 负责改变batchnorm、dropout的工作方式,如在eval()模式下,dropout是不工作的。batchnorm是固定均值方差的,不会再根据test的输入重新计算均值方差;torch.no_grad()仅仅是关闭梯度计算,节约内存;a) model.eval(),不启用 BatchNormalization 和 Dropout。此时pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值。不然的话,一旦test的batch_size过小,很容易就

2021-10-16 14:59:24 909

原创 反卷积(Transposed conv deconv)实现原理(通俗易懂)

什么是卷积卷积就是把卷积核放在输入上进行滑窗,将当前卷积核覆盖范围内的输入与卷积核相乘,值进行累加,得到当前位置的输出,其本质在于融合多个像素值的信息输出一个像素值,本质上是下采样的,所以输出的大小必然小于输入的大小,如下图所示:什么是反卷积反卷积和转置卷积都是一个意思,所谓的反卷积,就是卷积的逆操作,我们将上图的卷积看成是输入通过卷积核的透视,那么反卷积就可以看成输出通过卷积核的透视,具体如下图所示:比如左上角的图,将输出的55按照绿色的线的逆方向投影回去,可以得到[[55,110,55],

2021-10-16 14:32:10 22479 13

原创 对于Transformer在图像中应用的一些理解

RNN/LSTM/Transformer原始的RNN/LSTM主要用于NLP当中,前后词虽然是不同时间输入的,但是需要关联起来去理解整个句子的意义,单纯的RNN对前后隐层的关联是比较单一,所以有LSTM,对于要去掉信息,着重注意哪些信息是可以学习的,相比于RNN,LSTM有了更复杂的设计;RNN的目的在于连接全局信息,不是just local;LSTM在RNN的基础上,加入更强的注意力机制,对于不同前后不同的隐层,基于不同的注意(权重加成和丢弃);Transformer 把LSTM的结构改成可以并行

2021-10-13 15:49:49 3627

原创 关于pytorch nn.MSELoss损失的补充介绍

正常情况下,对于关键点检测网络而言,假设原图大小【550,550】,当关键点的分类为1.输出的特征图大小为【1,550,550】,然后gt也被制作成【1,550,550】的高斯特征图,但是最近的一次实验发现,当输出为【4,550,550】的时候准确率更高,提升了2个百分点,那么【4,550,550】怎样跟【1,550,550】计算MSELoss的呢?不同维度的Tensor之间也能计算MSELoss么?>>> inputtensor([[1., 2.], [3., 4.]

2021-10-13 11:13:20 462

原创 如何深度学习CNN在实例分割任务上的误检率

前言误检是实例分割任务当中比较严重的问题,那么,如何消除误检呢?寻找最佳阈值我们可以在后处理的过程中,以一定间隔去遍历所有阈值,获得检出率较高而误检率较低的那个符合预期的阈值;加入负样本如果误检的实例阈值很高,无法通过阈值筛选的方式去除,可以将误检的样本增强后加入到训练集当中训练图片分类网络这是一种非常简单高效的方法;我们训练一个基于resnet的图片分类小网络,放在后处理中,用于判断实例网络输出的实例的图片分类;...

2021-09-02 19:58:30 558

原创 DeepLabV3+网络结构

关于这个模型讲的比较好的博客有:https://zhuanlan.zhihu.com/p/62261970

2021-08-17 10:06:26 731

原创 solov2网络结构图

2021-07-12 20:13:30 1910 5

空空如也

空空如也

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

TA关注的人

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