目标检测入门

一、目标检测任务对比

二、目标检测发展路线

基于深度学习的目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal),直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一阶段模型有SSD(Single Shot multibox-Detector)[4]、YOLO(You Only Look Once)[5]系列模型等。二阶段模型是有独立地候选区域选取,要先对输入图像筛选出可能存在物体的候选区域,然后判断候选区域中是否存在目标,如果存在输出目标类别和位置信息。经典的二阶段模型有R-CNN[3]、Fast R-CNN[6]、Faster R-CNN[7]。

两阶段的检测算法精度会比一阶段检测算法高,而检测速度确不如一阶段的检测算法,二阶段检测算法适合对精度要求高的业务,一阶段检测算法适合对实时性要求高的业务。

One-Stage检测算法示意图
Two-Stage检测算法示意图

1. 传统目标检测算法

不同于现在的卷积神经网络可以自动提取高效特征进行图像表示,以往的传统目标检测算法主要基于手工提取特征。传统检测算法流程可概括如下:

  1. 选取感兴趣区域,选取可能包含物体的区域
  2. 对可能包含物体的区域进行特征提取
  3. 对提取的特征进行检测分类
  • Viola Jones Detector:滑动窗口的方式以检查目标,为了提升速度采用 1)特征的快速计算方法-积分图,2)有效的分类器学习方法-AdaBoost,3)高效的分类策略-级联结构的设计
  • HOG Detector :是基于本地像素块进行特征直方图提取的一种算法,通过在均匀间隔单元的密集网格上计算重叠的局部对比度归一化来提高检测准确性。它在目标局部变形和受光照影响下都有很好的稳定性。成功改进了尺度特征不变性(Scale Invariant Feature Transform)和形状上下文(Shape Contexts)
  • DPM Detector:由一个主过滤器(Root-filter)和多个辅过滤器(Part-filters)组成,通过硬负挖掘(Hard negative mining),边框回归(Bounding box regression)和上下文启动(Context priming)技术改进检测精度。优点是运算速度快,能够适应物体形变,但它无法适应大幅度的旋转,因此稳定性差。
  • SIFT

2. Anchor-Based中的Two-stage目标检测

先由算法生成一系列作为样本的候选框,再通过卷积神经网络进行样本分类

二阶段检测算法主要分为以下两个阶段
Stage1:从图像中生成region proposals
Stage2:从region proposals生成最终的物体边框。

2.1 R-CNN

Rich feature hierarchies for accurate object detection and semantic segmentation

大致流程:RCNN首先通过选择性搜索算法Selective Search从一组对象候选框中选择可能出现的对象框,然后将这些选择出来的对象框中的图像resize到某一固定尺寸的图像,并喂入到CNN模型(经过在ImageNet数据集上训练过的CNN模型,如AlexNet)提取特征,最后将提取出的特征送入到SVMSVMSVM分类器来预测该对象框中的图像是否存在待检测目标,并进一步预测该检测目标具体属于哪一类。

两大贡献:1)CNN可用于基于区域的定位和分割物体;2)监督训练样本数紧缺时,在额外的数据上预训练的模型经过fine-tuning可以取得很好的效果。第一个贡献影响了之后几乎所有2-stage方法,而第二个贡献中用分类任务(Imagenet)中训练好的模型作为基网络,在检测问题上fine-tuning的做法也在之后的工作中一直沿用。

R-CNN将检测抽象为两个过程,一是基于图片提出若干可能包含物体的区域(即图片的局部裁剪,被称为Region Proposal),文中使用的是Selective Search算法;二是在提出的这些区域上运行当时表现最好的分类网络(AlexNet),得到每个区域内物体的类别。RCNN重点的两个做法:

  • 数据的准备。输入CNN前,我们需要根据Ground Truth对提出的Region Proposal进行标记,这里使用的指标是IoU(Intersection over Union,交并比)。IoU计算了两个区域之交的面积跟它们之并的比,描述了两个区域的重合程度。文章中特别提到,IoU阈值的选择对结果影响显著,这里要谈两个threshold,一个用来识别正样本(如跟ground truth的IoU大于0.5),另一个用来标记负样本(即背景类,如IoU小于0.1),而介于两者之间的则为难例(Hard Negatives),若标为正类,则包含了过多的背景信息,反之又包含了要检测物体的特征,因而这些Proposal便被忽略掉。
  • 另一点是位置坐标的回归(Bounding-Box Regression),这一过程是Region Proposal向Ground Truth调整,实现时加入了log/exp变换来使损失保持在合理的量级上,可以看做一种标准化(Normalization)操作

