当前位置: 首页 > news >正文

【youcans 的 OpenCV 学习课】22. Haar 级联分类器

专栏地址:『youcans 的图像处理学习课』
文章目录:『youcans 的图像处理学习课 - 总目录』


【youcans 的 OpenCV 学习课】22. Haar 级联分类器

    • 3. Haar 特征及其加速计算
      • 3.1 Haar 特征
      • 3.2 Haar 特征值的计算
      • 3.3 积分图像
      • 3.4 基于积分图像加速计算 Haar 特征值
    • 4. Haar 特征级联分类器
      • 4.1 Adaboost 算法
      • 4.2 级联分类器
      • 4.3 Haar 级联分类器


3. Haar 特征及其加速计算

Haar 特征分类器是基于 Haar-like 特征提取的监督学习分类器。我们首先讨论 Haar 特征及其加速计算。

3.1 Haar 特征

Haar 特征用黑白两种矩形框组合成特征模板,在特征模板内用黑色矩形像素和减去白色矩形像素和来表示这个模版的特征值。

矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。

Haar 特征分为三类:边缘特征、线性特征、中心特征和对角线特征。Haar 特征因为类似于 Haar 小波而得名,Haar-like 特征提取过程可以看作是对图像局部进行 Haar 小波变换。

Lienhart R.等对 Haar-like 矩形特征库作了进一步扩展,加入了旋转 45度的对角线特征、中心环绕特征。扩展后的 Haar-like 特征大致分为 4 种类型:边缘特征、线性特征、中心环绕特征和对角线特征。

在这里插入图片描述

Haar 特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。


3.2 Haar 特征值的计算

特征模板在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。

f = w w h i t e ∗ ∑ p i ∈ w h i t e p i − w b l a c k ∗ ∑ p i ∈ b l a c k p i f = w_{white}*\sum_{p_i \in white}{p_i} - w_{black}*\sum_{p_i \in black}{p_i} f=wwhitepiwhitepiwblackpiblackpi

其中,w 是权重,用于调节黑白区域面积平衡。当特征模板中黑白区域面积相等时 w=1,则特征值的计算简化为:

f = ∑ 白色区域像素值 − ∑ 黑色区域像素值 f = \sum{白色区域像素值} - \sum{黑色区域像素值} f=白色区域像素值黑色区域像素值

矩形特征值是矩形位置、矩形大小和模板类型这三个变量的函数。

  • 矩形位置:矩形模板框滑动遍历图像的每个位置,类似于卷积核;
  • 矩形大小:矩形大小可以根据需要来定义。
  • 模板类型:包括垂直、水平、对角等不同类型。

通过改变类别、大小和位置,就可以使很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。随着图像尺寸的扩大, 特征总量近似指数增长 ,这对于特征值的计算带来了很大的挑战。

积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。


3.3 积分图像

Crow 提出的积分图像是一种快速计算图像矩形区域和的算法。积分图像是指对于图像中的每一个像素,取其左上侧区域的全部像素的累加值作为该像素的像素值。积分图相当于建立了二维查找表,极大地降低了计算量、提高了计算速度。

利用积分图像,使用 3次加减法就可以计算出图像中任意矩形区域内像素值的和,由此可以快速实现图像的均值滤波。

L ( x , y ) = ∑ i ≤ x ∑ j ≤ y I ( x , y ) s u m a b c d = L a − L b − L c + L d L(x,y) = \sum_{i \le x} \sum_{j \le y} I(x,y) \\ sum_{abcd} = L_a - L_b - L_c + L_d L(x,y)=ixjyI(x,y)sumabcd=LaLbLc+Ld

式中,L 表示积分图像的像素值,I 表示输入图像的像素值,abcd表示矩形 S 的顶点。

在这里插入图片描述

通过积分图像可以快速地计算出图像中任意矩形区域内像素值的和、均值和均方差,计算复杂度仅为O(1),这对于像素的邻域处理非常有效。

