[实例分割] Single Stage Instance Segmentation — A Review_patrick langechuan liu: single stage instance segm-程序员宅基地

技术标签: 实例分割  MaskRCNN  Segmentation  分割  SOLO  

转载请注明作者和出处: http://blog.csdn.net/john_bh/

文章链接: Single Stage Instance Segmentation — A Review
会议及时间:2020.6

实例分割一直是计算机视觉中很热门的课题,这几年发展的很快,从 two stage 到 single stage , 从MaskRCNN 到SOLO,不断涌现出一些优秀的文章,分割的精度不断提高,速度也不断刷新。最近读了一篇关于single stage 实例分割的综述,简单梳理了实例分割的发展脉络,这里做一下简单的总结和整理,正在做实例分割方向的同学可以深入看一看文章中提到的paper。
码字不易,如果你觉得写的还可以,顺便点个赞,欢迎转发。

1. 实例分割

实例分割是一项具有挑战性的计算机视觉任务,需要预测对象实例及其逐像素分割掩码。这使得它混合了语义分割和目标检测。如下图所示:
在这里插入图片描述
从左到右,依次是目标检测任务,语义分割,实例分割任务。从图可以看出,实例分割不仅仅要求分割出物体的mask,识别出它的类别,还需要去区分同一类里面的不同instance。

自发明Mask R-CNN以来,最新的实例分割方法主要是Mask RCNN及其变体(PANet,Mask Score RCNN等)。 它采用先检测后分割的方法,首先执行对象检测以提取每个对象实例周围的边界框,然后在每个边界框内执行二进制分割以分离前景(对象)和背景。

但是,Mask RCNN速度很慢,因此无法使用许多实时应用程序。 此外,Mask RCNN预测的掩码具有固定的分辨率( 28 × 28 28\times 28 28×28),因此对于具有复杂形状的大型对象还不够完善。 在 anchor-free 目标检测方法(例如CenterNet和FCOS)的发展推动下,推动单阶段实例分割的研究,例如CenterMask,BlendMask。 这些方法中的许多方法都比Mask RCNN更快,更准确,如下图所示(该图来自SOLOv2):
在这里插入图片描述
该博客将回顾单阶段实例分割的最新进展,重点是 掩码表示 ----实例分割的一个关键方面。

2. Mask的表征方式

在实例分割中要问的一个核心问题是实例掩码的表示或参数化:

  1. 是使用局部掩码还是全局掩码?
  2. 如何表示/参数化掩码?

在这里插入图片描述
表示实例掩码的方式主要有两种:局部掩码和全局掩码。

  • 全局掩码: 这正是是我们最终想要的,它与输入图像具有相同的空间范围它的自然优势是对大小的物体都具有相同的分辨率(因此具有固定长度的特征)。可以以原图的方式来分割出mask,这不会让小物体丢失全局信息,同时也可以让小物体更容易被看见。对于大物体来说,它看的也更加清晰,边界也应当会更加的清晰。
  • 局部掩码: 它没有作为全局掩码过多的边界,因此通常更为紧凑。它必须与掩码位置一起使用才能恢复到全局掩码,而局部掩码的大小将取决于对象的大小。但是,要执行有效的批处理,实例掩码需要固定长度的参数化。最简单的解决方案是将实例掩码的大小调整为固定的图像分辨率,这是Mask RCNN所采用的。它优点其实也很明显,它同样很简单,可以和任何目标检测算法结合起来,同时它应该速度相对来说更快,占用的显存毫无疑问会更小。

根据使用的是局部掩码还是全局掩码,可以将单阶段实例分割大致分为基于局部掩码和基于全局掩码的方法。

2.1 局部mask的表征方法

基于局部掩码的方法直接在每个局部区域上输出实例掩码。