【性能】 RCNN算法在VOC-07数据集上取得了非常显著的效果,平均精度由33.7%(DPM-V5, 传统检测的SOTA算法)提升到58.5%。相比于传统检测算法,基于深度学习的检测算法在精度上取得了质的飞跃。

【不足】 虽然RCNN算法取得了很大进展,但缺点也很明显:重叠框(一张图片大2000多个候选框)特征的冗余计算使得整个网络的检测速度变得很慢(使用GPU的情况下检测一张图片大约需要14S)。

为了减少大量重叠框带来的冗余计算,K. He等人提出了SPPNet。

2.2 SPPNet

SPPNet 提出了一种空间金字塔池化层(Spatial Pyramid Pooling Layer, SPP)。它的主要思路是对于一副图像分成若干尺度的图像块(比如一副图像分成1份,4份,8份等),然后对每一块提取的特征融合在一起,从而兼顾多个尺度的特征。SPP使得网络在全连接层之前能生成固定尺度的特征表示,而不管输入图片尺寸如何。当使用SPPNet网络用于目标检测时,整个图像只需计算一次即可生成相应特征图,不管候选框尺寸如何,经过SPP之后,都能生成固定尺寸的特征表示图,这避免了卷积特征图的重复计算。

【性能】 相比于RCNN算法,SPPNet在Pascal-07数据集上不牺牲检测精度(VOC-07, mAP=59.2%)的情况下,推理速度提高了20多倍。

【不足】 和RCNN一样,SPP也需要训练CNN提取特征,然后训练SVM分类这些特征,这需要巨大的存储空间,并且多阶段训练的流程也很繁杂。除此之外,SPPNet只对全连接层进行微调,而忽略了网络其它层的参数。

为了解决以上存在的一些不足,2015年R. Girshick等人提出Fast RCNN

2.3 Fast RCNN 共享卷积运算

Fast RCNN网络是RCNN和SPPNet的改进版,该网路使得我们可以在相同的网络配置下同时训练一个检测器和边框回归器。该网络首先输入图像,图像被传递到CNN中提取特征,并返回ROI(Region of Interset,实为坐标组,可与Region Proposal混用),之后再ROI上运用ROI池化层以保证每个区域的尺寸相同,最后这些区域的特征被传递到全连接层的网络中进行分类,并用Softmax和线性回归层同时返回边界框。 

文章指出R-CNN耗时的原因是CNN是在每一个Proposal上单独进行的,没有共享计算,便提出将基础网络在图片整体上运行完毕后,再传入R-CNN子网络,共享了大部分计算

RoI Pooling图示
RoI Pooling图示

 RoI Pooling 是对输入R-CNN子网络的数据进行准备的关键操作。我们得到的区域常常有不同的大小,在映射到feature map上之后,会得到不同大小的特征张量。RoI Pooling先将RoI等分成目标个数的网格,再在每个网格上进行max pooling,就得到等长的RoI feature vector。

【性能】 Fast RCNN在VOC-07数据集上将检测精度mAP从58.5%提高到70.0%,检测速度比RCNN提高了200倍。

【不足】 Fast RCNN仍然选用选择性搜索算法来寻找感兴趣的区域,这一过程通常较慢,与RCNN不同的是,Fast RCNN处理一张图片大约需要2秒,但是在大型真实数据集上,这种速度仍然不够理想。

那么问题来了: “我们可以使用CNN模型来直接生成候选框吗?”,基于此,Faster RCNN的提出完美回答这一问题。

2.4 Faster RCNN

Faster RCNN 是第一个端到端,最接近于实时性能的深度学习检测算法,该网络的主要创新点就是提出了区域选择网络用于生成候选框,能几大提升检测框的生成速度。该网络首先输入图像到卷积网络中,生成该图像的特征映射。在特征映射上应用Region Proposal Network(RPN)取代Selective Search算法,返回object proposals和相应分数。应用Rol池化层,将所有proposals修正到同样尺寸。最后,将proposals传递到完全连接层,生成目标物体的边界框。

本文的主要贡献是提出Regional Proposal Networks,替代之前的SS算法。RPN网络将Proposal这一任务建模为二分类(是否为物体)的问题。

