SSD算法解析

2023-05-16

目标检测算法主要分为两类:

  • Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归,two-stage的方法优势在于准确率度高;
  • One-stage方法:如YOLO系列方法,主要思路就是均匀地在图片上不同位置进行密集采样,采样时使用不同尺度和长宽比box,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以优势在于速度快。我们接下来介绍的SSD方法也是单阶段的算法。

SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。对于Faster R-CNN,先通过CNN得到候选框,然后进行分类和回归,而YOLO和SSD可以一步完成检测,SSD的特点是:

  • SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小特征图用来检测大物体;
  • SSD采用了不同尺度和长宽比的先验框,在faster r-cnn和yoloV2,V3中称为Anchors。

1 SSD网络结构

SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。

SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。
SSD网络有两种:SSD 300和SSD 512,用于不同的输入尺寸。下文主要以 SSD 300为例进行分析。

下图就是VGG300的总体结构:
在这里插入图片描述
整个网络分为三部分:

  • backbone: VGG16用于图片特征提取的网络
  • Extra: 用来获得更多的特征图
  • Loc和cls: 用于框位置回归和目标分类的网络

1.1 backbone

网络的backbone采用VGG16作为基础模型,并在此基础上做了稍微的改动。使用imagenet数据进行预训练后,将conv4-1前一层的maxpooling中池化模式padding改为same(图中对应pytorch中的ceil_mode=True,即向上取整),使得输出为38x38,Conv4-3得到的特征图就是多尺度特征中的第一个38x38的特征图 (即第一个用于后续目标检测网络进行位置回归和分类的计算的特征图),因为该层比较靠前,所以在其后面增加了一个L2 Normalization层,对每个像素点在channle维度做归一化。VGG16倒数第3个和倒数第2个全连接层分别转换成 3x3 的卷积层conv6和1x1的卷积层conv7,把最后一个全连接层删除,同时将最后的池化层由原来的stride=2的 2x2 变成stride=1的 3x3的池化层。(卷积层conv7得到的特征图是第二个用于后续目标检测网络进行位置回归和分类计算的特征图))

下图为原始的VGG16网络和SSD中的VGG16的差别:
在这里插入图片描述
其中conv6使用的Dilated Convolutions,可以翻译为扩张卷积或空洞卷积。与普通的卷积相比,增加了一个扩张率(dilation rate)参数,主要用来表示扩张的大小。扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,在神经网络中参数数量不变,区别在于扩张卷积具有更大的感受野。如下图所示:(下图中红点代表卷积核大小,这三幅图中卷积核大小均为3x3,蓝绿色代表感受野大小,相当于这里对应的卷积核参数为0)
在这里插入图片描述
(a) 普通卷积,1-dilated convolution,卷积核的感受野为3×3=9。 (b) 扩张卷积,2-dilated convolution,卷积核的感受野为7×7=49。 © 扩张卷积,4-dilated convolution,卷积核的感受野为15×15=225。

空洞卷积的好处

  • 扩大感受野,且不丢失分辨率:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率(即可以不改变图像输出特征图的尺寸),且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
  • 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。当然这样的操作不影响特征图的尺寸,又避免下采样造成信息损失,同时也利用到多尺度信息。
    • 知识补充:我们知道,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。

潜在问题 :远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。

普通卷积和扩张卷积的直观区别:
在这里插入图片描述
扩张卷积的感受野的计算方法是:
在这里插入图片描述

所以对于图b,F=2*(2-1)(3-1)+3=7,即卷积核的感受野为7x7
对于图c,F=2
(4-1)*(3-1)+3=15,即卷积核的感受野为15x15

1.2 extra部分

为了进行后续的多尺度特征提取,在VGG后面又添加了一些卷积层,如下图所示:

新增的Conv8_2,Conv9_2,Conv10_2,Conv11_2得到的特征图都会送到后续的目标检测网络中用于位置的回归和分类的计算,特征图的大小如下表所示:
在这里插入图片描述
红框中的内容是进行多尺度分析的特征图,再加上backbone部分的Conv4_3和Conv7获取的特征图,共提取了6个特征图,其大小分别是 (38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1),我们将其送入到loc和cls中进行目标检测,从而实现多尺度目标检测。