从某种意义上说,边界框是一个粗糙的掩码,它以最小的边界矩形近似于掩码的轮廓。 ExtremeNet(通过将极端点和中心点分组进行自下而上的对象检测,CVPR 2019)使用 four extreme points(因此具有8个自由度的边界框而不是传统的4自由度)执行检测,并且可以自然扩展这种更丰富的参数化通过在其相应边缘上的两个方向上将一个 extreme points 扩展到整个边缘长度的1/4的片段,从而将其生成八边形掩码。
在这里插入图片描述
从那时起,有一系列工作尝试将实例掩码的轮廓编码/参数化为固定长度的系数,并给出不同的分解基础。这些方法使每个实例的中心(不一定是bbox中心)和相对于该中心的轮廓回归。

  • ESE-Seg(用于实时实例分割的显式形状编码,ICCV 2019)为每个实例设计一个内部中心半径形状签名,并将其与Chebyshev多项式拟合。
  • PolarMask(PolarMask:具有极地表示法的单镜头实例分割,CVPR 2020)利用从中心以恒定角度间隔的光线来描述轮廓。
  • FourierNet(FourierNet:使用可微分的形状解码器进行实例分割的紧凑型掩码表示)引入了使用Fourier变换的轮廓形状解码器,并实现了比PolarMask更平滑的边界。

在这里插入图片描述
这些方法通常使用20到40个系数来参数化掩码轮廓。 它们可以快速推断并且易于优化。 但是,它们的缺点也很明显。 首先,从视觉上看,它们看上去都非常糟糕。 他们无法精确描绘掩码,也无法描绘出在中心有孔的对象。

2.2 通过4D的张量构建mask

TensorMask(TensorMask:密集对象分割的基础,ICCV 2019)是通过在每个特征图位置预测遮罩来展示密集遮罩预测思想的第一批作品之一。 TensorMask仍会预测感兴趣区域的掩码而不是全局掩码,并且它能够运行实例分割而无需运行对象检测。

TensorMask利用结构化的4D张量来表示空间域上的掩码(2D迭代输入图像中的所有可能位置,2D表示每个位置的掩码),还引入对齐的表示和张量双锥体以恢复空间细节,但是这些对齐操作 使网络甚至比两阶段的Mask R-CNN慢。 另外,为了获得良好的性能,需要使用比标准COCO对象检测管道(6倍计划)长六倍的计划来对其进行培训。
在这里插入图片描述

@ 知乎 林大佬
wh可以理解,vu可以看做是什么?像素点的坐标?不对,wh就已经包含了位置坐标信息了。应该是中心点在xy坐标处的mask,表示方式就是uv。这个方法要说巧妙吧,倒也满巧妙,毕竟何凯明出品,必出精品,但它的速度竟然比MaskRCNN还慢,有点杀第一百自损三千的赶脚。除此之外它需要更多的训练时间,是MaskRCNN训练时间的6倍。这简直无法忍受。

2.3 Compact Mask Encoding

自然对象掩码不是随机的,类似于自然图像,实例掩码的固有维数比像素空间的内维数低得多。 MEInst(用于单镜头实例分割的掩码编码,CVPR 2020)将遮罩提取为紧凑且固定尺寸的表示形式。 通过PCA的简单线性变换,MEInst能够将 28 × 28 28×28 28×28 的局部掩码压缩为60维特征向量。 本文还尝试在一级目标检测器(FCOS)上直接回归 28 × 28 = 784 − d i m 28×28 = 784-dim 28×28=784dim 特征向量,并且在AP点下降1-2个情况下也得到了合理的结果。 这意味着直接预测高维掩码(每个TensorMask以自然表示)并不是完全不可能的,但是很难优化。 掩码的紧凑表示使其更易于优化,并且在推理时也可以更快地运行。 它与Mask RCNN最相似,可以直接与大多数其他对象检测算法一起使用。
在这里插入图片描述

@ 知乎 林大佬
这个编码方式是很精妙的,完美的规避了端到端对齐的问题,什么是端到端对齐?一张图片里面的box数目,box大小都是不一样的,因此MaskRCNN这样的局部Mask的分割方式都会不可避免的引入RoIAlign这样的操作,导致了每一个batch都需要一个对齐的操作。MEInst这里做的工作就是一个标准化。不过令人遗憾的是,理想很丰满,但是现实却很骨感,虽然论文证明了这种表征方式可行,速度却没有和MaskRCNN高出多少,源自于这里面的编码和解码的操作比较耗时。

2.4 全局Mask表征方式

