首例开源的自动驾驶混合运动规划框架,手握“规划可解释”和“决策准确”两张王牌!
导读:
本文开发了一种新的混合运动规划方法,将环境和预测信息集成在Frenet坐标系中,提升了运动规划能力。本文将传统运动规划算法的可预测性和稳定性与RL的动态适应性相结合,从而形成了一个能够有效管理复杂情况并适应不断变化的环境条件的系统。©️【深蓝AI】编译

1. 摘要
本文介绍了一种自主运动规划的新方法,即在Frenet坐标系中使用强化学习(RL)代理来指导分析算法。这种组合直接解决了自动驾驶中的适应性和安全性问题。运动规划算法对于驾驭动态和复杂场景至关重要,然而,传统方法缺乏不可预测环境所需的灵活性,而机器学习技术,尤其是强化学习(RL),虽然具有适应性,但却存在不稳定和缺乏可解释性的问题。作者独特的解决方案将传统运动规划算法的可预测性和稳定性与RL的动态适应性相结合,从而形成了一个能够有效管理复杂情况并适应不断变化的环境条件的系统。

2. 引言
正如各种碰撞报告所记录的那样,自动驾驶技术在现实世界中的实施拥有极大挑战。这些挑战包括在复杂的城市环境中导航、管理不可预测的交通和行人行为以及在新环境中做出明智的决策。这种不可预测性要求运动规划领域采用高度复杂且适应性强的算法。
传统的分析规划方法通常不足以处理现实世界场景的动态性质,这强调了自动驾驶系统对增强决策能力和强大适应性以确保安全和效率的迫切需求。此外,分析基于规则的模型需要调整参数,这涉及识别和调整适合特定场景的各种设置和参数,这些调整通常是通过专家知识和数值评估技术进行的。值得注意的是,即使是微小的参数变化也会明显影响系统的行为。调整整个系统既低效又昂贵,在处理多种配置和变体时,这一点变得更加明显。
当代机器学习方法,尤其是强化学习,在复杂场景中有望实现出色的性能。然而,学习过程的有效性取决于所使用的特定环境和训练配置。尤其是在自动驾驶中,用于运动规划的机器学习模型成功率较低,或者只能在高速公路驾驶等特定环境和场景中取得成功。此外,复杂场景需要较长的训练时间,并且Sim2Real可能会出现失真问题。此外,这些代理的决策过程通常缺乏固有的透明度,需要在验证和实施安全措施方面付出相当大的努力,以确保其行动的可靠性和可信度。应对这些挑战至关重要,尤其是在安全性和可靠性至关重要的自动驾驶领域。
相比之下,结合分析和机器学习模型的混合方法有望在这两个领域都发挥优势。基于此,作者提出了一种使用两阶段代理进行运动规划的新方法,如图1所示。在这种方法中,分析模型的基础稳健性与机器学习算法的动态学习能力相结合,提高了驾驶行为环境中的性能和适应性。这种混合方法有效地弥补了理论构造与实际应用之间的差距,特别是在具有复杂、非线性数据模式的环境中。特别注意,这些混合模型通常需要较少的数据进行有效训练,在数据匮乏的情况下具有优势。另外,可以将安全方法和附加功能有效地集成到分析规划算法中。