OpenCV 提供了函数 cv.integral 计算积分图像。

函数说明:

cv.integral(src[, sum=None, sdepth=-1]) → sum
cv.integral2(src[, sum=None, sqsum=None, sdepth=-1, sqdepth=-1]) → sum, sqsum
cv.integral3(src[, sum=None, sqsum=None, tilted=None, sdepth=-1, sqdepth=-1]) → sum, sqsum, titled

函数 cv.integral 计算像素值的积分图像,函数 cv.integral2 计算像素值的积分图像和像素值的平方积分图像,函数 cv.integral3 计算旋转 45度的像素值的积分图像。

s u m ( X , Y ) = ∑ x < X , y < y i m a g e ( x , y ) s q s u m ( X , Y ) = ∑ x < X , y < y i m a g e ( x , y ) 2 t i t l e d ( X , Y ) = ∑ y < y , a b s ( x − X + 1 ) ≤ Y − y − 1 i m a g e ( x , y ) sum(X,Y) = \sum_{x<X,y<y} image(x,y) \\ sqsum(X,Y) = \sum_{x<X,y<y} image(x,y)^2 \\ titled(X,Y) = \sum_{y<y,abs(x-X+1) \le Y-y-1} image(x,y) \\ sum(X,Y)=x<X,y<yimage(x,y)sqsum(X,Y)=x<X,y<yimage(x,y)2titled(X,Y)=y<y,abs(xX+1)Yy1image(x,y)

参数说明:

  • scr:输入图像,形状 (H,W) 的 Numpy 数组,8位整型或浮点类型
  • sum:积分图像,形状 (H+1,W+1) 的 Numpy 数组,32位整型或浮点类型
  • sqsum:平方积分图像,形状 (H+1,W+1) 的 Numpy 数组,双精度浮点类型
  • titled:旋转 45度的像素值积分图像,形状 (H+1,W+1) 的 Numpy 数组,类型与 sum 相同
  • sdepth:积分图像和旋转积分图像的深度,CV_32S/CV_32F/CV64F,可选项,默认值 -1
  • sqdepth:平方积分图像的深度,CV_32F/CV64F,可选项,默认值 -1

注意事项:

  1. 允许单通道输入;对于多通道图像,独立地处理各通道的数据。
  2. 可以用可变窗口大小进行快速模糊或快速块相关。

3.4 基于积分图像加速计算 Haar 特征值

Haar 特征值是白色区域像素和与黑色区域像素和之差。使用积分图像可以快速直接地计算白色区域或黑色区域的的像素和,而不需要遍历像素累加计算,因此可以实现 Haar 特征值的加速计算。

在这里插入图片描述

如上图所示,

f = ∑ 白色区域像素值 − ∑ 黑色区域像素值 = I n t e g r a l ( A r e a w h i t e ) − I n t e g r a l ( A r e a b l a c k ) = s u m a b d e − s u m b c e f = ( L a − L b − L d + L e ) − ( L b − L c − L e + L f ) = ( L a − L b ) − ( L b − L c ) − ( L d − L e ) + ( L e − L f ) \begin{aligned} f &= \sum{白色区域像素值} - \sum{黑色区域像素值} \\ &= Integral(Area_{white}) - Integral(Area_{black}) \\ &= sum_{abde} - sum_{bcef} \\ &= (L_a - L_b - L_d + L_e) - (L_b - L_c - L_e + L_f) \\ &= (L_a - L_b) - (L_b - L_c) - (L_d - L_e) + (L_e - L_f) \end{aligned} f=白色区域像素值黑色区域像素值=Integral(Areawhite)Integral(Areablack)=sumabdesumbcef=(LaLbLd+Le)(LbLcLe+Lf)=(LaLb)(LbLc)(LdLe)+(LeLf)

提取图像的 Haar 特征需要大量重复计算多个尺度矩形的和,反复遍历每个像素,基于积分图像的方法是使用动态规划思想,极大地降低了计算时间。


4. Haar 特征级联分类器