基于全局掩码的方法首先基于整个图像生成中间和共享特征图,然后组合提取的特征以形成每个实例的最终掩码。这是最近的一阶段实例分割方法中的主流方法。

原型和系数

  • YOLACT(YOLACT:实时实例分割,ICCV 2019)是尝试进行实时实例分割的首批方法之一
    YOLACT将实例分割分为两个并行任务,生成一组原型掩码并预测每个实例的掩码系数。原型掩码是使用FCN生成的,可以直接受益于语义分割的进步。系数被预测为边界框的额外特征。这两个并行步骤之后是组装步骤:通过矩阵乘法实现的简单线性组合,并使用每种实例的预测边界框进行裁剪操作。裁剪操作减轻了网络抑制边界框外部噪声的负担,但如果边界框包含同一类的另一个实例的一部分,仍然会发现一些泄漏。
    由于yolact里面采用了全局的Mask,并且最终生成的mask质量只取决于全图的分辨率,与mask的数目无关,这就使得yolact在计算mask的速度上,可以和mask的数目无关,它是一个常量。这也是Yolact速度比较快的原因之一;
    在这里插入图片描述
  • InstanceFCN(实例敏感的全卷积网络,ECCV 2016)和 FCIS(全卷积实例感知语义分割,CVPR 2017)
    它们似乎是YOLACT的特例。 InstanceFCN和FCIS都使用FCN生成多个实例敏感的分数图,其中包含对象实例的相对位置,然后将组装模块应用于输出对象实例。位置敏感的分数图可以看作是原型掩码,但是IntanceFCN和FCIS代替了学习的线性系数,而是使用一组固定的空间池化操作来组合位置敏感的原型掩码。
    在这里插入图片描述
  • BlendMask(BlendMask:自上而下遇到实例分割,自下而上,CVPR 2020),是一个比较精妙,精度很高,速度也做的很快的方法。
    建立在YOLACT之上,但是BlendMask并未预测每个原型掩码的标量系数,而是预测了低分辨率(7×7)的注意力图来混合 边界框内的掩码。 该关注图被预测为附加到每个边界框的高维特征(7×7 = 49-d)。 有趣的是,BlendMask使用的原型掩码为4,但是即使只有1个原型掩码也可以使用。 CenterMask(CenterMask:具有点表示的单镜头实例分割,CVPR 2020)几乎以完全相同的方式工作,并明确使用1个原型掩码(称为全局显着图)。
    在这里插入图片描述

@ 知乎 林大佬
你如果仔细思考BlendMask的做法,你会看到MaskRCNN的引子,但是也会看到Yolact的引子。因为它依赖于detector,同时也用到了全局的Mask。这篇paper,在它的Blender模块里面,使用了全局的Mask,同时通过FCOS检测到的position来融合局部的mask和对应位置的全局Mask,进而得到一个更加准确的Mask回归。结果也确实如此,BlendMask渲染出来的Mask边框更加完美。

  • CondInst(实例分割的条件卷积)
    又向前迈了一步,并完全消除了对边界框的任何依赖,彻底的去掉了detector,完全完全的不需要检测器来辅助。 它没有组装裁剪的原型掩码,而是借鉴了动态滤镜的思想,并预测了轻质FCN头的参数。 FCN头共有三层,共有169个参数。 令人惊讶的是,作者表明,即使原型模板仅是2通道的CoordConv,该网络也可以预测COCO为31 AP时的良好结果。
    在这里插入图片描述
BlendMask / CenterMask和CondInst都是YOLACT的扩展。

BlendMask / CenterMask正在尝试将裁剪的原型掩码与每个bbox中的更细粒度的掩码混合。 YOLACT是BlendMask或CenterMask的一种特殊情况,其中注意图的分辨率为1×1。
CondInst尝试将裁剪的原型掩码与由动态预测的滤镜组成的更深转换进行混合。 YOLACT是CondInst的一种特殊情况,其中FCN是1 1×1 conv层。
使用分支来预测原型掩码可以使这些方法受益于使用语义分割的辅助任务(通常在AP中提高1到2点)。它也可以自然扩展以执行全景分割。