下图是SSD网络的框架:
在这里插入图片描述

注意:

图中的红框部分是用于预测的特征层,这里共有6个预测特征层,分别是:Conv4_3, Conv7,Conv8_2, Conv9.2,Conv10_2, Conv11_2

图中的Conv6 (FC6)表示图像的卷积层Conv6对应着原来VGG模型的全连接层FC6的位置,FC6是VGG16中的第一个全连接层

图中的Conv7 (FC7)表示图像的卷积层Conv7对应着原来VGG模型的全连接层FC7的位置,FC7是VGG16中的第二个全连接层

1.3 loc和cls

在backbone和 Extras 在提取的6个特征图的基础上,进行位置信息和分类信息的提取,其结构如下图所示(这里选取其中一个特征图进行分析,其余5个特征图的分析过程与之类似):
在这里插入图片描述

该部分主要有3个支路构成,

  • 分支一:Default Box层,用来生成先验框,也就相当于fasterRCNN中的anchor box,假设特征图的每个单元格上有3个先验框,而特征图的大小是5x5,所以一共产生5x5x3=75个先验框
  • 分支二:Localization: 使用一个 3×3 卷积来进行完成,输出的特征图尺寸为5x5x12,其中12代表的是先验框的坐标信息,因为每个先验框有4个坐标信息,特征图的每个单元格上产生3个先验框,所以共有3x4=12个坐标信息
  • 分支三:类别置信度confdence:使用一个 3×3 卷积来进行完成,输出的特征图尺寸为5x5x63,其中63代表先验框的类别信息,因为每个先验框有21个类别预测结果(VOC数据集,共20个类别加一个背景),特征图的每个单元格上产生3个先验框,共有3x21=63个预测结果
    最后经过修正边界,分类和NMS过滤就得到最终的预测结果

注意:在原论文中,将anchor称作Default Box,其实它们都是一个意思,都表示先验框的意思

整个过程如下图所示(图中以每个单元格产生3个先验框为例进行讲解):
在这里插入图片描述

1.3.1 Default Box层先验框的生成方法

在这里我们着重介绍Default Box层先验框的生成方法:

SSD一共有6个不同尺度的特征图,不同特征图上设置的先验框数量,尺度,宽高比都是不同的(即同一个特征图上每个单元设置的先验框是相同的,但是不同特征图上每个单元是不同的,这里的数目指的是一个单元的先验框数目)。

先验框的设置:包括尺度(或者说大小)和长宽比两个方面。
在这里插入图片描述

  • 先验框的尺度
    先验框的尺度遵守一个线性递增规则:随着特征图大小降低(此时检测目标逐渐变大),先验框尺度线性增加,
    其中每个先验框的尺度相对于原图大小的比例 S K S_K SK的计算公式如下所示:
    在这里插入图片描述
    其中:
    k表示第K+1个特征图,它的取值范围是[1,5],因为第一个特征图并不是按照上面公式进行计算,所以K的取值不是从0开始;m 指的特征图个数,虽然参与计算的特征图个数是6,但是这里将m设为5 ,因为第一个特征图(Conv4_3层生成的特征图)上的先验框的尺度是单独设置的,不需要根据上面公式进行计算,只有第二个到第六个特征图的尺度才按照上面公式计算。 S K S_K SK表示第k+1个特征图上先验框大小相对于图片的比例,而 S m i n S_{min} Smin S m a x S_{max} Smax表示比例的最小值与最大值,它是超参数,论文中的取值为0.2和0.9。
  1. 对于第一个特征图,其先验框的尺度比例一般设置为 s m i n s_{min} smin/2=0.1,尺度为 300×0.1=30。这里的300指的是输入到网络中的图片的宽和高

  2. 对于后面的特征图,先验框尺度比例按照 上面公式线性增加线性增加,但是先将尺度比例先扩大100倍,此时增长的步长为:在这里插入图片描述

  3. 这样各个特征图的 S K S_{K} SK为20,37,54,71,88。将这些比例除以100,我们可以计算出第二到第六个特征图的尺度比例 S K S_{K} SK的取值分别为0.20, 0.37,0. 54, 0.71, 0.88

  4. 然后再乘以原图的大小300,再综合第一个特征图的先验框尺寸,则可得各个特征图的先验框尺度为30,60,111, 162,213,264。

  • 先验框的长宽比

    一般选取
    在这里插入图片描述
    根据下面公式,由先验框尺度和长宽比可以得到先验框的宽度和高度(下面计算公式中的 S K S_{K} SK均指的是先验框实际尺度,而不是尺度比例):
    在这里插入图片描述
    默认情况下,每个特征图除了上面5个比例的先验框,还会设置一个尺度为
    在这里插入图片描述
    的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。