Haar 特征分类器是基于 Haar-like 特征,使用积分图像加速计算,并用 Adaboost 训练的强分类器级联方法来进行特征检测的监督学习分类器。

4.1 Adaboost 算法

Adaboost 算法( Adaptive Boosting )是一种通用的分类器性能提升算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。

Boosting 是一种重要的集成学习技术,主要思想是通过一些简单的规则整合,将预测精度较低的弱学习器增强为预测精度较高的强学习器,为学习算法的设计提供了一种有效的新思路和新方法。作为一种元算法框架,Boosting 几乎可以应用于所有目前流行的机器学习算法,以加强原算法的预测精度。

Adaboost 算法是一种有效而实用的 Boosting 算法,算法的原理是通过调整样本权重和弱分类器权值,从训练出的弱分类器中筛选出权值系数最小的弱分类器组合成一个最终强分类器。

Adaboost 算法是一种迭代训练算法,对样本训练集中的关键分类特征集进行多次挑选,逐步训练分量弱分类器。使用适当的阈值选择最佳弱分类器,最后将每次迭代训练选出的最佳弱分类器构建为强分类器。

Adaboost 算法的训练过程是:

  1. 先通过对 N 个训练样本集的学习得到第 1 个弱分类器;
  2. 将分错的样本和其他的新样本一起构成一个新的 N 个样本的训练集,通过对这个训练集的学习得到第 2 个弱分类器 ;
  3. 将 1 和 2 都分错了的样本和其他的新样本构成另一个新的 N 个样本的训练集,通过对这个训练集的学习得到第 3 个弱分类器;
  4. 依次类推,直到获得最终的强分类器。

Adaboost 算法的基本步骤如下:

  1. 构建第一个弱学习器,找到性能最好的“树桩”(stump)。
  2. 计算“树桩”的分类误差:

e t = ∑ i = 1 n w i ∗ ∣ h j ( x i ) − y i ∣ e_t = \sum^n_{i=1} w_i * |h_j(x_i) - y_i| et=i=1nwihj(xi)yi

  1. 调整“树桩”的权重:

α = 1 2 l n ( 1 − e t e t ) \alpha = \frac{1}{2} ln(\frac{1-e_t}{e_t}) α=21ln(et1et)

  1. 调整样本权重:

w t + 1 , i ← w t , i β t 1 − e t w i ← w i ∑ j = 1 n w j w_{t+1, i} \leftarrow w_{t,i} \beta_t^{1-e_t}\\ w_i \leftarrow \frac{w_i}{\sum^n_{j=1} w_j} wt+1,iwt,iβt1etwij=1nwjwi

  1. 再次运行,构造一个新的自举数据集。
  2. 重复以上过程,直到达到终止条件。
  3. 将弱学习器组合成一个集成模型。

Adaboost 算法广泛应用于二分类问题、多类单标签问题、多类多标签问题、大类单标签问题和回归问题。使用 Adaboost 算法构造 Haar 特征分类器,可以更好地选择矩形特征的组合,这些矩形特征的组合就构成了分类器,分类器以决策树的方式存储这些矩形特征组合。


4.2 级联分类器

级联分类器(Cascade Classifier)是多个 AdaBoost 强分类器的级联组合,可以使用较少的特征和简单的分类器更快更好的实现分类。检测图像中的被检窗口依次通过每一级分类器,通过全部各级分类器的检测区域就是目标区域。由于大部分候选区域在前几层的检测中就被排除了,因此算法的效率很高。

建立弱分类器

一个完整的弱分类器包含:Haar 特征 + leftValue + rightValue + 弱分类器阈值(threshold)。建立弱分类器的步骤如下:

  1. 对于每个特征 f,计算所有训练样本的特征值,并将其排序。

  2. 扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:

  • 全部人脸样本的权重的和 t1;
  • 全部非人脸样本的权重的和 t0;
  • 在此元素之前的人脸样本的权重的和 s1;
  • 在此元素之前的非人脸样本的权重的和s0;