关于代表每个实例掩码所需的参数,下面列出了一些技术细节。这些具有全局掩码和系数的方法每个实例掩码使用32、196、169个参数。

 - YOLACT使用32个原型掩码+ 32个昏暗掩码系数+盒子裁剪; 
 - BlendMask使用4个原型掩码+ 4个7×7注意图+盒子裁剪;
 - CondInst使用coordConv + 3 1×1动态转换(169个参数)

语义分割可预测图像中每个像素的语义类别。 类似地,例如分割,我们建议预测每个像素的“实例类别”。 现在的关键问题是,我们如何定义实例类别?

如果输入图像中的两个对象实例具有完全相同的形状和位置,则它们是相同的实例。 任何两个不同的实例具有不同的位置或形状。而且由于通常难以描述形状,因此我们用大小来近似形状。

在这里插入图片描述
因此,“实例类别”由位置和大小定义。位置按其中心位置分类。 SOLO通过将输入图像划分为S x S个单元格和 S × S S\times S S×S 类的网格来近似中心位置。通过将不同大小的对象分配给要素金字塔(FPN)的不同级别来处理大小。因此,对于每个像素,SOLO只需决定将哪个像素(以及相应的实例类别)分配给哪个SxS网格单元和哪个FPN级别。因此,SOLO仅需要执行两个像素级分类问题,类似于语义分割。现在,另一个关键问题是口罩如何代表?

实例掩码由堆叠到 S × S S\times S S×S通道中的全局掩码直接表示。这是一个巧妙的设计,可以同时解决许多问题。首先,许多先前的研究将2D遮罩存储为平坦向量,当遮罩分辨率提高导致通道数量激增时,这很快变得很棘手。全局遮罩自然保留了遮罩像素内的空间关系。其次,全局遮罩生成可以保留遮罩的高分辨率。第三,预测遮罩的数量是固定的,而与图像中的对象无关。这类似于原型掩码的工作,我们将看到这两个流如何在SOLOv2中合并。

SOLO将实例细分公式化为仅分类问题,并消除了任何依赖于回归的问题。这使得SOLO自然独立于对象检测。 SOLO和CondInst是直接在全局掩码上运行的两个方法,并且是真正的 bounding box free。
在这里插入图片描述

  • 分辨率的权衡
    从SOLO预测的全局掩码中,我们可以看到这些掩码对定​​位误差相对不敏感,因为相邻通道预测的掩码非常相似。这带来了对象定位的分辨率(以及精度)与实例掩码之间的折衷。

    TensorMask的4D结构张量的想法在理论上是完全合理的,但在当前NHWC张量格式的框架中很难在实践中实现。将具有空间语义的2D张量展平为1D向量将不可避免地丢失一些空间细节(类似于对完全连接的网络进行语义分割),并且甚至在表示128×128的低分辨率图像时也有其局限性。位置的2D或掩码的2D必须牺牲分辨率。以前的大多数研究都认为位置分辨率更为重要,并且降低采样率/压缩掩码尺寸会损害掩码的表现力和质量。 TensorMask试图达到一种平衡,但是乏味的操作导致缓慢的训练和推理。 SOLO意识到我们不需要高分辨率的位置信息,而是通过将位置压缩为一个粗略的S²网格来借鉴YOLO。这样,SOLO可以保持全局掩码的高分辨率。

  • Decoupled SOLO & Dynamic SOLO
    如上所述,SOLO在S²通道中预测的全局掩码非常冗余且稀疏。 即使在S = 20的粗略分辨率下,也有400个通道,而且图片中的对象也不大可能每个通道都包含有效的实例掩码。

    在解耦的SOLO中,形状为 H × W × S 2 H \times W \times S^2 H×W×S2的原始M张量由两个形状为 H × W × S H \times W \times S H×W×S的张量 X X X Y Y Y代替。对于位于网格位置 ( i , j ) (i,j) ij的对象, M i j M_{ij} Mij近似为 逐元素相乘 X i ⊗ Y j X_i⊗Y_j XiYj。 这将400个通道减少到40个通道,并且实验表明性能没有降低。
    在这里插入图片描述
    现在自然要问我们是否可以通过预测更少的掩模并预测每个网格单元的组合系数来借鉴YOLACT的原型掩模思想? SOLOv2正是这样做的。

    在SOLOv2中,有两个分支,一个功能分支和一个内核分支。 特征分支预测E个原型掩码,而内核分支预测每个S²网格单元位置的大小为D的内核。 正如我们在上面的“ YOLACT”部分所看到的,这种动态过滤方法是最灵活的。 当D = E时,它是原型掩码(或1×1转换)的简单线性组合,与YOLACT相同。 本文还尝试了3×3的conv内核(D = 9E)。 通过预测轻量级多层FCN的权重和偏差(例如在CondInst中),可以采取进一步的措施。
    在这里插入图片描述
    现在,由于全局掩码分支与其专用位置分离,我们可以观察到,新兴的原型掩码展示的图案比SOLO中的更加复杂。 它们仍然对位置敏感,并且与YOLACT更相似。