注意:根据前面的计算公式,当k=5时,Sk+1=315

因此,每个特征图一共会产生两种尺度,5种长宽比的先验框,其中第一种尺寸(小尺度)的先验框的 长宽比分别是 1, 2, 3, 1/2, 1/3,第二种尺寸(大尺度)的先验框的长宽比是 1 ,所以每个特征图共产生6种先验框。但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4种先验框,它们不使用长宽比为 3, 1/3 的先验框。
在这里插入图片描述
对于送入网络中的一幅图像,SSD一共可以产生 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个先验框,网络需要对这些先验框进行分类和回归生成预测框,即对于一个300x300的图像就有8732个预测结果,是非常的多的,所以说SSD本质上是密集采样。

在这里插入图片描述

下图是6个预测特征图的先验框尺寸核数目:

在这里插入图片描述

但是在github实现的SSD源码中,先验框尺寸与论文中有所不同

在这里插入图片描述
在这里插入图片描述

1.3.2 loc的预测结果

网络输出的结果是回归偏移量,而不是我们真正想要的结果(即预测框的真正位置,也就是修正后的先验框位置),这里还需要进行转换,具体的转换转换关系如下所示:
在这里插入图片描述

2.模型训练

2.1 正负样本标记

在训练过程中,首先需要确定训练图片中的 ground truth 与哪一个先验框来进行匹配,只有与之匹配的先验框才负责预测目标 。

SSD的先验框和ground truth匹配原则:

  • 正样本

1、对于图片中的每个gt,找到与其IOU最大的先验框,该先验框与其匹配,这样可以保证每个gt一定与某个先验框匹配。

2、对于剩余未匹配的先验框,若与某个gt的IOU大于某个阈值(一般0.5),那么该先验框与这个gt匹配

SSD中正样本的选取标准和Faster RCNN中的相同

  • 负样本

除了正样本外,其余的先验框标记为负样本,但是在很多情况下,正样本的数量要远小于负样本的数量,为了避免在训练过程中正负样本严重不平衡情况,SSD采用了hard negative mining策略,也就是在训练的过程中,我们并不是拿所有的负样本进行训练,而是对负样本进行抽样,抽样时按照置信度误差进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3

负样本的置信度损失越大,那么网络就会将该负样本预测为包含目标的概率越大,所以它属于困难样本,故使用这些困难样本来训练网络的效果更好

注意:

1、某个gt可以和多个先验框匹配,而每个先验框只能和一个gt进行匹配

2、如果多个gt和某一个先验框的IOU均大于阈值,那么先验框只与IOU最大的那个进行匹配

2.2 损失函数

SSD的损失函数和Faster RCNN中的损失函数基本一致,它包括位置损失( loc)与类别置信度损失(conf)的加权和:

在这里插入图片描述

这里的N是正样本数量,权重系数 α 设置为1。

其中类别损失如下所示:它其实就是多分类的交叉熵损失(也叫做softmax损失)
在这里插入图片描述

其中的定位损失如下所示;定位损失只针对正样本进行损失计算
在这里插入图片描述

3 模型预测