选取当前元素特征值fi(x),和它前面的一个特征值fi-1(x)之间的值作为阈值,该阈值的分类误差为:

e = m i n [ ( S 1 + ( T 0 − S 0 ) ) , [ ( S 0 + ( T 1 − S 1 ) ) ] e = min{[(S_1 + (T_0 - S_0)), [(S_0 + (T_1 - S_1))]} e=min[(S1+(T0S0)),[(S0+(T1S1))]

通过把这个排序的表从头到尾扫描一遍可以为弱分类器选择使分类误差最小的阈值(即最优阈值)。

建立强分类器

强分类器是由多个弱分类器并联构成的。迭代建立强分类器的步骤如下如下:

  1. 给定训练样本集 S,共 N 个样本,其中 X 和 Y 分别对应于正样本和负样本,T 为训练的最大循环次数。

  2. 初始化样本权重为 1/N,即为训练样本的初始概率分布。

  3. 第一次迭代训练 N 个样本,得到第一个最优弱分类器。

  4. 提高上一轮中被误判的样本的权重。

  5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。

  6. 循环执行步骤 4-5,T 轮后得到 T 个最优弱分类器。

  7. 组合 T 个最优弱分类器得到强分类器,组合方式如下:

C ( x ) = { 1 , ∑ t = 1 T a t h t ( x ) ≥ 1 2 ∑ t = 1 T a t 0 , e l s e C(x) = \begin{cases} 1 &, \sum_{t=1}^T {a_th_t(x)} \ge \frac{1}{2} \sum_{t=1}^T {a_t}\\ 0 &, else\\ \end{cases} C(x)={10,t=1Tatht(x)21t=1Tat,else

这相当于让所有弱分类器投票,对投票结果按照弱分类器的错误率加权求和,再进行阈值比较得到最终的结果。

级联强分类器

级联分类器相当于一个决策树,通过各级检测器逐级排除,得到最终结果 。

将多个强分类器组织为筛选式的级联分类器,每级分类器排除一部分非人脸样本,只有通过所有各级分类器的检测窗口才是人脸区域。

筛选式级联分类器的策略是,将若干个强分类器由简单到复杂排列,通过训练使每个强分类器都有较高检测率,而对误识率的要求相对较低。部分被检测的区域可以很早被筛选掉,迅速判断该区域没有要求被检测的物体,可以显著地降低计算量。


4.3 Haar 级联分类器

基于 Haar 特征的级联分类器是 Paul Viola 在论文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一种目标检测方法。

Haar 级联分类器在每一级的节点中,使用 AdaBoost 算法学习一个高检测率低拒绝率的多层分类器。其特点是:

  1. 使用 Haar-like 输入特征,对矩形图像区域的和或者差进行阈值化。

  2. 使用积分图像计算 45°旋转区域的像素和,加速 Haar-like 输入特征的计算。

  3. 使用统计 Boosting 来创建二分类(人脸/非人脸)的分类器节点(高通过率,低拒绝率)。

  4. 将弱分类器并联组合起来,构成筛选式级联分类器。

在这里插入图片描述

各级的 Boosting 分类器对于有人脸的检测窗口都能通过,同时拒绝一小部分非人脸的检测窗口,并将通过的检测窗口传给下一个分类器。依次类推,最后一个分类器将几乎所有非人脸的检测窗口都拒绝掉,只剩下有人脸的检测窗口。因此,只要检测窗口区域通过了所有各级 Boosting 分类器,则认为检测窗口中有人脸。

在实际应用中输入图片的尺寸较大,需要进行多区域、多尺度的检测。多区域是要遍历图片的不同位置,多尺度是为了检测图片中不同大小的人脸。

在 Haar 级联分类人脸检测器中,主要利用了人脸的结构化特征:

  • 眼睛区域比脸部区域暗;

  • 鼻子区域比眼睛区域亮。

通过这 5 个矩形区域的明暗关系,就可以形成对人脸的各个部分的判别特征。Haar 人脸检测训练很高,但对侧脸的检测性能较差。


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/130373695)
Copyright 2022 youcans, XUPT
欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新

相关文章:

【youcans 的 OpenCV 学习课】22. Haar 级联分类器

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】22. Haar 级联分类器 3. Haar 特征及其加速计算3.1 Haar 特征3.2 Haar 特征值的计算3.3 积分图像3.4 基于积分图像加速计算 Haar 特…...

如何避免知识盲区 《人生处处是修行》 读书笔记

如何避免知识盲区 多元化学习&#xff1a;不要只关注自己擅长的领域&#xff0c;应该尝试学习其他领域的知识&#xff0c;例如文学、艺术、科学等。 拓宽阅读&#xff1a;阅读不同领域的书籍、文章、博客等&#xff0c;可以帮助你了解更多的知识和观点。 参加培训和课程&…...

vue返回上一页自动刷新方式

再vue中&#xff0c;返回上一页时&#xff1a;如果页面是打开的状态&#xff0c;页面不会自动刷新&#xff0c;会保持着上次跳转的状态不更新&#xff1b; 原因&#xff1a;vue-router的切换不同于传统的页面切换&#xff0c;而是路由之间的切换&#xff0c;其实就是组件之间的…...

查询SERVER正在执行的SQL语句

--方法一 select * from master..sysprocesses SELECT distinct [Spid] session_Id, ecid, [Database] DB_NAME(sp.dbid), [User] nt_username, [Status] er.status, [Wait] wait_type, [Individual Query] SUBSTRING(qt.text, er.statement_start_offset / 2,…...

现代密码学--结课论文---《70年代公钥传奇》

摘要&#xff1a;在70年代之前&#xff0c;密码学主要被军方用于通信保护。密码学的主要研究也是由情报机构&#xff08;GCHQ、NSA等&#xff09;或IBM等企业运营的获得许可的实验室中进行。这时公众几乎无法获得密码学知识&#xff0c;直到由三位密码学家Hellman、Diffie和Mer…...

cf1348B phoenix and beauty(双指针滑动窗口的构造)

C 题面 Problem - 1348B - Codeforces 输出标准输出 凤凰网喜欢美丽的数组。如果一个数组中所有长度为k的子数组 的子数都有相同的总和&#xff0c;那么这个数组就是美丽的。一个数组的子数组是任何连续元素的序列。 凤凰网目前有一个数组a 的长度为n . 他想在他的数组中插入…...

一文读懂JAVA的hashCode方法:原理、实现与应用

目录 一、概述二、实现原理和重写规则三、如何重写hashCode方法3.1 Objects.hash()方法3.2 Apache HashCodeBuilder.3.3 Google Guava3.4 自定义哈希算法四、hashcode和equals的联系五、注意事项和建议5.1 注意事项5.2 建议六、总结一、概述 在Java中,每个对象都有一个hashCod…...

RocketMQ部署

一 安装mq 1.下载RocketMQ 本教程使⽤的是RocketMQ4.7.1版本&#xff0c;建议使⽤该版本进⾏之后的demo训练。 运⾏版&#xff1a;https://www.apache.org/dyn/closer.cgi?pathrocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip 源码&#xff1a;https://www.apache.org…...

43岁程序员,投了上万份简历都已读不回,只好把年龄改成40岁,这才有了面试机会,拿到了offer!...

40多岁找工作有多难&#xff1f; 一位43岁的程序员讲述了自己找工作的经历&#xff1a; 80年&#xff0c;大专&#xff0c;目前没到43周岁&#xff0c;年前被裁&#xff0c;简历上的年龄是42岁&#xff0c;两个多月投了上万份简历&#xff0c;99.5%是已读未回。后来改变策略把简…...

MySQL分区表相关知识总结

1.创建分区表&#xff1a; create table t(col11 int null, col22 …) engineinnodb partition by hash(col33) partitions 44; create table t(col11 int null, col22 …) engineinnodb partition by range(id) (partition p0 values less than (10), partition p1 values les…...

outlook邮箱pc/mac客户端下载 含最新版

新的 Outlook for Windows or mac 为 Outlook 应用带来了最新功能、智能辅助功能和新的新式简化设计。 你可以根据自己的风格定制它&#xff0c;并使用新的 Outlook for Windows/mac 执行更多操作&#xff01; 览版&#xff0c;与我们一起开始旅程&#xff0c;并帮助我们塑造新…...

缓存雪崩、缓存穿透、缓存击穿分别是什么?如何解决?

缓存中存放的大多都是热点数据&#xff0c;目的就是从缓存中获取数据&#xff0c;而不用直接访问数据库&#xff0c;从而提高查询效率 缓存雪崩 概念 指缓存在同一时间大面积失效&#xff0c;后面的请求直接访问数据库&#xff0c;导致数据库短时间内压力过大而崩溃&#xff…...

VBA实战篇学习笔记02 Err错误处理

文章目录 专题VI 错误处理课时38 常见错误类型错误代码13 :类型不匹配错误代码91: 对象变量或者with变量未设置错误代码1004: 视具体错误类型而变化 课时39 Err错误处理On Error Resume Next :Resume语句:Resume Next语句:未知错误:Exit SubOn Error Goto 0 专题VI 错误处理 课…...

【Git】拉取代码/提交代码

1.从将本地代码放入远程仓库 (如果有分支的情况) [git checkout xx切换分支后 git add . 将本地所有改动文件新增 commit之后 git push(将代码全部提交)] 分支操作 #查看分支 git branch #创建分支 git branch test #切换分支 git checkout test #修改代码 #提交代码git ad…...

产品预览 | 系统仿真与三维专业场仿真融合——MWORKS模型降阶工具箱

1 引言 近二十年来&#xff0c;数字化技术迅猛发展&#xff0c;以美国和中国提出装备数字工程为标志&#xff0c;人类迈入全新的数字化时代。装备数字化需要对装备的运行状态和行为进行准确的模拟和预测&#xff0c;这就需要利用系统仿真技术。系统仿真技术能够综合考虑装备的…...

我们都遇到过的这些ajax代码到底什么意思?

hello&#xff0c;我是小索奇&#xff0c;本篇文章给大家带来ajax中常用的一些代码&#xff0c;为什么写这些呢&#xff1f; 因为小索奇也看黑马、尚硅谷等老师的视频&#xff0c;在学习java的时候经常会介绍ajax&#xff0c;导致很多不了解的伙伴一脸懵然&#xff0c;以防万一…...

TiDB实战篇-TiCDC

目录 简介 原理 使用场景 使用限制 硬件配置 部署 在安装TiDB的时候部署 扩容部署 操作 管理CDC 管理工具 查看状态 创建同步任务 公共参数 CDC任务同步到MySQL实战 同步命令 查看所有的同步任务 同步任务的状态 管理同步任务 查看一个同步信息的具体情况 …...

ElasticSearch第十七讲 ES索引别名的使用

索引别名 ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处。别名是一个非常实用的功能,为我们使用索引提供了极大的灵活性,许多ES的API都支持…...

第二个机器学习应用:乳腺癌数据集在决策树模型上的挖掘

目录 决策树优化与可视化 1 决策树分类 2 决策树可视化 3 显示树的特征重要性 特征重要性可视化 决策树回归 1 决策树回归 决策树优化与可视化 1 决策树分类 from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sk…...

前端canvas截图酷游地址的方法!

前情提要 想在在JavaScript中&#xff0c;酷游专员KW9㍠ㄇEㄒ提供用HTML5的Canvas元素来剪取画面并存成SVG或PNG。 程式写法(一) 首先&#xff0c;需要在HTML中创建一个Canvas元素<canvas id"myCanvas"></canvas> 在JavaScript中&#xff0c;使用canv…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...