2.4 掩模的隐式表示

最初,CondInst和SOLOv2中使用动态滤波器的想法听起来很辉煌,但是如果您将其视为线性组合系数列表的自然扩展,则实际上非常简单。

还可以认为使用系数或注意力图将掩膜参数化,或者最终将其参数化为用于小型神经网络头部的动态过滤器。 最近在3D学习中也探索了使用神经网络对几何实体进行动态编码的想法。 传统上,3D形状通过体素,点云或网格进行编码。 占用网络(Occupancy Networks:Learning 3D Reconstruction in Function Space,CVPR 2019)建议通过将深度神经网络的连续决策边界视为3D表面,将形状编码为神经网络。 网络接受3D点,并告诉它是否在编码的3D形状的边界上。 这种方法可以在推理过程中以任何分辨率提取3D网格。
在这里插入图片描述
我们是否可以学习一个由每个对象实例的动态过滤器组成的神经网络,以便该网络以2D形式获取一个点,并在该点属于或不属于该对象掩码的情况下进行输出? 这自然会输出全局掩码,并且可以具有任何所需的分辨率。 回顾CondInst的消融研究,结果表明即使没有原型掩码,也只有CoordConv输入(用作执行统一的空间采样)。 由于此操作与原型掩码的分辨率分离,因此有趣的是,以更高的分辨率单独输入CoordConv以获取更高分辨率的全局掩码,以查看这是否会提高性能。 我坚信实例掩码的隐式编码将是未来。

在这里插入图片描述

3. 小结

大多数单阶段实例分割工作都基于anchor-free 对象检测,例如CenterNet和FCOS。 也许不足为奇,以上许多论文来自阿德莱德大学创建FCOS的同一实验室。 他们最近在https://github.com/aim-uofa/AdelaiDet/上开放了其平台的资源。

最近的许多方法都非常快,可以实现实时或接近实时的性能(30+ FPS)。 NMS通常是实时实例分割的瓶颈。 为了实现真正的实时性能,YOLACT使用Fast NMS,SOLOv2使用Matrix NMS。

  • 通过更高维度的encoding来表征Mask是很棘手的问题,现在大多数的算法都把mask encoding在低纬度,比如20到200,事实上可能也是这个方法的瓶颈所在,不然大家都用更高的了;
  • 手工制作的contour的方法,不是很好的办法,这类方法看起来没啥前途,事实上我的其他post也讲到过实例分割的用途,一个最大的用途就是在无人驾驶里面用,如果你的Mask不够准,我也就没啥用了;
  • 局部Mask的方法大多数依赖于detector,我任务这样的方法过于复杂了,它也没有使得精度提高多少,反而使得部署过于困难,比如BlendMask需要全局的mask和location融合,还会引入类似于ROIAlign和ROIPooling的操作,在后处理阶段,实际使用上是很复杂的;
  • 全局的Mask表征有时候比较昂贵,显存和速度都可能成为瓶颈,ConsInst这种方式其实应该速度会比SOLOV2慢一点,因为它的分支数更多;
  • SOLOv2这个思路延续下去,或许会有更好的方法产生。