预测过程比较简单,
在这里插入图片描述
主要步骤如下:

  • 对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。
  • 然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。
  • 对于留下的预测框进行解码 (解码的意思是网络输出的结果是对先验框的修正量,并不是修正后的先验框的位置结果,所以还需要进行转换),根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。
  • 解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。
  • 进行NMS算法,过滤掉那些重叠度较大的预测框。
  • 最后剩余的预测框就是检测结果了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSD算法解析 的相关文章

  • #创建虚拟机器人URDF模型

    创建虚拟机器人URDF模型 题外话 xff1a 作业发布已有一两天了 xff0c 之所以今天才编辑这篇博客 xff0c 是因为我也遇到问题了 xff0c 现在以及解决了 xff08 小细节 xff1a 创建功能包之前先编译工作空间确保里面已
  • # gazebo 仿真

    gazebo 仿真 1 给 base link 添加惯性 xff0c 碰撞以及 gazebo 属性 在路径xqrobot description urdf xacro 件夹下新建 件夹 gazebo xff0c 并在 gazebo 件下创建
  • #Gmapping

    Gmapping 开始之前先安装两个功能包 xff0c 命令如下 xff1a sudo apt span class token operator span get install ros span class token operator
  • #navigation

    navigation 1 安装相关依赖 sudo apt span class token operator span get install ros span class token operator span kinetic span
  • # Qt_day1

    Qt day1 1 项目框架 span class token macro property span class token directive hash span span class token directive keyword i
  • ros先订阅后发布 无法收到消息的解决办法

    现象 今天遇到的问题是 使用的是Ros1 在先订阅后发布时 会导致订阅者无法收到订阅的消息 除非在发布者发布后重新订阅 思考 以前使用的是Ros2似乎并不关心订阅和发布的先后顺序 nbsp 似乎都可以收到消息 nbsp nbsp 这个问题后
  • C/C++中关于struct和class类的区别

    struct和class的主要的区别在于两者默认的访问权限有所不同 在不设置类中的成员属性和成员方法的权限时 xff0c struct默认的访问权限是公共权限 xff0c class默认的访问权限是私有权限 补充 xff1a 成员属性和成员
  • C++中STL容器的主要使用及含义

    1 stack栈容器的使用 假如栈中存放的是字符串 xff0c 我们做如下定义 xff1a stack lt string gt ss 设该变量名为ss 其主要用法如下 xff1a ss push a 存入栈中元素a ss top 读取栈顶
  • 电赛备赛记录第一篇(控制部分)

    2022 5 25 九校联赛备赛阶段第一天 联赛小车系统沿用去年国赛使用的树莓派驱动底板与外设 整车情况良好 xff0c 摄像头通信 连接均正常 xff0c 现已拼装完整 复产复工的初步成果为 xff1a 小车可以实现开机自启动的程序运行
  • 数据结构——栈详解

    1 栈 Stack 是一种线性存储结构 xff0c 它具有如下特点 xff1a xff08 1 xff09 栈中的数据元素遵守 先进后出 34 First In Last Out 的原则 xff0c 简称FILO结构 xff08 后进先出的
  • 双目相机标定

    一 运行环境 opencv2 windows vs 二 图像获取 分割 保存 参考博客opencv打开双目摄像头 图像切割保存 scutqq的博客 CSDN博客 双目图像分割 include amp lt opencv2 core core
  • uart1接收不定长度数据和发送:STM32 HAL库串口+DMA+IDLE空闲中断

    DMA增加 xff1a usart1 gpio 默认即可 usart1中断必须打开 在 STM32 中 USART 发送接收有三种基本方式 xff0c 轮询 中断和 DMA 1 轮询方式为堵塞模式 xff0c 使用超时管理机制 它每次接收一
  • 串口、网口等自定义通信协议的问题

    自定义通信协议的问题 一 串口1 通信分为网络通信和串口通信2 协议格式3 协议设计4 代码实现 二 网口1 TCP粘包与拆包 包的划分 出现TCP粘包的原因 粘包与拆包的几种情况 常见的粘包与拆包解决方案 2 为什么UDP没有粘包 xff
  • 如何理解奇偶校验位?

    奇偶校验位提供对传输数据的简单错误 xff08 奇偶校验 xff09 检查 此表描述奇偶校验的类型 奇偶校验类型 xff1a Even 描述 xff1a 数据位加上奇偶校验位产生偶数个1 xfffc 奇偶校验类型 xff1a Mark 描述
  • C语言----隐藏代码文件

    在C语言中 xff0c 常用的文件主要是后缀为 c的源文件以及后缀名为 h的头文件 我们通常使用头文件对函数进行声明 xff0c 使用源文件对具体的函数进行实现 有些时候会由于各种原因需要将函数的功能交给别人使用 xff0c 但是又不想将具
  • c++入门系列(三)之头文件

    1 什么是头文件 xff1f 在C语言家族程序中 xff0c 头文件被大量使用 一般而言 xff0c 每个C 43 43 C程序通常由头文件和定义文件组成 头文件作为一种包含功能的函数 数据接口声明的载体文件 xff0c 主要用于保存程序的
  • std::atomic_thread_fence

    在原子变量的存取上应用不同的memory order可以实现不同的内存序来达到数据同步的目的 xff0c 而在C 43 43 11及之后的标准里 xff0c 除了利用原子操作指定内存序 xff0c 还定义了单独使用 内存栅栏 xff08 s
  • 【数据结构】【期末复习】知识点总结

    算法 线性表 概念明晰 xff1a 随机存取 顺序存取 随机存储和顺序存储 随机存取 顺序存取 随机存储和顺序存储这四个概念是完全不一样的 xff0c 切不可将之混淆 很多人包括我可能认为随机存取就是随机存储 xff0c 顺序存取就是顺序存
  • 【单片机学习】51单片机【定时/计数器】,详细介绍

    51单片机学习 一 先知先会1 CPU时序的有关知识1 1 周期换算2 在学习定时器之前需要明白的3 定时 计数器的工作原理4 51单片机定时器结构 二 定时 计数器的控制1 工作方式寄存器TMOD2 控制寄存器TCON3 定时 计数器的工
  • 【跟着江科大学Stm32】GPIO_LED_流水灯_蜂鸣器

    只要坚持下来了 xff0c 一定会有收获 xff01 一 LED闪烁 span class token macro property span class token directive hash span span class token