3. 相关工作
多年来,自动驾驶运动规划一直是研究的热门领域。目前,已有多种方法被开发用于解决自动驾驶的规划任务。规划方法大体可分为以下几类:
- 基于图的算法通过节点和边的网络来寻找结构化路径;
- 基于采样的方法通过生成大量可能性来探索各种轨迹;
- 基于优化的规划方法则通过系统地评估各种约束和目标来找到最有效的轨迹,其通常使用线性规划、动态规划或基于梯度的优化等技术。
此外,利用人工智能的算法被开发出来用于在动态环境中提供高适应性。自动驾驶研究领域中已有几种机器学习模型可以学习控制方向盘和加速度,这些模型几乎完全使用特定场景进行训练,例如高速公路驾驶或决策代理。虽然这些模型体现出性能的改进,例如类似场景决策的准确性和决策制定的实时性都得到改进,但在更复杂的场景的成功率太低,特别是对于现实世界的应用。还通过逆强化学习研究了学习类似人类的行为。可以学习和采用某些特征的驾驶行为。然而,这并不能从根本上提高自动驾驶复杂场景行为规划成功率。
相关研究探讨了迭代学习和人类反馈如何改善自主机器人在复杂环境中的导航。通过将这些元素集成到传统导航系统中,该研究展示了潜在的性能改进,同时保持了系统的安全性和可解释性,这项研究为开发机器人自适应导航系统提供了一个值得注意的视角。结果虽然很有希望,但主要作为概念验证,它们没有纳入复杂的公共道路环境,也没有考虑到其他道路使用者的预测不确定性。此外,该方法没有集成复杂的分析规划算法;相反,它依靠机器学习来吸收基于专家知识的参数设置。
也有人提出了一种将RL与快速探索随机树相结合的自动驾驶汽车运动规划框架。它专注于有效控制车速和确保安全,使用深度学习技术适应不同的交通状况。该方法的主要问题是其在高维状态空间中的收敛速度慢,这损害了其实时适用性。此外,该方法仅适用于某些场景,限制了其通用性。其他研究采用 RL 通过分析模型确定执行动作的最佳切换点。这种方法适用于诸如定时车道变换和促进不同道路使用者之间的互动行为等场景。当前的研究表明,在探索一种将机器学习与强大的轨迹规划分析算法相结合的混合方法方面存在差距,这种方法可以确保高成功率、实时能力、可解释性和附加安全功能的集成。可以使用这种独立于监督学习数据集的概念来研究其优缺点。

4. 方法
本节介绍了基于分析采样的轨迹规划器架构与RL设计的结合,以开发混合运动规划方法。
4.1 基于采样的运动规划器
本文所用的分析轨迹规划算法是基于Frenet坐标系中采样方法,作者使用神经网络的算法来预测场景中的其他车辆。该算法在一个时间步内的流程如图2所示。该流程可归纳为以下主要阶段:
• 车辆状态更新: 车辆使用自我、预测和环境信息更新与Frenet坐标系有关的所有状态。
• 轨迹采样: 该算法根据采样矩阵对可能的轨迹进行采样。作者使用时间、速度和横向采样指标来创建取决于当前自我车辆状态的不同轨迹方案。
• 轨迹运动学检查: 根据单轨模型和车辆参数检查生成的轨迹的运动学可行性。
• 轨迹成本计算: 作者使用不同的成本指标(如碰撞概率、加速度、到参考路径的距离和速度偏移成本)来区分不同轨迹的性能。作者将碰撞概率成本与来自预测信息的其他障碍物相结合。轨迹生成采用C++实现,以减少计算时间并加速训练过程。
• 轨迹碰撞检查: 分析成本最低的轨迹是否可能与车道边界和其他障碍物发生碰撞。此步骤在成本计算步骤之后进行,以提高计算效率。
按绝对成本排序的第一个无碰撞轨迹是更新当前车辆状态的最佳轨迹。根据为每个连续时间步计算的最佳轨迹更新车辆的状态。轨迹涵盖3秒的范围。模拟的时间步离散化为0.1秒。