第一步是在一个滑动窗口上生成不同大小和长宽比例的anchor box(如上图右边部分),取定IoU的阈值,按Ground Truth标定这些anchor box的正负。于是,传入RPN网络的样本数据被整理为anchor box(坐标)和每个anchor box是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchor box有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。

由RPN得到Region Proposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。

【性能】 该网络在当时VOC-07,VOC-12和COCO数据集上实现了SOTA精度,其中COCO mAP@.5=42.7%, COCO mAP@[.5,.95]=21.9%, VOC07 mAP=73.2%, VOC12 mAP=70.4%, 17fps with ZFNet

【不足】 虽然Faster RCNN的精度更高,速度更快,也非常接近于实时性能,但它在后续的检测阶段中仍存在一些计算冗余;除此之外,如果IOU阈值设置的低,会引起噪声检测的问题,如果IOU设置的高,则会引起过拟合。

2.5 FPN

2017年,T.-Y.Lin等人在Faster RCNN的基础上进一步提出了特征金字塔网络FPN(Feature Pyramid Networks)技术。在FPN技术出现之前,大多数检测算法的检测头都位于网络的最顶层(最深层),虽说最深层的特征具备更丰富的语义信息,更有利于物体分类,但更深层的特征图由于空间信息的缺乏不利于物体定位,这大大影响了目标检测的定位精度。为了解决这一矛盾,FPN提出了一种具有横向连接的自上而下的网络架构,用于在所有具有不同尺度的高底层都构筑出高级语义信息。FPN的提出极大促进了检测网络精度的提高(尤其是对于一些待检测物体尺度变化大的数据集有非常明显的效果)。

【性能】 将FPN技术应用于Faster RCNN网络之后,网络的检测精度得到了巨大提高(COCO mAP@.5=59.1%, COCO mAP@[.5,.95]=36.2%),再次成为当前的SOTA检测算法。此后FPN成为了各大网络(分类,检测与分割)提高精度最重要的技术之一。

2.6 Cascade RCNN

Faster RCNN完成了对目标候选框的两次预测,其中RPN一次,后面的检测器一次,而Cascade RCNN则更进一步将后面检测器部分堆叠了几个级联模块,并采用不同的IOU阈值训练,这种级联版的Faster RCNN就是Cascade RCNN。通过提升IoU阈值训练级联检测器,可以使得检测器的定位精度更高,在更为严格的IoU阈值评估下,Cascade R-CNN带来的性能提升更为明显。Cascade RCNN将二阶段目标检测算法的精度提升到了新的高度。

【性能】 Cascade RCNN在COCO检测数据集上,不添加任何Trick即可超过现有的SOTA单阶段检测器,此外使用任何基于RCNN的二阶段检测器来构建Cascade RCNN,mAP平均可以提高2-4个百分点。

3. Anchor-based中的one-stage目标检测算法

一阶段目标检测算法不需要region proposal阶段(候选区域的筛选网路),直接产生物体的类别概率和位置坐标值,经过一个阶段即可直接得到最终的检测结果,因此有着更快的检测速度。

  • YOLO
  • SSD

3.1 YOLO v1

YOLO v1 是第一个一阶段的深度学习检测算法,其检测速度非常快,该算法的思想就是将图像划分成多个网格,然后为每一个网格同时预测边界框并给出相应概率。例如某个待检测目标的中心落在图像中所划分的一个单元格内,那么该单元格负责预测该目标位置和类别。

bbox包含物体的概率confidence计算

计算公式: confidence = 

  • 网络生成的bbox框和GT标注bbox计算IOU值(两个框的重叠率)。
  • 单元框内不包含物体时 
  • 包含物体:, 所以

因此,把输入图像划分为的网格后,网络输出的张量尺寸为。其中指的是检测框的位置信息和包含物体的概率

损失函数( Loss Function)

损失函数包含三个部分:2.1 中心点、宽、高(物体边框的回归);2.2 置信度(置信度的损失计算,关于置信度的回归);2.3 物体的类别标签(关于类别的预测)

【性能】 YOLO v1检测速度非常快,在VOC-07数据集上的mAP可达52.7%,实现了155 fps的实时性能,其增强版性能也很好(VOC-07 mAP=63.4%, 45 fps, VOC-12 mAP=57.9%),性能要优于DPM和RCNN。

