何时提取ReID特征:一种改进多目标跟踪的选择性方法

ops/2024/9/24 20:35:37/

摘要
https://arxiv.org/pdf/2409.06617
提取和匹配重识别(Re-ID)特征被许多最先进的(SOTA)多目标跟踪(MOT)方法所使用,特别是在频繁和长期遮挡的情况下特别有效。尽管端到端的目标检测和跟踪一直是最近研究的主要焦点,但它们尚未在MOT17和MOT20等基准测试中超越传统方法。因此,从应用的角度来看,具有单独检测和嵌入的方法仍然是准确性、模块化和易于实现的最佳选择,尽管由于涉及的开销,它们对边缘设备来说不切实际。在本文中,我们研究了一种选择性方法,以最小化特征提取的开销,同时保持准确性、模块化和易于实现。这种方法可以集成到各种SOTA方法中。我们通过将其应用于StrongSORT和Deep OC-SORT来证明其有效性。在MOT17、MOT20和DanceTrack数据集上的实验表明,我们的机制在遮挡期间保留了特征提取的优势,同时显著减少了运行时间。此外,它通过防止特征匹配阶段的混淆来提高准确性,特别是在变形和外观相似性的情况下,这在DanceTrack中很常见。https://github.com/emirhanbayar/Fast-Deep-OC-SORT

  1. 引言

目标跟踪(MOT)是维护预定义类别对象在一系列帧中身份的问题[12]。跟踪检测(TbD)长期以来一直是该领域的主导范式。遵循这一范式的方法将跟踪分为两个步骤:(1)逐帧目标检测,以及(2)数据关联以形成轨迹[39]。实时TbD方法通常为每个跟踪对象保持一个卡尔曼滤波器[19],通过匈牙利算法[20]将对象的估计状态与检测匹配,并更新与匹配检测的轨迹状态[1,5,9,12,27,29,43-45,50,55]。匹配算法的成本矩阵可以基于对象的位置、运动、外观或多种因素的组合[9,27,50]。

Re-ID特征[17,24]由于其对遮挡和混乱的鲁棒性而在最先进的(SOTA)方法的匹配阶段被广泛使用[1,12,21,27,50,56]。这些方法依赖于计算成本高昂的卷积神经网络(CNN)进行特征提取,在资源受限的硬件上执行时,导致极低的FPS(每秒帧数)[14]。另一方面,现有的MOT方法优先在如MOT17[30]、MOT20[11]和DanceTrack[46]等预录数据集上实现高准确性。然而,在实时图像流中,随着FPS的降低,帧的捕获间隔变宽,对象位置和运动的变化更加显著。因此,预测和匹配步骤中的错误增加[13,58]。这使得上述方法对边缘人工智能应用来说不切实际。

已经提出了几种尝试来减轻由于单独检测和跟踪而导致的特征提取的开销。联合检测和嵌入(JDE)[49]的概念就是这样一种方法,它使得检测和特征提取在一个共享的骨干网络中进行[21,22,49,52,56]。一些其他方法通过回归先前检测来替代数据关联[3,6]。随着DETR[10]的引入,使用变换器的方法,这些方法学习检测和轨迹的时空关系,用于端到端的目标检测和跟踪变得流行[8,28,47,53]。然而,它们因缺乏模块化和训练及部署的计算需求而受到批评[31,39]。

尽管端到端的目标检测和跟踪是趋势,并且从研究的角度来看很有趣,但它们尚未在MOT17和MOT20等知名基准测试中超越传统方法。因此,具有单独检测和嵌入的TbD方法由于其准确性、模块化和易于实现,从应用的角度来看仍然是最佳选择[7, 18, 40]。与其消除特征提取步骤,最近的一项研究[2]提出了一种优雅的策略,以最小化执行特征提取的检测数量。尽管这个想法很有启发性,并且比不使用ReID特征的跟踪器表现更好,但它确实降低了与应用算法的原始跟踪器相比的准确性。在这项研究中,我们提出了扩展此算法的扩展,以限制提取数量,而不会牺牲准确性——实际上是提高它。这项工作的贡献可以总结如下:

  • 一种选择性机制,以最小化特征提取的开销,同时保持准确性、模块化和易于实现。这种方法可以应用于任何使用状态估计器(例如卡尔曼滤波器)并基于ReID特征进行匹配的实时TbD跟踪器。
  • 一种特征衰减机制,通过增强匹配特征的时间局部性来提高准确性。
  • 在StrongSORT和Deep OC-SORT上的实现展示,以及在MOT17、MOT20和DanceTrack数据集上的详细分析,以及在边缘设备上的运行时间分析。
  1. 相关工作
    2.1. 基于检测的跟踪 (TbD)