4. References

  1. SOLO: Segmenting Objects by Locations ,Arxiv 12/2019,ECCV 2020
  2. SOLOv2:Dynamic, Faster and Stronger,Arxiv 03/2020
  3. CondInst: Conditional Convolutions for Instance Segmentation, Arxiv 03/2020 ECCV 2020 oral
  4. PolarMask: Single Shot Instance Segmentation with Polar Representation, CVPR 2020 oral
  5. PointRend: Image Segmentation as Rendering, CVPR 2020 oral
  6. BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation, CVPR 2020
  7. CenterMask: single shot instance segmentation with point representation, CVPR 2020
  8. MEInst: Mask Encoding for Single ShotInstance Segmentation, CVPR 2020)
  9. ESE-Seg: Explicit Shape Encoding for Real-Time Instance Segmentation, ICCV 2019
  10. YOLACT: Real-time Instance Segmentation, ICCV 2019
  11. TensorMask: A Foundation for Dense Object Segmentation, ICCV 2019
  12. FCOS: Fully Convolutional One-Stage Object Detection, ICCV 2019
  13. Occupancy Networks:Learning 3D Reconstruction in Function Space, CVPR 2019
  14. Mask Scoring R-CNN, CVPR 2019
  15. PANet: Path Aggregation Network for Instance Segmentation, CVPR 2018
  16. CoordConv: An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution, NeurIPS 2018
  17. Mask R-CNN, ICCV 2017 Best paper
  18. FCIS: Fully Convolutional Instance-aware Semantic Segmentation, CVPR 2017
  19. Associative Embedding: End-to-End Learning for Joint Detection and Grouping, NeuRIPS 2017
  20. InstanceFCN: Instance-sensitive Fully Convolutional Networks, ECCV 2016)
  21. FCN: Fully Convolutional Networks for Semantic Segmentation, CVPR 2015

This article was originally published on Towards Data Science and re-published to TOPBOTS with permission from the author.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/john_bh/article/details/107180851

智能推荐

ZOJ-3772 Calculate the Function(线段树,矩阵乘法)-程序员宅基地

文章浏览阅读260次。Calculate the FunctionTime Limit: 2 Seconds Memory Limit: 65536 KBYou are given a list of numbers A1 A2 .. AN and M queries. For the i-th query:The query has two parameters Li and R_calculate the function

linux命令实现git代码copy到svn仓库并提交_git文件考到svn路徑下,怎麽留下copy路徑-程序员宅基地

文章浏览阅读534次。项目需要,将git仓库master代码copy到svn仓库的主干上,需要在linux上实现,只能老老实实敲命令了。1. 解决方案 非常原始,首先创建/git目录,然后clone git仓库master最新代码,copy到/svn目录下,删除.git文件,然后使用svn add,commit到svn的分支上。2. 直接写命令:#创建git文件夹并进入目录,mkdir -p:递归创建目录,即使上级目录不存在,会按目录层级自动创建目录mkdir -p /code/..._git文件考到svn路徑下,怎麽留下copy路徑

win10linux双系统时间,win10与linux双系统切换时间不一致的调整-程序员宅基地

文章浏览阅读956次。按照Linux系统之后再切换回到win10后,我发现win10的时间不再是北京时间,而是比北京时间多了整整8小时,之后百度找到了问题来源,这里给出解决方法。如果安装了 Windows 和 Linux(比如 Ubuntu)双系统,有时会出现两个系统的时间不一致的情况。这是因为,两个操作系统对电脑硬件时间的定义不一样,Windows 认为电脑硬件时间是“本地时间”,因此它启动后直接用该时间作为“系统时..._win10+linux电脑时间不对

别浪费自己的高学历_别浪费自己的高学历,你最该拥有这些能力-程序员宅基地

文章浏览阅读237次。转自:科学堂原文链接:http://scienceroom.net/dont-waste-your-high-academic-records-666.html很多人在问念研究生能学到什么,短短的两年时间,上课学不到多少有用的,科研也没怎么搞,到底念研究生能学到什么?一开始念硕士博士的时间都是有这 些迷惘的,甚至有些人连这些问题想也没想。如果用点心思,不管我们将来搞不搞_别浪费自己的高学历,你最该拥有这些能力

【改进篇】Python实现VRP常见求解算法——量子粒子群算法(QDPSO)_python群算法求解vrptw-程序员宅基地

文章浏览阅读342次。基于python语言,实现经典量子粒子群算法(QDPSO)对车辆路径规划问题(CVRP)进行求解,优化代码结构,改进Split函数_python群算法求解vrptw