【不足】 相比于二阶段的目标检测算法,尽管YOLO v1算法的检测速度有了很大提高,但精度相对教低(尤其是对于一些小目标检测问题)。

3.2 SSD

SSD算法的主要创新点是提出了Multi-reference和Multi-resolution的检测技术。SSD算法和先前的一些检测算法的区别在于:先前的一些检测算法只是在网络最深层的分支进行检测,而SSD有多个不同的检测分支,不同的检测分支可以检测多个尺度的目标,所以SSD在多尺度目标检测的精度上有了很大的提高,对小目标检测效果要好很多。

SSD相比YOLO有以下突出的特点:

  • 多尺度的feature map:基于VGG的不同卷积段,输出feature map到回归器中。这一点试图提升小物体的检测精度。
  • 更多的anchor box,每个网格点生成不同大小和长宽比例的box,并将类别预测概率基于box预测(YOLO是在网格上),得到的输出值个数为(C+4)×k×m×n,其中C为类别数,k为box个数,m×n为feature map的大小。

Anchor-based目标检测算法局限性

基于Anchor的目标检测算法主要有以下四大缺点:

  1. Anchor的大小,数量,长宽比对于检测性能的影响很大(通过改变这些超参数Retinanet在COCO benchmark上面提升了4%的AP),因此Anchor based的检测性能对于anchor的大小、数量和长宽比都非常敏感。
  2. 这些固定的Anchor极大地损害了检测器的普适性,导致对于不同任务,其Anchor都必须重新设置大小和长宽比。
  3. 为了去匹配真实框,需要生成大量的Anchor,但是大部分的Anchor在训练时标记为负样本,所以就造成了样本极度不均衡问题(没有充分利用fore-ground)。
  4. 在训练中,网络需要计算所有Anchor与真实框的IOU,这样就会消耗大量内存和时间。

4. Anchor-Free中的目标检测算法

基于Anchor的物体检测问题通常被建模成对一些候选区域进行分类和回归的问题,在一阶段检测器中,这些候选区域就是通过滑窗方式产生Anchor box,而在二阶段检测器中,候选区域是RPN生成的Proposal,但是RPN本身仍然是对滑窗方式产生的Anchor进行分类和回归。基于Anchor的检测算法由于Anchor太多导致计算复杂,及其所带来的大量超参数都会影响模型性能。近年的Anchor free技术则摒弃Anchor,通过确定关键点的方式来完成检测,大大减少了网络超参数的数量。

  • CornerNet:提出了一种新的对象检测方法,将网络对目标边界框的检测转化为一对关键点的检测(即左上角和右下角),通过将对象检测为成对的关键点,而无需设计Anchor box作为先验框。
  • CenterNet:级联角池化模块和中心池化模块
  • FSAF:提出了一种FSAF模块用于训练特征金字塔中的Anchor free分支,让每一个对象都自动选择最合适的特征。在该模块中,Anchor box的大小不再决定选择哪些特征进行预测,使得Anchor的尺寸成为了一种无关变量,实现了模型自动化学习选择特征。
  • FCOS:基于FCN的逐像素目标检测算法,实现了无锚点(Anchor free),无提议(Proposal free)的解决方案,并且提出了中心度Center ness的思想
  • SAPD:认为Anchor point的方法性能不高主要还是在于训练的不充分,主要是注意力偏差和特征选择。因而作者提出了两种策略:1)Soft-weighted anchor points对不同位置的样本进行权重分配 2)Soft-selected pyramid levels,将样本分配到多个分辨率,并进行权重加权。而在训练阶段,作者前6个epoch采用FSAF的方式,而后6个epoch会将特征选择的预测网络加入进行联合训练。

后处理方法

  • NMS(非极大值抑制)
  • 难分负样本挖掘(Hard Negative Mining, HNM)

1. NMS(非极大值抑制)

目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。非极大值抑制算法的流程如下:

  1. 根据置信度得分进行排序
  2. 选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除
  3. 计算所有边界框的面积
  4. 计算置信度最高的边界框与其它候选框的IoU。
  5. 删除IoU大于阈值的边界框
  6. 重复上述过程,直至边界框列表为空。

非极大值抑制算法逐渐发展成为以下三条路线:

  1. Greedy selection
  2. Bounding box aggregation
  3. Learning to NMS