遵循TbD范式的方法有两个基本组成部分:目标检测和目标关联[16,30]。在这些方法中,轨迹的更新完全取决于匹配的检测。这使得目标检测步骤不可或缺。另一方面,目标关联步骤负责确定检测和轨迹之间的对应关系。这些方法根据它们执行目标关联步骤的方式而有所不同。

SORT[5]是一种基线方法,使用卡尔曼滤波器预测下一帧中对象的位置,并使用匈牙利算法将检测与轨迹关联起来。匈牙利算法的成本矩阵基于检测和轨迹的交集比(IoU)。然而,仅IoU成本本身不足以对抗遮挡和误检测的鲁棒性。

DeepSORT[50]是SORT的一种扩展,它使用深度神经网络来提取检测到的目标的外观特征,并在匹配阶段的成本矩阵中使用这些特征。由于其对频繁和长期遮挡的鲁棒性,特征提取已成为那些优先考虑精度而非速度的方法的关键组成部分。已经提出了成本矩阵构建、特征更新/存储机制和匹配策略的不同组合[1,12,27,55]。另一方面,一些优先考虑速度而非精度的方法[26,41,42]忽略了特征提取步骤,而是利用运动信息将检测到的目标与轨迹相关联。然而,有人批评这些方法对目标的运动模式做出了假设[48],可能在拥挤的场景中效果不佳。

2.2. 联合检测和嵌入(JDE)

为了消除特征提取的开销,引入了联合检测和嵌入(JDE)[49]的概念,将检测和特征提取整合到一个统一的骨干网络中。Tong等人[51]在Faster R-CNN[36]中添加了一个全连接分支以获得ReID特征,并融合了基于实例的分类损失,除了分类和回归损失之外。JDE[49]方法用Yolov3[35]替换了Faster R-CNN,这是一个两阶段检测器,用三元组损失[38]替换了基于实例的分类。FairMOT[56]解决了由锚点引起的问题,并通过融合基于实例的分类损失来训练CenterNet[59],这是一个无锚检测器。JDE概念的主要问题是重识别和目标分类任务之间的竞争。虽然前者需要区分同一类别的实例的特征,但后者需要所有同一类别的实例都拥有的共同特征,并且能够区分其他类别。

2.3. 无ReID的联合检测与跟踪
联合检测与跟踪,或称端到端跟踪,旨在通过提出运动先验的数据驱动关联来消除ReID特征匹配。链式跟踪器(Chained tracker)[34]、Tracktor[4]和TubeTK[33]通过对跨帧的检测进行回归来生成轨迹。最近,基于Transformer的端到端模型因其能够建模上下文和时空信息而广受欢迎[8,28,47,53]。尽管它们在DanceTrack上取得了成功,但在MOT17和MOT20基准测试中却表现不佳。此外,它们以复杂的训练策略和漫长的训练时间而闻名[32,39]。另外,它们的推理速度可能无法超越那些单独进行检测和跟踪的方法[48],这些方法在MOT17和MOT20基准测试中表现优异,并且由于其模块化特性而易于实现和扩展。

2.4. 选择性特征提取
最近,Bayar等人提出了一种算法,该算法根据可能的候选轨迹数量对检测进行解耦[2]。通过简单的交并比(IoU)检查,将只有一个可能候选的检测排除在特征提取和匹配之外,而从没有或有多个候选的检测中提取ReID特征。尽管它在最小化特征提取开销的同时保持了模块化,并使准确性远高于没有ReID匹配的跟踪器方面表现出色,但与该算法应用的原始方法相比,它降低了准确性。

  1. 提出的方法
    我们的方法可以应用于任何使用卡尔曼滤波器的现有基于检测的跟踪(TbD)跟踪器。这些跟踪器通常将检测与每帧中的现有轨迹进行匹配。这样,轨迹可以视为检测的候选。我们的基线将是[2]中提出的机制,该机制简单地检测具有单个候选轨迹的检测,并将其从特征提取中豁免。在本节中,我们首先检查基础机制及其缺点,然后引入新模块以避免这些问题。