Spring整合Kafka消费端concurrency参数设置_kafka concurrency-程序员宅基地

文章浏览阅读7.9k次,点赞4次,收藏19次。Spring整合Kafka时在消费端为我们提供了一个参数concurrency,这个参数可主要是用来设置消费者的线程数,提高消费的能力,当然与所有线程数设置的套路一样,这个值并不是越大越好。Spring中提供的这个参数其原理就和启动多个消费者一样,kafka在启动时会根据你的消费者数量与主题中的分区数进行匹配,比如你有3个消费者订阅了‘test_topic’主题,这个主题又有3个分区,那么kafka就会为每一个消费者分配一个分区,服务端再发送消息时,可以把消费均匀的发送到3个分区中,这样就可以实现3个消费_kafka concurrency

随便推点

InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts_[error] innodb: io_setup() failed with eagain afte-程序员宅基地

文章浏览阅读1.5k次。在一台服务器中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用。之前运行一直没有问题(最多的时候有23个MySQL实例同时运行),后来新配置了一台服务器,启动其对应的实例时失败。部分错误日志如下:……140505 16:05:59 InnoDB: Using Linux native AIO140505 16:05:59 InnoDB: Warning: io_se..._[error] innodb: io_setup() failed with eagain after 5 attempts. [error] inno

原生js轮播图的实现_原生轮播-程序员宅基地

文章浏览阅读284次。原理就是当点击到小圆点时,得到相应的i值,这个i值也就是span的index值,我们拿他和全局变量index作比较,然后重新设置wrap.style.left的值,然后把i值复制给全局变量index,最后显示当前的小原点即可。值得注意的是这里涉及到了闭包的概念,如果直接使用for循环,则不能得到正确的结果。很多网站都有轮播图,我这里为大家简答的介绍一下,如果有些的不对的地方请大家及时提出意见,也希望给大家带来帮助。小圆点部分是那个可以点击切换部分这个是根据图片来设置圆点的个数的不是自己想设置多少。..._原生轮播

ssldump0.9b3版本的源码分析-程序员宅基地

文章浏览阅读668次。一、目录结构Base 提供一些数据收集和调试打印的功能 Common 提供一些链表、字符串结构、位域、调试、错误打印、时间戳、线程操作等功能 Dummy 无 Null 提供了分析数据的功能,跟ssl目录中的analyze部分很像,还不明白具体的用处 Ssl 对tcp连接的往返数据进行顺序解析https的过程 Wi..._ssldump0.9b3

全志H616方案香橙派orangepi zero2的26pin接口 SPI测试_香橙派zero2 的26pin 修改功能-程序员宅基地

文章浏览阅读1.2k次。1) 由 26pin 接口的原理图可知,Orange Pi Zero 2 可用的 spi 为 spi12) 先查看下 linux 系统中是否存在 spidev1.1 的设备节点,如果存在,说明 SPI1 已 经设置好了,可以直接使用3) 再在 wiringOP 的 examples 中编译 spidev_test 测试程序4) 先不短接 SPI1 的 mosi 和 miso 两个引脚,运行 spidev_test 的输出结果如下所示, 可以看到 TX 和 RX..._香橙派zero2 的26pin 修改功能

C++ 赋值、浅拷贝、深拷贝和零拷贝解析_c++零拷贝-程序员宅基地

文章浏览阅读2.3k次。1. 浅拷贝浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。2. 深拷贝深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的,示意图大致如下:3. 赋值与浅拷贝差异赋值:把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的_c++零拷贝

php流程控制(新建流程)-程序员宅基地

文章浏览阅读136次。流程控制,又是一个广泛应用于办公自动化等内部自定义流程及审核的功能。比如请假流程啊,申请办公用品经费,报销申请啊,等等,需要层层审批通过才能完成的(按规章办事,最好别越级,你说是吧)不习惯一篇博客太长,看不过来,这篇我们先实现流程的新建先看看效果图1.有个下拉选择用户,可以依次添加到流程的节点位置,2.下方显示流程的每个节点3.填写流程名称,点击保存即可完成流程的新建数..._php事件上报流程功能

推荐文章

热门文章

相关标签