4.2 强化学习过程
在本节中,作者将集成一个RL算法,该算法优化了后续提出的基于采样的轨迹规划器的轨迹选择过程。对于定制环境和训练过程,作者使用gymnasium4和stable-baselines35。对于代理的模拟环境,作者使用CommonRoad。优化由近端策略优化(PPO)执行,这是一种通过剪辑策略更新来平衡探索和利用的RL算法。它避免了可能导致性能下降的大型策略更新,从而使训练更加稳定和可靠。PPO算法的核心封装在等式中:
L C L I P ( θ ) = E ^ t [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{CLIP}(\theta) = \hat{\mathbb{E}}_t [ \min(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t)] LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
该方程表示截断的替代目标函数,这对于PPO算法的效率和稳定性至关重要。这里, θ \theta θ表示策略参数, E ^ t \hat{\mathbb{E}}_t E^t是时间步长上的经验期望, r t ( θ ) r_t(\theta) rt(θ)表示新策略与旧策略下的概率比, A ^ t \hat{A}_t A^t表示时间 t t t时的估计优势, ϵ \epsilon ϵ是控制目标函数中截断的关键超参数。作者使用MlpLstmPolicy的循环PPO优化来处理时间关系和信息。传统的PPO架构通过长短期记忆(LSTM)网络进行扩展,这是一种适用于动态时间序列数据的循环神经网络。这种方法在顺序数据和部分可观察环境中非常有效。LSTM组件可以表示如下:
• LSTM状态更新: 在每个时间步 t t t,LSTM根据当前输入 x t x_t xt、先前的隐藏状态 h t − 1 h_{t-1} ht−1和先前的单元状态 c t − 1 c_{t-1} ct−1更新其隐藏状态 h t − 1 h_{t-1} ht−1和单元状态 c t c_t ct,表示为: ( h t , c t ) = L S T M ( x t , h t − 1 , c t − 1 ) (h_t,c_t)=LSTM(x_t,h_{t-1},c_{t-1}) (ht,ct)=LSTM(xt,ht−1,ct−1)。
• 策略和价值函数: 更新后的隐藏状态 h t h_t ht随后被策略网络 π ( a t ∣ s t , h t ) \pi(a_t|s_t,h_t) π(at∣st,ht)和价值网络 V ( s t , h t ) V(s_t, h_t) V(st,ht)使用,其中 a t a_t at是动作, s t s_t st是时间 t t t的状态。这种集成使网络能够记住过去的状态,从而增强复杂环境中的决策能力。

为了启动优化过程,首先需要设计几个关键组件:观察空间、终止标准、奖励系统的结构以及代理行动空间的定义。图3显示了类图,概述了训练过程中不可或缺的功能。
观测空间: 观测空间分为表1中的类别和观测值。
类别可以分为各种类型: 源自自我车辆的类别、与实现目标区域相关的类别、周围信息、轨迹细节以及与采样轨迹相关的成本信息。与其他仅假设直接车辆控制的系统不同,作者的方法提供了增强观察空间的补充数据。轨迹规划算法的数百条采样轨迹通过图2中的计算步骤包含附加信息。这些数据的关键要素包括运动学上可行的轨迹数量、每条轨迹的相关风险水平及其各自的成本分布。此外,作者使用图4中所示的概念来解决碰撞概率感知问题。
示意图显示了采样的轨迹: 作者可以通过采用时间、速度和横向相关采样来构建网格。该网格使作者能够分析与最外层轨迹相关的碰撞概率成本的变化,从而丰富了观察空间。这种方法可以映射随时间变化的差异和相关性。在图中,正横向d方向的轨迹比负d方向的轨迹具有更高的碰撞概率成本。
动作空间: 图1显示了分析轨迹规划器和RL代理之间的连接。代理学习动作,即轨迹规划器的成本权重。理论上,任何调整都可以传递给轨迹规划器。在作者的案例中,作者研究成本权重的调整来证明这一概念。为了实现和谐的行为,代理可以减少或增加轨迹规划器的当前成本权重。等式(2)显示了代理在时间步 t t t中关于每个成本项 i i i的动作空间。
ω i t = ω i min ≤ ω i p r e v + ω i a c t i o n ≤ ω i max \omega_{i}^{t} = \omega_{i}^{\text{min}} \leq \omega_{i}^{prev} + \omega_{i}^{action} \leq \omega_{i}^{\text{max}} ωit=ωimin≤ωiprev+ωiaction≤ωimax
考虑 ω i action \omega_{i}^{\text{action}} ωiaction,它是 [ a min , a max ] [a_{\text{min}}, a_{\text{max}}] [amin,amax]范围内的浮点值。这里, ω i min \omega_{i}^{\text{min}} ωimin和 ω i max \omega_{i}^{\text{max}} ωimax分别表示绝对成本项的预定义最小值和最大值。此外, ω i p r e v \omega_{i}^{prev} ωiprev表示来自前一个时间步的权重,而 ω i a c t i o n \omega_{i}^{action} ωiaction表示算法的当前动作。值得注意的是,每次执行后,成本项都会重置为其默认值。

奖励设计: 训练过程需要奖励配置,这对成功和驾驶行为至关重要。作者在学习过程中使用的奖励如表 II 所示,作者使用混合奖励系统来提高训练效率,包括终止奖励和稀疏奖励。
终止奖励对于成功完成场景至关重要,而稀疏奖励则指导车辆行为。主要目标是尽量减少碰撞,尤其是受终止奖励影响的碰撞。此外,还需要稀疏奖励来优化驾驶性能和行为,例如满足舒适度指标或最大限度地降低整体驾驶风险。车辆可以通过六种不同的方式完成场景。每个场景都有一个不同的时间范围,这样的时间范围就是一个匹配可实现目标的窗口。这允许比分配的时间间隔更快或更慢地达到目标,具体取决于车辆的性能。场景可能会因与障碍物或道路边界相撞而结束,或者如果车辆在任何时间步都找不到有效的轨迹。此外,如果车辆未达到目标就停下来,场景将在超过特定时间限制后自动终止。最佳性能包括严格遵守参考路径、保持指定速度、最大限度地接近目标距离以及最大限度地降低风险。作者正在整合成本调节项,以增强车辆动作的稳定性。这一增加旨在防止动作过度波动,促进更平稳、更和谐的驾驶行为。作者使用当前动作与轨迹规划器的默认成本设置之间的绝对差。

5. 实验分析
本节展示模型的训练、选定的测试场景和结果。作者定性和定量地探索了该模型,将研究独立默认分析轨迹规划器(DP)和建议的混合规划器(HP)之间的差异。

5.1 实验环境和参数设置
作者使用T型路口场景(见图6)进行训练,因为它们与其他车辆表现出复杂且关键的交互动态。数据集中的各种场景提供了一定程度的可变性,以降低过度拟合的风险。对于模型的训练和执行,计算资源包括AMD 7950x处理器、NVIDIA GeForce RTX 4090显卡和128GB RAM。作者研究中使用的超参数如表III所示。
训练与核心数并行,大约需要24小时才能完成700万个时间步。数据分为训练集(75%)、验证集(15%)和测试集(10%)。根据一系列评估场景中的奖励函数选择最佳模型。训练在2-3百万个训练步骤后收敛,具体取决于设置。作者使用超参数调整,因为训练结果高度依赖于它。

5.2 风险感知轨迹规划
首先,作者研究学习到的代理的风险行为,并为此设置奖励(见表II)以优化代理的行为。除了成功率之外,自动驾驶中的风险也是评估算法安全性的决定性因素。随后,风险通过将轨迹 T \mathcal{T} T的最大碰撞概率 p p p乘以造成的伤害 H H H来计算。
R ( T ) = m a x ( p ( T ) H ( T ) ) R(\mathcal{T}) = \mathrm{max}(p(\mathcal{T})H(\mathcal{T})) R(T)=max(p(T)H(T))
作者的评估涵盖了64种不同的场景来评估风险水平。通过计算所有场景的平均风险,作者获得了对整体安全状况的宝贵见解。值得注意的是,结果表明,自车和第三方道路使用者的风险降低,凸显了道路安全性的提高。图5显示了场景中的自车风险和第三方风险。蓝色表示HP,橙色表示DP。与DP相比,HP仅显示自车风险的33%左右。

代理降低风险的奖励对轨迹的选择过程具有可持续的影响。作者的分析表明,尽管目标变量众多,但车辆可以改变其行为。强调在此框架内仔细选择奖励条款的重要性至关重要。通过奖励机制过于激进地追求降低风险可能会导致车辆在某些情况下选择完全停止的情况。为了缓解这种情况,作者加入了一个特定的奖励条款,如表II所示,以确保遵守指定的目标速度,从而以可控的方式平衡安全性和运营效率。风险是根据所选轨迹计算的,取决于规划范围。DP在短时间内接受明显更高的风险,并且仅在识别出风险后才对降低做出反应。另一方面,此处介绍的模型通过环境和障碍物信息在风险发生之前识别风险情况。风险在绝对值和持续时间方面都显着降低。通过提前减速,还可以确定风险峰值的发生时间与DP的风险峰值有延迟。
5.3 适应代理的驾驶行为
HP使得在运行时调整分析轨迹规划算法的驾驶行为成为可能。在下面的分析中,作者展示了所提出的模型和独立分析轨迹规划器在驾驶行为上的差异。图6分别以蓝色和橙色显示了相同场景中HP与DP的比较。

从定性上讲,可以确定迎面驶来的车辆对驾驶行为的强烈适应性。根据时间戳点显示自车的中心位置。如蓝色轨迹所示,作者的方法证明了对指定参考路径的遵守有所改善,并辅以更早的制动启动。相比之下,DP行驶时偏离参考路径较大,但很快接近迎面驶来的车辆。
这种加速接近导致车辆在第74个时间步意外违反安全限制,从而导致与迎面驶来的车辆相撞。可以通过仔细更改DP的手动设置参数来完成该场景。然而,结果表明作者的HP可以避免手动调整参数。图7显示了DP和HP的速度以及HP代理在同一场景中调整规划器碰撞概率权重的操作。与DP相比,HP的速度明显降低,因此在这种情况下不会发生碰撞。这是通过代理的动作连续增加碰撞概率成本项的权重来实现的。RL模型甚至可以部分补偿成本函数中的概念错误,这可以从DP在这种情况下的强烈加速度中得出。
图8显示了场景中主动自我风险的降低。可以看出,在作者的模型中,风险总额明显较低。理论上计算的风险不一定反映碰撞的发生。然而,模型可以避免碰撞,并将计算出的潜在危害风险最小化。对物体的错误预测会导致导致DP碰撞的行为。结果表明,这些可以通过模型进行补偿。

5.4 场景性能评估
作者在DP中应用了不同的碰撞概率成本参数,以确保参数化的准确性。将结果与HP进行比较,如图9所示。可以看出,DP的成功率很高,但在每种配置中都会发生碰撞。适当设置碰撞概率成本对于平衡算法至关重要。成本设置得太低可能会导致过于激进的驾驶而发生碰撞。相反,过高的成本可能会因过于谨慎的行为而导致追尾碰撞。DP缺乏足够的灵活性,需要更多功能才能获得最佳性能。经过训练的HP表现非常出色,即使在以前未见过的测试场景中也没有观察到碰撞。可以从表IV中获得驾驶行为的差异。HP在与参考路径的最大允许偏差方面表现出色。此外,降低了最大和平均速度以改善T型路口场景的转弯机动。此外,与HP中的最佳轨迹相关的成本显示出更大的偏差。由于应用了可变权重,这种偏差的增加是可行的,为轨迹优化提供了更细致入微的方法。

5.5 执行时间评估
图10以箱线图形式说明了RL框架内三个关键组件每次迭代的执行时间(以秒为单位):RL模型预测执行、DP的采样步骤和整体模型执行。
计算时间基于十种不同的场景确定,代理预测执行的平均时间约为0.44毫秒。此步骤仅包括神经网络的执行,而不包括环境模型的更新。每个时间步长大约包含800条轨迹的生成、有效性检查和成本计算平均需要大约15.8毫秒。增加分析规划步骤中的轨迹数量对计算时间影响不大,因为由于C++包扩展,并行化过程是稳定的。运行整个模型每次迭代平均需要大约46毫秒的执行时间。
5.6 结果讨论
结果表明,混合方法是有效的,并且可以显著改善分析模型,同时缩短执行时间。与其他纯RL模型相比,该模型的训练过程很快,成功率很高。通用性显著提高。虽然纯分析模型在某些情况下表现相对较好,但性能可能因情况而异。此外,通过正确的设置,所提出的模型可以补偿其他模型(例如预测算法)的误差。然而,对算法的重大修改需要对代理模型进行部分重新训练。该方法的设计也可以进行调整和增强。因此,方程(2)中的极限经常被利用,这表明该模型可以得到改进。此外,必须仔细考虑奖励值和场景的选择,这可能很耗时。总体而言,作者的概念展示了混合规划器提供的协同作用的有效利用,并通过更高的复杂性和在边缘场景中的适用性扩展了当前可用的方法。
7. 总结展望
本文介绍了一种用于轨迹规划的混合运动规划器方法,以在变化的条件下增强车辆驾驶行为。针对传统分析轨迹规划器的低通用性,作者的方法将基于采样的规划器与RL代理相结合。该代理动态调整分析算法中的成本权重,提高其适应性。作者的方法利用观察空间,包括环境、语义地图和障碍物数据,这些数据对于混合代理学习车辆动力学至关重要。结果表明,代理的成功率显著提高,风险降低,同时保持了现实世界应用的高性能执行时间。且通过更广泛的调查,附加功能可以改善驾驶行为和模型性能。未来的工作可以使用RL优化分析规划器的采样参数,从而研究该算法在现实世界中的适用性。通过图形表示等方式纳入更全面的环境数据,可以进一步提高系统的稳定性和效率。
©️【深蓝AI】
Ref:
A Reinforcement Learning-Boosted Motion Planning Framework: Comprehensive Generalization Performance in Autonomous Driving
编译|匡吉
审核|Los
本文首发于微信公众号【深蓝AI】,移步公众号【深蓝AI】,第一时间获取自动驾驶、人工智能与机器人行业最新最前沿论文和科技动态👇
深蓝AI·赋能自动驾驶+机器人+AI
相关文章:
首例开源的自动驾驶混合运动规划框架,手握“规划可解释”和“决策准确”两张王牌!
导读: 本文开发了一种新的混合运动规划方法,将环境和预测信息集成在Frenet坐标系中,提升了运动规划能力。本文将传统运动规划算法的可预测性和稳定性与RL的动态适应性相结合,从而形成了一个能够有效管理复杂情况并适应不断变化的环…...
数据结构之红黑树的 “奥秘“
目录: 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何 一条从根…...
【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/cheinlu/groundhog-charging-syst…...
大模型RAG实战|构建知识库:文档和网页的加载、转换、索引与存储
我们要开发一个生产级的系统,还需要对LlamaIndex的各个组件和技术进行深度的理解、运用和调优。本系列将会聚焦在如何让系统实用上,包括:知识库的管理,检索和查询效果的提升,使用本地化部署的模型等主题。我将会讲解相…...
江协科技stm32————11-5 硬件SPI读写W25Q64
一、开启时钟,开启SPI和GPIO的时钟 二、初始化GPIO口,其中SCK和MOSI是由硬件外设控制的输出信号,配置为复用推挽输出 MISO是硬件外设的输入信号,配置为上拉输入,SS是软件控制的输出信号,配置为通用推挽输出…...
网络编程day04(UDP、Linux IO 模型)
目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO:最常见、效率低、不耗费CPU 2》 非阻塞 IO:轮询、耗费CPU,可以处…...
【android10】【binder】【2.servicemanager启动——全源码分析】
系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …...
Java实现简易计算器功能(idea)
目的:写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。 思路: (1)写4个方法:加减乘除 (2)利用循环switch进行用户交互 &…...
Parsec问题解决方案
Parsec目前就是被墙了,有解决方案但治标不治本,如果想稳定串流建议是更换稳定的串流软件,以下是一些解决方案 方案一:在%appdata%/Parsec/config.txt中,添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…...
Swift 创建扩展(Extension)
类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…...
九月五日(k8s配置)
一、安装环境 环境准备:(有阿里云) k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts …...
某极验4.0 -消消乐验证
⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly93d3cyLmdlZXRlc3QuY29tL2FkYXB0aXZlLWNhcHRjaGE 1. 浅聊一下 验证码样式 验证成功 - …...
洛谷 P10798 「CZOI-R1」消除威胁
题目来源于:洛谷 题目本质:贪心,st表,单调栈 解题思路:由于昨天联练习了平衡树,我就用平衡树STL打了个暴力,超时得了30分 这是暴力代码: #include<bits/stdc.h> using name…...
Pow(x, n)
题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2: 输入:x 2.10000, n 3 输出:9.26100示…...
一文带你学会使用滑动窗口
🔥个人主页:guoguoqiang. 🔥专栏:leetcode刷题 209.长度最小的子数组 求最短长度之和等于目标值。 方法一: 暴力枚举(会超时) 从头开始遍历直到之和等于target然后更新结果。这…...
如何从0到1本地搭建whisper语音识别模型
文章目录 环境准备1. 系统要求2. 安装依赖项1:安装 Python 和虚拟环境2:安装 Whisper3:下载 Whisper 模型4:进行语音识别5:提高效率和精度6:开发和集成Whisper 是 OpenAI 发布的一个强大的语音识别模型,它可以将语音转换为文本,支持多语言输入,并且可以处理各种音频类…...
PyTorch 创建数据集
图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件,文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步,首先创建数据类对象 此时可以想象为单个数据单元的…...
[Java]SpringBoot登录认证流程详解
登录认证 登录接口 1.查看原型 2.查看接口 3.思路分析 登录核心就是根据用户名和密码查询用户信息,存在则登录成功, 不存在则登录失败 4.Controller Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;/*** 登录的方法** param …...
【Day08】
目录 MySQL-多表查询-概述 MySQL-多表查询-内连接 MySQL-多表查询-外连接 MySQL-多表查询-[标量、列]子查询 MySQL-多表查询-[行、表]子查询 MySQL-多表查询-案例 MySQL-事务-介绍与操作 MySQL-事务-四大特性 MySQL-索引-介绍 MySQL-索引-结构 MySQL-索引-操作语法 …...
mongodb在Java中条件分组聚合查询并且分页(时间戳,按日期分组,年月日...)
废话不多说,先看效果图: SQL查询结果示例: 多种查询结果示例: 原SQL: db.getCollection("hbdd_order").aggregate([{// 把时间戳格式化$addFields: {orderDate: {"$dateToString": {"for…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