2. 难分负样本挖掘(Hard Negative Mining, HNM)

目标检测的训练过程本质上还是一个样本数据不平衡的学习过程,因为检测算法中需要用到很多检测框,而真正包含目标的检测框占比却极少。在网络训练过程中,大量简单的负样本(背景)会主导学习方向而不利于网络往正确的方向加以优化,因此这需要采取一定的策略来解决这一问题。难分负样本挖掘(Hard Negative Mining, HNM)技术正是解决训练过程中的数据不平衡问题的一项关键技术。

难分负样本挖掘技术的演变主要经历了以下过程:

  1. Bootstrap
  2. HNM in deep learning based detectors

目标检测数据集

  • PASCAL VOC数据集
  • MS COCO数据集
  • ILSVRC
  • OID(Open Images)

1. PASCAL VOC数据集

PASCAL VOC包含约10,000张带有边界框的图片用于训练和验证。PASCAL VOC数据集是目标检测问题的一个基准数据集,很多模型都是在此数据集上得到的,常用的是VOC2007和VOC2012两个版本数据,共20个类别,分别是:

  1. 人: 人
  2. 动物: 鸟,猫,牛,狗,马,羊
  3. 交通工具: 飞机,自行车,船,公共汽车,汽车,摩托车,火车
  4. 室内: 瓶子,椅子,餐桌,盆栽,沙发,电视/显示器

整个数据的目录结构如下 

  1. JPEGImages存放图片文件
  2. Annotations下存放的是xml文件,描述了图片信息,如下图所示,需要关注的就是节点下的数据,尤其是bndbox下的数据.xmin,ymin构成了boundingbox的左上角,xmax,ymax构成了boundingbox的右下角,也就是图像中的目标位置信息

ImageSets包含以下4个文件夹:

  1. Action下存放的是人的动作(例如running、jumping等等)
  2. Layout下存放的是具有人体部位的数据(人的head、hand、feet等等)
  3. Segmentation下存放的是可用于分割的数据。
  4. Main下存放的是图像物体识别的数据,总共分为20类,这是进行目标检测的重点。该文件夹中的数据对负样本文件进行了描述。

2. MS COCO数据集

Microsoft Common Objects in Context

COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以场景理解为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的分割进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。目前为止目标检测的最大数据集,提供的类别有80 类,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。

coco数据集的标签文件标记了每个segmentation+bounding box的精确坐标,其精度均为小数点后两位一个目标的标签示意如下:

{"segmentation":[[392.87, 275.77, 402.24, 284.2, 382.54, 342.36, 375.99, 356.43, 372.23, 357.37, 372.23, 397.7, 383.48, 419.27,407.87, 439.91, 427.57, 389.25, 447.26, 346.11, 447.26, 328.29, 468.84, 290.77,472.59, 266.38], [429.44,465.23, 453.83, 473.67, 636.73, 474.61, 636.73, 392.07, 571.07, 364.88, 546.69,363.0]], "area": 28458.996150000003, "iscrowd": 0,"image_id": 503837, "bbox": [372.23, 266.38, 264.5,208.23], "category_id": 4, "id": 151109},

评价指标

目标检测常用的评价指标有:交并比准确率精度召回率FPRF1-ScorePR曲线-AP值ROC曲线-AUC值,和mAP值FPS

  • IoU(intersection over union,交并比)
  • mAP(Mean Average Precision)
  • Frame Per Second(FPS):模型一秒钟能检测图片的数量


References

CVHub | 万字长文带你入门目标检测 - 掘金

干货 | 目标检测入门,看这篇就够了(已更完) - 知乎

目标检测最新进展总结与展望 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net 7 隐藏swagger的api