3.1. 基础机制

给定一组检测,对于每个检测,基础机制计算特定检测与所有已确认轨迹之间的IoU。已确认的轨迹是在先前的帧中至少与检测匹配过一次的那些。如果存在一个具有大于某个阈值的IoU的已确认轨迹,则将检测标记为无需外观特征即可匹配的非风险检测;否则,将其标记为风险检测。如果检测被标记为非风险,与检测具有最大IoU的轨迹被视为候选,如方程1中所述,其中 ct ⁡ ( d ) \operatorname{ct}(\mathrm{d}) ct(d)表示检测d的候选。这种方法应用于StrongSORT[12],其匹配是两阶段的,首先仅依赖于外观特征,其次仅依赖于IoU成本。非风险检测直接分配了无限的外观特征向量,以便与所有轨迹具有无限的余弦距离,因此豁免了匹配的第一阶段,由于只有一个候选,所以在第二阶段因为只有一个候选而匹配。
ct ⁡ ( d ) = { argmax ⁡ t ∈ T ( IoU ⁡ ( d , t ) ) if  ∣ { t ∈ T ∣ IoU ⁡ ( d , t ) > θ I o U } ∣ = 1 ∅ otherwise  \operatorname{ct}(d)=\left\{\begin{array}{ll} \underset{t \in T}{\operatorname{argmax}}(\operatorname{IoU}(d, t)) & \text { if }\left|\left\{t \in T \mid \operatorname{IoU}(d, t)>\theta_{\mathrm{IoU}}\right\}\right|=1 \\ \emptyset & \text { otherwise } \end{array}\right. ct(d)={tTargmax(IoU(d,t)) if {tTIoU(d,t)>θIoU}=1 otherwise 

这种机制有三个主要缺点:

  • 将检测从匹配的第一阶段排除可能是不安全的。此外,该方法假设第一阶段将完全依赖于外观特征,否则将不适用。
  • 在检测缺失的情况下。应该与缺失检测匹配的轨迹可以被视为另一检测的候选。此外,一个轨迹可能被错误地标记为超过两个检测的候选。
  • 通过避免特征提取,该机制破坏了用于保留长期信息的特征更新机制[1,12,27]。

3.2. 确保匹配而非过滤

与基础机制中赋予无限向量不同,非风险检测的外观特征直接从其候选轨迹中复制。换句话说,如果在检测中只有一个候选轨迹,则在匹配过程中将外观特征的贡献设置为零。考虑到一些现有的跟踪器[1,12]如果重叠小于某个阈值,则将外观特征的成本设置为最大,而本方法则相反。如果存在一个具有高IoU的轨迹,则将外观特征的成本设置为零。这样,由于特征成本为零且只有一个基于运动线索的候选,它们将被匹配。

3.3. 纵横比相似性

为了减轻缺失检测和每个轨迹的多个检测造成的问题,引入了基于纵横比相似性的阈值。正如在完整的IoU损失论文[57]中介绍的,两个边界框纵横比的相似性计算如下:
V = 4 π 2 ⋅ ( arctan ⁡ ( w 1 h 1 ) − arctan ⁡ ( w 2 h 2 ) ) 2 V=\frac{4}{\pi^{2}} \cdot\left(\arctan \left(\frac{w_{1}}{h_{1}}\right)-\arctan \left(\frac{w_{2}}{h_{2}}\right)\right)^{2} V=π24(arctan(h1w1)arctan(h2w2))2

如果检测和其候选之间的纵横比相似性低于阈值,则认为该匹配是可疑的,并且检测被标记为风险匹配,无需特征。

由于纵横比相似性的重要性取决于IoU,我们还采用了完整IoU的方程3。

α = V ( 1 − I o U ) + V \alpha=\frac{V}{(1-I o U)+V} α=(1IoU)+VV

这种计算的目的是根据不同的重叠情况调整阈值。例如,在图2中,如果为 α ( θ α ) \alpha\left(\theta_{\alpha}\right) α(θα)设置的阈值为0.6,则纵横比相似性的有效阈值将是蓝色虚线。当IoU为0或0.2时,阈值将为1,这意味着无论纵横比多么相似,它都会被标记为风险。因此,也隐式地为IoU设置了较低的阈值。

3.4. 特征衰减

如前所述,如果与轨迹片段相关联的检测具有提取的特征,则该轨迹片段的特征将进行更新;否则,它将保持不变。轨迹片段的特征含义可能因实现方式而异。如果跟踪器使用像DeepSORT [50]中的特征库机制,则该机制的唯一副作用是向特征库中添加新特征的频率较低,这可以视为以更高的间隔从环境中进行采样。最近的跟踪器[1, 12, 27]通常将特征作为前一帧特征的指数移动平均(EMA)来保存。这是通过给当前特征向量 ( e t − 1 ) \left(e^{t-1}\right) (et1)一个高权重 ( α ) (\alpha) (α),并给新来的特征 ( f t ) \left(f^{t}\right) (ft)一个低权重来实现的,如等式4所示。这样,随着帧的通过,特征在平均值中的重要性呈指数衰减。

e t = α ⋅ e t − 1 + ( 1 − α ) ⋅ f t e^{t}=\alpha \cdot e^{t-1}+(1-\alpha) \cdot f^{t} et=αet1+(1α)ft

在提出的方法中,由于在没有特征的情况下进行匹配时不会更新特征,因此早期特征的重要性不会衰减。为了防止这种情况,我们建议通过取特定轨迹自上次特征提取以来的帧数的 α \alpha α的指数来模仿这种衰减效果。这样,特征在平均值中的重要性随着帧的传递而指数衰减。

{ α ′ ← α ′ ⋅ α if no new feature  e t = α ′ e t − 1 + ( 1 − α ′ ) f t ; α ′ ← α if new feature  \left\{\begin{array}{ll}\alpha^{\prime} \leftarrow \alpha^{\prime} \cdot \alpha & \text { if no new feature } \\ e^{t}=\alpha^{\prime} e^{t-1}+\left(1-\alpha^{\prime}\right) f^{t} ; \alpha^{\prime} \leftarrow \alpha & \text { if new feature }\end{array}\right. {αααet=αet1+(1α)ft;αα if no new feature  if new feature 

  1. 实验

    4.1. 实验设置
    随着IoU阈值的增加,一些其他具有显著重叠的轨迹将被忽略。这些情况将在4.3节中进一步解释。
    我们已在StrongSORT[12]和Deep OC-SORT[27]上实现了该机制,并将它们命名为FastStrongSORT(FSS)和Fast-Deep-OC-SORT(FDOS)。我们保留了原始方法的所有参数和步骤。Deep-OC-SORT将检测分为低置信度检测和高置信度检测,并在匹配阶段像ByteTrack[55]那样以不同的方式使用它们。该机制仅应用于高置信度检测。StrongSORT和Deep OC-SORT都使用YOLOX[15]作为目标检测器,并使用BoT[25]和SBS[17]方法训练的ResNest50[54]作为特征提取器。StrongSORT为MOT17和MOT20数据集提供了预检测和预提取的特征。我们使用OC-SORT共享的权重获得了DanceTrack数据集的检测。为了使StrongSORT能够实时运行以进行运行时实验,我们在具有8GB RAM和256个CUDA核心的NVIDIA Jetson TX2上进行了这些实验。
    为了使我们的结果与原始方法具有可比性,我们在不包括运行时测量的实验中使用了原始StrongSORT的预提取特征和检测。
    实验的主要目的是找出在不损失任何HOTA[23]分数的情况下,FPS(每秒帧数)可以提高多少。同时,还将检查原始方法论文中存在的其他指标(如AssA[23]和IDF1[37])的变化情况。

4.2. 最佳配置

图3显示了我们机制引入的不同参数组合的HOTA分数。一般来说,较小和较高的IoU阈值会导致HOTA的减少,最高分在0.2附近获得。乍一看,这可能看起来违反直觉,因为降低IoU阈值会增加提取特征的检测数量。然而,可能的检测候选同时增加,这加强了缺失检测和每个轨迹的多个检测的负面影响(见3.3)。另一方面,随着IoU阈值的增加,一些具有显著重叠的其他轨迹将被忽略。这些情况将在4.3中进一步解释。

考虑到FDOS在MOT17-Val上,我们检查了MOT17-Val中HOTA分数下降的原因,并在2中获得了结果。两个序列,即MOT17-02和MOT17-10,是这种下降的主要原因。两个序列中只有一个轨迹负责这种下降。因此,目前我们正在忽略这种下降。

还观察到ARS阈值处理对FDOS没有贡献,而对FSS有益。原因在于原始方法的匹配策略。由于StrongSORT在匹配的第一阶段仅匹配特征并忽略IoU,因此根据边界框的形状进行阈值处理至关重要。另一方面,Deep-OC-SORT在匹配阶段同时使用IoU和特征距离。考虑到形状不同的边界框也具有较少的重叠,Deep-OC-SORT在其匹配阶段隐式地进行了这种阈值处理。最后,无论如何进行ARS阈值处理都不会产生负面影响,但可能在任何情况下都具有积极效果。

总之,毫无疑问,保持ARS阈值处理和特征衰减是有益的。因此,我们将在以下实验中包含它们。在我们的分析中,符号FSS和FDOS后面跟着 θ I o U \theta_{I o U} θIoU将表示启用ARS和特征衰减的Fast-StrongSORT和Fast-Deep-OC-SORT,其中 θ I o U \theta_{I o U} θIoU值是IoU阈值。

4.3. ARS阈值处理的效果

如3.3节所述,轨迹成为多个检测的候选是基本机制引入的问题。在这种情况下,检测特征将与多个轨迹具有0余弦距离,这可能导致错误的匹配结果。此外,即使匹配没有被破坏,一些轨迹的特征也会因为错误的检测而被更新,这可能会产生长期的负面影响。图5的第一行就是一个例子,编号为4的检测左上角出现了一个小的检测,轨迹4成为了两个检测的候选。由于新出现的小检测与轨迹4的纵横比相似性小于阈值,因此避免了这种候选关系。另一个问题是对缺失检测的敏感性。图5的第二行就是这样一个例子的说明。这里,有两个人坐在河岸上。由于其中一个人被遮挡,因此没有获得其检测。当他站起来时,前面的人的检测恰好没有被接收到。因此,前面的人的ID和特征被复制到了后面的人身上,而轨迹中的人则必须被赋予一个新的ID。

4.4. 特征衰减的效果

图7显示了FSS 0.2带ARS的两个示例输出,一个带有特征衰减,一个没有。ID为17的人在387帧进入场景。他在387-388-389帧中提取了特征。在389和477之间,他的检测是非风险的,特征无法更新。在477和493之间,检测总是要么有风险要么缺失,这意味着对于两种情况,提取决策和EMA的alphas都是相同的。从这个场景中可以清楚地看到特征衰减的效果。在第一种情况下,保留了389帧的特征,它们在477帧的更新中被赋予了很高的权重。在477和493之间的遮挡期之后,特征向量的主要贡献来自389帧。如1中所讨论的,特征匹配比IoU匹配的优势之一是它对长期遮挡的鲁棒性。因此,直观地匹配遮挡期之前的特征和遮挡期之后的特征,这是特征衰减的目标。

4.5. 运行时分析

图4中的条形图和表1显示了不同IoU阈值下的FPS和HOTA变化以及花费在不同阶段的时间份额。如第1节所述,特征提取负责大部分时间开销。我们的机制确实减少了特征提取阶段的总时间,并如预期地增加了FPS。0.2的IoU阈值似乎是增加HOTA分数的最高阈值,并且在MOT17-Val上增加了80%的FPS,在DanceTrack-Val上增加了52%。此外,考虑到HOTA下降0.98%,即速度提高三倍,MOT17-Val上的FPS可以增加234%。

除了特征提取之外的其他阶段花费的时间相对较少,并且没有受到我们机制的显著影响。从这一点上,可以推断出运行时间的改进可以表示为提取特征的检测的百分比。有了这个新标准,评估可以独立于工作环境和实现细节进行。这个指标被称为PDE。

图6和表3展示了对于FDOS(Fast-Deep-OC-SORT),不同IoU阈值下HOTA分数与PDE(部分检测误差)之间的相关性。Deep-OC-SORT通过保留相同的卡尔曼滤波器并加入特征提取和相机运动补偿来扩展OC-SORT。唯一的区别在于在成本矩阵中增加了一个嵌入成本。因此,将FDOS与OC-SORT进行比较,是评估在保持特征匹配优势的同时,IoU阈值可以扩展到什么程度的一种可接受方式。从图6可以看出,有可能将IoU阈值提高到0.3,这相当于从不牺牲DanceTrack Val数据集上任何准确性的情况下,从24%的检测中提取特征。此外,即使仅从6.84%的检测中提取特征,与OC-SORT相比,HOTA分数仍然提高了2分。在MOT17-val数据集上,唯一比原始方法结果更好的阈值是0.0,这减少了25.76%的特征提取量,而决定为最佳配置的0.2阈值却降低了准确性。这一降低将在4.2节中详细检查。

4.6. 测试结果

测试数据集上的结果如表4所示。在DanceTrack数据集上,FSS 0.2的性能超过了StrongSORT。在MOT20和MOT17数据集上,我们尽可能减少了特征提取的数量,同时HOTA分数略有下降。总体而言,结果验证了我们在验证数据集上的实验,并展示了所提出机制在检测仅需要特征提取的情况方面的强大能力。

5. 结论

特征提取是多目标跟踪(MOT)方法中的主要开销来源,但同时也是其不可或缺的一部分。在本文中,我们提出了一种机制,用于选择需要即时匹配外观特征的检测,并仅从这些检测中提取特征。我们观察到,在保持MOT17和DanceTrack数据集精度不变的情况下,可以分别将帧率(FPS)提高80%和52%。除了运行时间的改进外,我们的机制在某些情况下还通过避免特征匹配阶段的混淆来提高了准确性。对于进一步改进多目标跟踪(MOT)而言,“何时真正需要使用外观特征”这一问题至关重要。


http://www.ppmy.cn/ops/115449.html

相关文章

【C++】C++中如何处理多返回值

十四、C中如何处理多返回值 本部分也是碎碎念,因为这些点都是很小的点,构不成一篇文章,所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道,当你写一个函数的返回时,那是你想返回…

Redis数据结构之哈希表

这里的哈希表说的是value的类型是哈希表 一.相关命令 1.hset key field value 一次可以设置多个 返回值是设置成功的个数 注意,哈希表中的键值对,键是唯一的而值可以重复 所以有下面的结果: key中原来已经有了f1,所以再使用hse…

J Transl Med结肠癌分子分型+简单实验

目录 技术路线 实验设计(药物敏感性) 亮点 方法 从 TCGA 和 GEO 数据库下载大量和单细胞 RNA 测序以及 CRC 的临床数据。HRGs 和 LMRGs 来自分子特征数据库。使用 R 软件包 DESeq2 进行差异表达分析。使用无监督聚类进行分子亚型。使用单变量 Cox 回…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现?怎么使用Laravel发信? Laravel作为一款流行的PHP框架,提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程,帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…

【MySQL】表的操作

目录 一、增加表 二、查看表 2.1 查看当前数据库中的表 2.2 查看指定表的结构 2.3 查看创建表时的详细信息 2.4 查看表中所有数据 三、修改表 3.1 修改表名 3.2 插入数据 3.3 添加列 3.4 修改列类型 3.5 删除列 3.6 修改列名 四、删除表 一、增加表 增加表的语法…

sqli-lab靶场学习(四)——Less11-14(post方法)

前言 第1-10关都是get方法,本关开始进入post方法。其实post也好get也好,本质都差不多,使用的技巧也基本相同。 Less11 第11关打开是一个输入用户名密码的界面 显然登陆对话框会使用post方式提交,这里我们尝试在Username一栏通过…

Android轻量级RTSP服务使用场景分析和设计探讨

技术背景 好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景&#…

Redis - 深入理解Redis事务

目录 Redis是如何实现事务的?事务中执行的命令出现错误,会回滚事务吗?同一个连接可以重复开启事务吗?多个客户端同时开启事务会怎样?使用Redis事务只用MULTI和EXEC吗?Redis中的WATCH机制是怎么实现的&#…