随机推荐

  • STM32F103C8T6 PWM驱动舵机(SG90)

    小知识 xff1a 同一个定时器 xff0c 不同通道输出不同输出PWM的特点 对于同一个定时器的不同通道输出PWM xff0c 因为它们是共用一个计数器的 xff0c 所以频率必须一样 xff0c 而占空比由各自的CCR决定 xff0c
  • STM32 PWM周期与频率的计算

    文章目录 STM32 PWM周期与频率的计算频率的计算占空比的计算笔记仅供自学 xff0c 用来回看复习 xff0c 不一定适合你 xff0c 如有错误请指出 STM32 PWM周期与频率的计算 TIM TimeBaseInitTypeDe
  • STM32F103C8T6 实现舵机与电机的控制 2个定时器输出不同频率的PWM

    智能小家居 舵机开门 xff0c 电机做风扇 or 拉窗帘 呼吸灯做提示 xff0c 小OLED屏幕显示当前状态 文章目录 直接上代码main cpwm hpwm cservo hservo cmotor hmotor c笔记仅供自学 xf
  • 【学习记录】Tpro遥控器_暂时取消Tpro的控制权(简易)

    文章目录 按照如下图示配置1 设置好 96 逻辑开关 96 2 选择执行该 96 逻辑开关指令 96 的 96 通道 96 3 配置成功附 xff1a 继电器与R88的接法 按照如下图示配置 1 设置好逻辑开关 2 选择执行该逻辑开关指令的
  • 【Linux】gcc编译工具,断点的设置,gdb调试

    文章目录 注意1 在gcc编译过程中一定要加入选项 96 g 96 xff1b 2 只有在代码处于 96 运行 96 中在 96 暂停 96 状态时才能查看变量值 xff1b 3 设置断点后 xff0c 程序在指定行之前停止 总结主要内容1
  • 【Linux】信号量操作函数

    文章目录 二 实验原理1 semget 函数函数作用 xff1a 参数意义 xff1a 例子 xff1a 2 semop 函数函数作用 xff1a 参数意义 xff1a struct sembuf 结构体定义如下例子 xff1a 再来个完整
  • 【Linux】# 2022 Linux 笔试主要内容 MJ_University

    2022 Linux 笔试主要内容 看前须知道 带 的都是老师复习课上提到的内容 xff0c 但不代表说一定会考哦 xff01 选择题 xff08 20分 xff09 填空题 xff08 20分 xff09 判断题 xff08 10分 xf
  • Ubuntu18.04安装AX210驱动

    Linux Support for Intel Wireless Adapters 从官网可以看到AX210支持的内核版本是5 10 43 如果要在低于5 10的内核版本上安装AX210的驱动的话 xff0c 需要安装以下方法操作 xff1
  • 【Linux】实验四 进程信号通信

    文章目录 一 实验目的二 实验内容三 实验原理1 信号3 1 1 信号的基本概念3 1 2 信号的发送 2 所涉及的系统函数调用3 2 1 fork 3 2 2 kill This is my question 3 2 3 signal 代
  • 报错.SO文件找不到

    此报错大多数可以通过设置环境变量解决 原因 xff1a 当执行函数动态链接 so时 xff0c 此文件不在缺省目录下 lib and usr lib 里 缺省 61 61 默认 解决方案 xff1a 1 find name so文件名 2
  • 头文件(.h) 和实现文件(.cpp)区别

    简单讲 xff0c 一个Package就是由同名的 h和 cpp文件组成 当然可以少其中任意一个文件 xff1a 只有 h文件的Package可以是接口或模板 template 的定义 xff1b 只有 cpp文件的Package可以是一个
  • 坚持学习100天:STL(头大的英文,一个模板库,非得写得我看不懂)

    前言 Hello 我是修齊 学习C 43 43 的第一百零一十八天 18是个美好的数字 xff0c 18岁刚刚好 xff0c 28岁也要用心学习 在这里记录一些学习的东西和学习的心情 内容主要是一些自己学习整理的小笔记 一 指针与引用 1
  • Ubuntu20.04以及ROS系统的安装(避坑指南)

    一 Ubuntu20 04的安装 暑期在我导那里确认好研究方向后 xff0c 一个人摸爬滚打走来确实走了不少弯路 xff0c 遂决定写下这篇文章来帮助有需要的朋友来避坑 本次安装是通过VMware来创建一台虚拟机进行后续操作 xff0c 之
  • Rplidar A2单线雷达实现Cartographer建图

    首先安装rplidar2 xff0c 在工作空间src目录下git clone xff0c catkin make编译后即可使用了 git clone https github com robopeak rplidar ros git 在使
  • 解决Ubuntu非root用户登录时,无法打开Firefox浏览器

    在使用Ubuntu操作系统时 xff0c 创建了一个普通用户 xff0c 登录该用户后发现无法打开Firefox浏览器 xff0c 进行如下步骤可解决问题 提示 Your Firefox profile cannot be loaded I
  • 【C语言】 链表 超详细解析

    目录 一 xff1a 静态存储和动态存储 二 xff1a 存储类别 三 xff1a malloc函数 四 xff1a free函数 五 xff1a 内存初始化函数memset 六 xff1a calloc函数 七 xff1a realloc
  • 2.stm32freeRTOS---创建一个任务

    文章目录 前言一 创建一个任务需要注意哪些 xff1f 1 任务创建函数xTaskCreate2 代码分析 二 动态 静态分配1 动态分配2 静态分配 xff1a 三 删除任务四 一个函数创建两个任务总结 前言 上一次是初步接触实时系统 x
  • 世界上最详细的Linux C udp实现文件传输

    最重要的是掌握UDP的基本概念和使用 UDP h span class token macro property span class token directive hash span span class token directive
  • LidarPointCloud保存PCD文件的方法

    在牵扯到Lidar点云数据相关的开发时 难免需要将LidarPointCloud数据转为PCD文件 来查看点云效果 本文介绍两种办法 1 写文件的方法 根据PCD文件的协议 本样例中使用的数据类型为ara lidar LidarPointC
  • SSD算法解析

    目标检测算法主要分为两类 xff1a Two stage方法 xff1a 如R CNN系列算法 xff0c 主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域 xff0c 然后对这些候选区域进行分类