1.写一个隐藏接口特性表示 using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen;using System.Web.Http.Description;namespace JiaTongInterface.Filter {public class SwaggerApi : Swashbuckle.AspNet…

iframe 实现跨域,两页面之间的通信

一、 背景 一个项目为vue2,一个项目为vue3,两个不同的项目实现iframe嵌入,并实现通信 二、方案 iframe跨域时,iframe组件之间常用的通信,主要是H5的possmessage方法 三、案例代码 父页面-vue2(端口号为…

“投资教父”熊晓鸽老了,IDG光环不再

作者 | 鸠白 艺馨 排版 | Cathy 监制 | Yoda 出品 | 不二研究 2017年,世界互联网大会上,“投资教父”熊晓鸽问映客的创始人:“今年你们利润能有多少?” 对方笑答:“5个亿吧!” “才五个亿&#xff1f…

Kubernetes (K8s) 解读:微服务与容器编排的未来

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…

leetcode 234. 回文链表

2023.9.5 本题先将链表的节点值移到数组中,再用双指针去判断该数组是否为回文的即可。 代码如下: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* …

细说GNSS模拟器的RTK功能(三)应用实例01——运行和分析模拟

在上期文章中我们介绍了基于RTCM插件来模拟RTCM使用的硬件和软件设置,本期文章我们将继续进行运行和分析模拟。 使用RTCM插件 运行和分析模拟 连接Ublox接收器 虽然采用了Novatel接收器进行模拟来获得更好的位置精度,但也同样适用于Ublox接收器。要将…

【数据结构】前言概况 - 树

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章针对树形结构作出前言,以保证可以对树初步认知。 目录: 🌍前言:&#x1f3…

Pytorch Advanced(三) Neural Style Transfer

神经风格迁移在之前的博客中已经用keras实现过了,比较复杂,keras版本。 这里用pytorch重新实现一次,原理图如下: from __future__ import division from torchvision import models from torchvision import transforms from PIL…

Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南

亚马逊平台是美国最大的一家网络电子商务公司,亚马逊公司是1995年成立,刚开始只做网上书籍售卖业务,后来扩展到了其他产品。现在已经是全世界商品品种最多的网上零售商和第二互联网公司,亚马逊是北美洲、欧洲等地区的主流购物平台…

数据结构:线性表之-循环双向链表(万字详解)

目录 基本概念 1,什么是双向链表 2,与单向链表的区别 双向链表详解 功能展示: 1. 定义链表 2,创建双向链表 3,初始化链表 4,尾插 5,头插 6,尾删 判断链表是否被删空 尾删代码 7&a…

我们这一代人的机会是什么?

大家好,我是苍何,今天作为专业嘉宾参观了 2023 年中国国际智能产业博览会(智博会),是一场以「智汇八方,博采众长」为主题的汇聚全球智能技术和产业创新的盛会,感触颇深,随着中国商业…

9月11日作业

思维导图 代码 #include <iostream> #include<string.h>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

淘宝京东扣库存怎么实现的

1. 使用kv存储实时的库存&#xff0c;直接在kv里扣减&#xff0c;避免用分布式锁 2. 不要先查再扣&#xff0c;直接扣扣扣&#xff0c;扣到负数&#xff0c;&#xff08;增改就直接在kv里做&#xff09;&#xff0c;就说明超卖了&#xff0c;回滚刚才的扣减 3. 同时写MQ&…

JVM类加载机制

目录 一、Java为什么是一种跨平台的语言&#xff1f; 二、Java代码的执行流程 解释执行为主&#xff0c;编译执行为辅&#xff1a; 三、类加载的过程 3.1、加载 类加载器&#xff08;就是加载类的&#xff09;分为&#xff1a; 3.1.1、启动类加载器&#xff08;Bootstrap…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

【数据结构】串

串 串的顺序实现简单的模式匹配算法KMP算法KMP算法的进一步优化 串的顺序实现 初始化 #define MaxSize 50 typedef char ElemType;//顺序存储表示 typedef struct{ElemType data[MaxSize];int length; }SString;/*** 初始化串*/ void InitString(SString *string) {for (int …

Cmake入门(一文读懂)

目录 1、Cmake简介2、安装CMake3、CMakeLists.txt4、单目录简单实例4.1、CMakeLists.txt4.2、构建bulid内部构建外部构建 4.3、运行C语言程序 5、多目录文件简单实例5.1、根目录CMakeLists.txt5.2、源文件目录5.3、utils.h5.4、创建build 6、生成库文件和链接外部库文件7、注意…

Mysql5.7(Docker环境)实现主从复制

文章目录 前言一、MySQL主从数据库同步如何实现&#xff1f;(理论)1.1 为什么要使用数据库主从1.2 数据库主从实现原理是什么&#xff1f; 二、Docker环境配置MySQL5.7主从(实践)2.1 配置安装Master2.2 配置安装Slave 前言 本文章将以MySQL5.7版本来讲诉MySQL主从复制的原理以…

【计算机网络】UDP数据包是如何在网络中传输的?

List item 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525;…