【深度学习】#12 计算机视觉

主要参考学习资料:

《动手学深度学习》阿斯顿·张 等 著

【动手学深度学习 PyTorch版】哔哩哔哩@跟李沐学AI

目录

  • 目标检测
    • 锚框
      • 交并比(IoU)
      • 锚框标注
        • 真实边界框分配
        • 偏移量计算
        • 损失函数
      • 非极大值抑制预测
    • 多尺度目标检测
    • 单发多框检测(SSD)
      • 类别预测层
      • 边界框预测层
    • 区域卷积神经网络(R-CNN)
      • R-CNN
        • 选择性搜索
        • 支持向量机
      • Fast R-CNN
        • 兴趣区域汇聚层
      • Faster R-CNN
    • YOLO
  • 语义分割
    • 转置卷积
      • 基本操作
      • 填充、步幅和多通道
    • 全卷积网络(FCN)
  • 风格迁移

在卷积神经网络和现代卷积神经网络两章中,我们只介绍了图像分类模型。由于深度神经网络可以有效地表示多个层次的图像,现今其已被成功应用于更多计算机视觉任务。本章将讨论目标检测、语义分割和风格迁移三种任务,在有限的篇幅内,重点介绍目标检测部分基础模型的设计思路,简要介绍语义分割和风格迁移的基本原理。

目标检测

图像分类假定图像中只有一个目标,我们只关注如何识别其类别。然而,很多时候图像中有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置,这类任务称为目标检测

在目标检测中,我们通常使用边界框来描述对象的空间位置。边界框是矩形的,由左上角以及右下角的 x x x坐标或 y y y坐标确定,也可用边界框中心的轴坐标 ( x , y ) (x,y) (x,y)以及框的宽度和高度表示。

下图中狗和猫的边界框左上角以及右下角的坐标分别为 [ ( 60 , 45 ) , ( 378 , 516 ) ] [(60,45),(378,516)] [(60,45),(378,516)] [ ( 400 , 112 ) , ( 655 , 493 ) ] [(400,112),(655,493)] [(400,112),(655,493)]

锚框

目标检测算法通常会在输入图像中抽样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界,从而更准确地预测目标的真实边界框。其中一种方法是以每个像素为中心,生成多个缩放比和宽高比不同的边界框,这些边界框被称为锚框(先验框)。

基于锚框的目标检测算法流程如下:

  1. 提出多个锚框区域;
  2. 预测每个锚框里是否含有关注的物体;
  3. 如果是,预测从这个锚框到真实边缘框的偏移。

假设输入图像的高度为 h h h,宽度为 w w w。对于缩放比为 s ∈ ( 0 , 1 ] s\in(0,1] s(0,1]、宽高比为 r > 0 r>0 r>0的锚框,其宽度和高度分别为 h s r hs\sqrt r hsr h s / r hs/\sqrt r hs/r 。我们只需设置一系列缩放比取值 s 1 , ⋯ , s n s_1,\cdots,s_n s1,,sn和宽高比取值 r 1 , ⋯ , r m r_1,\cdots,r_m r1,,rm,就能以每个像素为中心生成多个不同形状的锚框。

但是如果将缩放比和宽高比的取值两两组合,将会在输入图像中生成 w ⋅ h ⋅ n ⋅ m w\cdot h\cdot n\cdot m whnm个锚框,很容易导致过高的计算复杂度,在实践中,我们只考虑包含 s 1 s_1 s1 r 1 r_1 r1的组合

( s 1 , r 1 ) , ( s 1 , r 2 ) , ⋯ , ( s 1 , r m ) , ( s 2 , r 1 ) , ( s 3 , r 1 ) , ⋯ , ( s n , r 1 ) (s_1,r_1),(s_1,r_2),\cdots,(s_1,r_m),(s_2,r_1),(s_3,r_1),\cdots,(s_n,r_1) (s1,r1),(s1,r2),,(s1,rm),(s2,r1),(s3,r1),,(sn,r1)

此时对于整个输入图像将生成 w h ( n + m − 1 ) wh(n+m-1) wh(n+m1)个锚框。

下图以 ( 250 , 250 ) (250,250) (250,250)为中心生成了一系列不同缩放比和宽高比的锚框:

交并比(IoU)

对于生成的锚框,如果已知目标的真实边界框,我们需要度量二者之间的相似性。杰卡德指数可以度量两个集合的相似性,给定集合 A A A B B B,它们的杰卡德指数是它们交集的大小除以它们并集的大小

J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{|A\cap B|}{|A\cup B|} J(A,B)=ABAB

通过将任何边界框的像素区域视为像素的集合,我们可以通过其像素集的杰卡德指数来度量两个边界框的相似性。通常两个边界框的杰卡德指数被称为交并比(IoU),即两个边界框相交面积与相并面积之比。交并比的范围在 0 0 0 1 1 1之间,交并比越大,两个边界框重合面积占比越大,相似性越高。

锚框标注

在开始训练之前,我们需要为训练集进行标注,每个锚框都是训练集的一个训练样本。样本的标签包括类别偏移量。标注的流程大致如下:

  1. 根据IoU为每个锚框分配一个真实边界框,或视为背景,不分配真实边界框。
  2. 根据真实边界框的分配情况为每个锚框打上类别标签,非背景锚框被称为正类锚框,并且被打上其对应真实边界框的类别,而背景锚框被称为负类锚框。
  3. 对于非背景锚框,计算并标注其与对应真实边界框之间的偏移量。
真实边界框分配

下面介绍分配真实边界框的一种方法。

给定图像,假设锚框为 A 1 , A 2 , ⋯ , A n a A_1,A_2,\cdots,A_{n_a} A1,A2,,Ana,真实边界框为 B 1 , B 2 , ⋯ , B n b B_1,B_2,\cdots,B_{n_b} B1,B2,,Bnb,其中 n a ⩾ n b n_a\geqslant n_b nanb,则分配真实边界框的步骤为:

  1. 遍历并计算所有锚框与真实边界框之间的IoU,得到一个矩阵 X ∈ R n a × n b X\in\mathbb R^{n_a\times n_b} XRna×nb,其中第 i i i行、第 j j j列的元素 x i j x_{ij} xij是锚框 A i A_i Ai和真实边界框 B j B_j Bj的IoU。
  2. 保证 n b n_b nb个真实边界框都至少被分配到一个锚框。
    1. 在矩阵 X X X中找到最大的元素,其行索引和列索引记为 i 1 i_1 i1 j 1 j_1 j1,然后将真实边界框 B j 1 B_{j_1} Bj1分配给锚框 A i 1 A_{i_1} Ai1,并丢弃矩阵中第 i 1 i_1 i1行和第 j 1 j_1 j1列中的所有元素(防止锚框和真实边界框被重复分配)。
    2. 在矩阵 X X X的剩余元素中找到最大的元素,其行索引和列索引记为 i 2 i_2 i2 j 2 j_2 j2,然后采取同样的操作。
    3. 延续上述操作,直至矩阵 X X X中的所有元素都被丢弃,此时 n b n_b nb个真实边界框都被分配到了一个锚框。
  3. 遍历并分配剩余的 n a − n b n_a-n_b nanb个锚框。对于锚框 A i A_i Ai,在矩阵 X X X的第 i i i行中找到与 A i A_i Ai的IoU最大的真实边界框 B j B_j Bj,如果这个IoU大于预定义的阈值,则将 B j B_j Bj分配给 A i A_i Ai,否则将 A i A_i Ai视为背景。

下图展示了第二大步的操作,蓝色格子为剩余的元素,标记出的元素为被分配的锚框-真实边界框:

偏移量计算

给定锚框 A A A和真实边界框 B B B,它们的中心坐标分别为 ( x a , y a ) (x_a,y_a) (xa,ya) ( x b , y b ) (x_b,y_b) (xb,yb),宽度分别为 w a w_a wa w b w_b wb,高度分别为 h a h_a ha h b h_b hb,则 A A A的偏移量 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x,\Delta y,\Delta w,\Delta h) (Δx,Δy,Δw,Δh)

( x b − x a w a − μ x σ x , y b − y a h a − μ y σ y , log ⁡ w b w a − μ w σ w , log ⁡ h b h a − μ h σ h , ) \left(\frac{\displaystyle\frac{x_b-x_a}{w_a}-\mu_x}{\sigma_x},\frac{\displaystyle\frac{y_b-y_a}{h_a}-\mu_y}{\sigma_y},\frac{\log\displaystyle\frac{w_b}{w_a}-\mu_w}{\sigma_w},\frac{\log\displaystyle\frac{h_b}{h_a}-\mu_h}{\sigma_h},\right) σxwaxbxaμx,σyhaybyaμy,σwlogwawbμw,σhloghahbμh,

四个数值分别衡量 A A A B B B的横坐标偏移、纵坐标偏移、宽度比和高度比。 μ \mu μ σ \sigma σ用于规范化,其默认值为 μ x = μ y = μ w = μ h = 0 \mu_x=\mu_y=\mu_w=\mu_h=0 μx=μy=μw=μh=0 σ x = σ y = 0.1 \sigma_x=\sigma_y=0.1 σx=σy=0.1 σ w = σ h = 0.2 \sigma_w=\sigma_h=0.2 σw=σh=0.2

损失函数

锚框的损失函数 L L L由类别标签的分类损失 L c l s L_{cls} Lcls和偏移量标签的回归损失 L r e g L_{reg} Lreg组成,可计算如下

L = L c l s + λ L r e g L=L_{cls}+\lambda L_{reg} L=Lcls+λLreg

分类损失可使用交叉熵损失计算,回归损失可使用平滑L1损失计算。

非极大值抑制预测

在预测时,我们先为图像生成多个锚框,再为这些锚框一一预测类别。如果锚框被预测为非背景锚框,则进一步计算它的偏移量,并根据偏移量对锚框进行偏移得到真正的预测框。对于锚框 A A A的初始位置和大小 ( x a , y a , w a , h a ) (x_a,y_a,w_a,h_a) (xa,ya,wa,ha)及其偏移量 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x,\Delta y,\Delta w,\Delta h) (Δx,Δy,Δw,Δh),调整后的预测框位置和大小计算如下

x = x a + w a Δ x y = y a + h a Δ y w = w a e Δ w h = h a e Δ h \begin{split} x&=x_a+w_a\Delta x\\ y&=y_a+h_a\Delta y\\ w&=w_ae^{\Delta w}\\ h&=h_ae^{\Delta h} \end{split} xywh=xa+waΔx=ya+haΔy=waeΔw=haeΔh

最终,模型可能会输出许多相似的具有明显重叠的预测框,它们都围绕同一个目标。为了简化输出,我们可以使用非极大值抑制合并属于同一目标的相似的预测框,其步骤如下:

  1. 对每个预测框 B B B,取其对每个类别预测概率的最大值 p p p作为其置信度,该概率对应的类别即为预测类别。
  2. 将所有预测框根据置信度按降序排序,生成列表 L L L
  3. L L L中选取置信度最高的预测框 B 1 B_1 B1作为基准,将所有与 B 1 B_1 B1的IoU超过预定阈值 ϵ \epsilon ϵ的预测框从 L L L中移除,即移除了与 B 1 B_1 B1相似但置信度低于 B 1 B_1 B1的预测框。
  4. L L L中选取置信度次高的预测框 B 2 B_2 B2作为基准,然后采取同样的操作。
  5. 重复上述过程,直至 L L L中剩余的预测框都曾被选为基准,此时 L L L中任意一对预测框的IoU都小于阈值 ϵ \epsilon ϵ,即没有一对预测框过于相似。
  6. 输出 L L L中的所有预测框。

下图展示了非极大值抑制的操作效果:

请添加图片描述

多尺度目标检测

即使我们已经缩减了锚框缩放比和高宽比的组合,但是为每个像素都生成锚框仍会导致过大的计算量。一个进一步减少图像上锚框数量的方法是多尺度锚框

多尺度锚框考虑到,在不同尺度下,较小的目标相对于较大的目标在图像上出现的可能性更为多样,例如在一张 2 × 2 2\times2 2×2像素的图像中, 1 × 1 1\times1 1×1像素、 1 × 2 1\times2 1×2像素和 2 × 2 2\times2 2×2像素的目标可以分别以 4 4 4种、 2 2 2种和 1 1 1种可能的方式出现。因此,当使用较小的锚框检测较小的目标时,我们可以抽样较多的取区域,而对于较大的目标,我们可以抽样较少的区域。

一种控制不同尺度抽样数量的方法是对于不同的尺度,根据尺度的大小在图像上选取一系列均匀分布的像素点作为锚框中心,并生成该尺度下一系列高宽比的锚框。

下图分别展示了尺度 s s s 0.15 0.15 0.15 0.4 0.4 0.4 0.8 0.8 0.8时选取的像素中心及生成的锚框:

基于卷积神经网络的多尺度目标检测方法通常不直接在输入图像上生成不同尺度的锚框,而是利用卷积层提取输入图像不同尺度的特征,相应的特征输出被称为特征图。越靠后的卷积层输出的特征图的每个单元在输入图像上具有更大的感受野,因此不同特征图的一个单元就对应着输入图像上不同尺度的锚框。

单发多框检测(SSD)

单发多框检测(SSD)是一种简单、快速且被广泛使用的目标检测模型,其主要由一个基础网络块和若干多尺度特征块组成:

基础网络块用于从输入图像中提取特征,因此可以使用深度卷积神经网络(其设计者使用VGG块,现在也常用ResNet块)。基础网络块的输出将设置较大的高和宽,以便生成更多的锚框用于检测较小的目标。接下来的每个多尺度特征块将上一层提供的特征图的高和宽缩小,使得特征图中每个单元在输入图像上的感受野变大,从而检测更大的目标。

类别预测层

假设特征图的高和宽分别为 h h h w w w,以其中每个单元为中心生成 a a a个锚框,则我们需要对 h w a hwa hwa个锚框进行分类。又假设目标类别的数量为 q q q,则加上背景类别 0 0 0,锚框共有 q + 1 q+1 q+1个类别。如果使用全连接层分类很容易导致庞大的参数,因此我们使用NiN提供的思路(参见现代卷积神经网络一章),将通道维度视为特征维度,使用卷积层分类。卷积层要求输入和输出的特征图大小一致,以保证二者的坐标一一对应,而输出特征图上坐标 ( x , y ) (x,y) (x,y)的通道将包含以输入特征图上坐标 ( x , y ) (x,y) (x,y)为中心生成的 a a a个锚框关于 q + 1 q+1 q+1个类别的预测,因此输出通道数为 a ( q + 1 ) a(q+1) a(q+1),其中第 i ( q + 1 ) + j ( 0 ⩽ j ⩽ q ) i(q+1)+j(0\leqslant j\leqslant q) i(q+1)+j(0jq)个通道代表第 i i i个锚框被预测为类别 j j j的概率。

边界框预测层

边界框预测层的设计与类别预测层类似,只是其输出通道是对每个锚框的四个偏移量的预测,因此输出通道数为 4 a 4a 4a

简而言之,SSD的预测过程如下:

  1. 输入图像经基础网络块和一系列多尺度特征块,得到一系列不同尺度的输出特征图。
  2. 在每个输出特征图上以每个单元为中心生成 a a a个锚框,并对这些锚框进行类别和偏移量预测得到一系列预测框。
  3. 对所有预测框进行非极大值抑制处理,得到最终输出的预测框。

区域卷积神经网络(R-CNN)

R-CNN及其一系列改进方法是将深度模型应用于目标检测的另一个开创性工作。限于篇幅本节对部分方法只作简要解释。

R-CNN

R-CNN的预测过程如下:

  1. 对输入图像使用选择性搜索选取多个高质量的提议区域。
  2. 通过各向异性缩放(直接拉伸)或各向同性缩放(先填充再按比例拉伸)将提议区域缩放为固定大小。
  3. 选择一个预训练的卷积神经网络,提取每个提议区域的特征。
  4. 类别预测:为每个类别(除了背景类别)训练一个二分类支持向量机,使用每个支持向量机根据提议区域的特征判断其是否属于某个类别。
  5. 边界框预测:使用线性回归模型根据提议区域的特征预测每个提议区域的偏移量,进而得到每个提议区域的预测框。
  6. 对所有预测框进行非极大值抑制处理,得到最终输出的预测框。

选择性搜索

选择性搜索是一种传统计算机视觉算法,其目标是生成可能包含物体的候选区域。选择性搜索的过程为:

  1. 使用Felzenswalb图像分割算法(基于图像边缘信息)将图像分割为超像素(像素集),得到一系列初始区域的集合 R = { r 1 , r 2 , ⋯ , r n } R=\{r_1,r_2,\cdots,r_n\} R={r1,r2,,rn}
  2. 对每个相邻区域 ( r i , r j ) (r_i,r_j) (ri,rj),分别计算它们的颜色、纹理、大小和形状相似度。
  3. 每次迭代选择综合相似度最高的区域将相邻区域合并为新区域并更新新区域的特征,直到整张图像成为一个区域。
  4. 在合并过程中记录所有中间区域的边界框作为候选区域,最后使用非极大值抑制移除高度重叠的冗余框(通常保留约2000个候选区域)。
支持向量机

支持向量机是一种非神经网络的机器学习分类模型,其原理为:

  1. 通过核函数将数据集映射到高维空间,使之线性可分(能用一个超平面将不同类别的特征分割)。
  2. 找到一个超平面将两类特征分开,并最大化支持向量(距离超平面最近的样本点)到超平面的距离。
  3. 使用超平面作为决策边界对输入进行分类。

Fast R-CNN

R-CNN的缺点在于,其第二步的卷积神经网络对每个提议区域独立处理,因此对于提议区域中相互重叠的部分会重复计算。Fast R-CNN采取的改进是通过直接对整张图像进行处理来减少不必要的计算,其步骤如下:

  1. 对输入图像使用选择性搜索生成多个提议区域。
  2. 将整个输入图像作为卷积神经网络的输入提取共享特征。
  3. 由提议区域在共享特征上标出一系列兴趣区域,使用兴趣区域汇聚层将其处理为固定形状。
  4. 通过全连接层进一步调整形状后进行预测。

兴趣区域汇聚层

兴趣区域汇聚层接收整张图像的特征和候选区域为输入,输出固定大小的候选区域特征,其步骤如下:

  1. 将候选区域按坐标比例缩放后投影到特征图上,选出共享特征中与候选区域对应的部分。
  2. 将投影区域平均划分为 m × n m\times n m×n的网格。
  3. 每个网格进行最大汇聚操作(取最大值作为输出),得到 m × n m\times n m×n的固定形状输出。

Faster R-CNN

Faster R-CNN在Fast R-CNN的基础上,将生成提议区域的方法由选择性搜索替换为区域提议网络(RPN),进一步减少了提议区域生成的数量,并确保目标检测的精确度。

RPN本质上是一个轻量级目标检测模型,以更低的计算成本快速对可能包含物体的区域进行粗筛(只对是否包含物体进行二元分类),相当于在仔细观察之前先进行了一次扫视。

使用RPN让R-CNN更加近似地实现了端到端的学习范式,即从输入到输出由统一的模型完成,所有模块可以联合训练。而在R-CNN和Fast R-CNN中,选择性搜索、支持向量机模块脱离了神经网络,都需要独立训练。除此之外,神经网络相较其他方式可以利用GPU实现高效计算,运行在CPU的选择性搜索算法生成2000个候选框需要约2秒,而RPN仅需约10ms。

YOLO

YOLO是目标检测领域最具影响力的算法之一,以极快的速度和端到端的设计著称。和R-CNN系列的双阶段检测不同,YOLO将检测任务视为单次回归问题,直接在图像上预测边界框和类别,实现了真正的实时检测。

YOLO的核心思路为将图像划分为 S × S S\times S S×S的网格,每个网格负责预测中心落在该区域的目标,直接生成 B B B个预测框的坐标和置信度,无需生成候选框。YOLO经过数年迭代,融入许多改进点,其系列已演进到YOLOv8,本文暂不深入展开。

语义分割

语义分割重点关注如何将图像分割成属于不同语义类别的区域。与目标检测不同,语义分割可以识别并理解图像中每个像素的内容,其语义区域的标注和预测是像素级的。

转置卷积

我们目前介绍的卷积神经网络层通常会减少下采样输入图像的空间维度(高和宽),如果输入图像和输出图像的空间维度相同,在以像素级分类的语义分割中将会很方便。转置卷积可以逆转下采样导致的空间维度减小,增加上采样中间层特征图的空间维度。

基本操作

转置卷积可以理解为卷积的逆操作。在转置卷积中,卷积核并不是和输入图像上与之形状相同的区域做按元素乘法并求和的运算,而是每次选中一个元素,该元素分别和卷积核的每个元素做乘法得到和卷积核形状相同的输出。将输入图像中每个元素和卷积核运算的输出按步幅叠加即可得到放大的输出。

填充、步幅和多通道

与常规卷积不同,转置卷积的填充被应用于输出,且填充操作实际上是裁剪输出边缘对应数量的行和列,这也可以从卷积的逆操作来理解。

同样地,步幅也是为输出而非输入指定的,其表示每次卷积核操作之后输出位置的滑移量,下图展示了步幅为2的转置卷积:

对于多输入输出通道,转置卷积与常规卷积以相同的方式操作,即每个输入通道都会被分配与输出通道数目相同的卷积核,每个卷积核负责一个输入通道到一个输出通道的计算。

全卷积网络(FCN)

全卷积网络(FCN)通过引入转置卷积,采用卷积神经网络实现了从图像像素到像素类别的转换。FCN开创了全卷积架构的先河,奠定了现代分割网络的基础。

FCN的核心改进在于将传统卷积神经网络的全连接层替换为了转置卷积层。FCN先使用卷积神经网络提取图像特征,然后通过 1 × 1 1\times1 1×1卷积层将通道数转换为类别数,再通过转置卷积层将特征图的高和宽转换为输入图像的大小,而每个像素的每个输出通道表示该像素被预测为对应类别的概率。

风格迁移

风格迁移是一种将艺术风格与图像内容相结合的计算机视觉技术,它接收两张图像作为输入,一张是内容图像,另一张是风格图像。模型将修改内容图像,使其在风格上接近风格图像。

一种基于卷积神经网络的风格迁移模型如下图所示,实线箭头和虚线箭头分别表示前向传播和反向传播:

该模型中,每个图像都由一个预训练好的卷积神经网络处理,在训练中无需更新。该卷积神经网络凭借多个层逐级提取图像的特征,其中某些层被指定输出内容特征或风格特征。

模型在风格迁移过程中所需迭代的模型参数即合成图像,其迭代流程如下:

  1. 初始化合成图像,通常使用内容图像,合成图像将在内容图像的基础上不断演进。
  2. 使用卷积神经网络提取内容图像和风格图像的内容特征和风格特征。
  3. 迭代合成图像:
    1. 使用卷积神经网络提取合成图像的内容特征和风格特征。
    2. 计算合成图像与内容图像之间的内容损失、合成图像与风格图像之间的风格损失和合成图像的全变分损失(总变差损失)。
    3. 三个损失通过反向传播对合成图像进行优化。
    4. 重复上述操作。
  4. 迭代一定次数后得到最终的合成图像。

其中,内容(风格)损失均通过平方误差函数度量合成图像与内容(风格)图像在特征上的差异得到。而全变分损失度量邻近像素值的差异,用于去除合成图像中大量的高频噪点,即特别亮或特别暗的像素。假设 x i , j x_{i,j} xi,j表示坐标 ( i , j ) (i,j) (i,j)处的像素值,则全变分损失计算如下:

∑ i , j ∣ x i , j − x i + 1 , j ∣ + ∣ x i , j − x i , j + 1 ∣ \sum_{i,j}|x_{i,j}-x_{i+1,j}|+|x_{i,j}-x_{i,j+1}| i,jxi,jxi+1,j+xi,jxi,j+1

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

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

相关文章

MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频

扣子最近迎来重要更新,支持将扣子工作流一键发布成MCP,在扣子空间里使用。 这个功能非常有用,因为我有很多业务工作流是在扣子平台上做的,两者打通之后,就可以在扣子空间里直接通过对话方式调用扣子工作流了&#xff0…

Redis学习打卡-Day3-分布式ID生成策略、分布式锁

分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时,就需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…

LabVIEW光谱信号仿真与数据处理

在光谱分析领域,LabVIEW 凭借其图形化编程、丰富函数库及强大数据处理能力,成为高效工具。本案例将介绍如何利用 LabVIEW 仿真光谱信号,并对实际采集的光谱数据进行处理,涵盖信号生成、数据采集、滤波、分析及显示等环节。 ​ 一…

nginx相关面试题30道

一、基础概念与核心特性 1. 什么是 Nginx?它的主要用途有哪些? 答案: Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器,基于事件驱动的异步非阻塞架构,擅长处理高并发场景。 主要用途:…

数据库实验报告 数据定义操作 3

实验报告(第3次) 实验名称 数据定义操作 实验时间 10月12日1-2节 一、实验内容 1、本次实验是用sql语句创建库和表,语句是固定的,要求熟记这些sql语句。 二、源程序及主…

霍夫圆变换全面解析(OpenCV)

文章目录 一、霍夫圆变换基础1.1 霍夫圆变换概述1.2 圆的数学表达与参数化 二、霍夫圆变换算法实现2.1 标准霍夫圆变换算法流程2.2 参数空间的表示与优化 三、关键参数解析3.1 OpenCV中的HoughCircles参数3.2 参数调优策略 四、Python与OpenCV实现参考4.1 基本实现代码4.2 改进…

记录一次修改nacos安全问题导致服务调用出现404

1、nacos默认值修改 nacos.core.auth.plugin.nacos.token.secret.key**** nacos.core.auth.server.identity.key******** nacos.core.auth.server.identity.value************ 重启nacos, 这时候微服务的token认证会立即失效,等待自动重连认证或者手动重启服务 2、…

Python面试总结

hello,大家好,我是potato,我总结一下最近的面试遇到的问题~ 1.Python开发(软通动力) 自我介绍主要问了项目(YOLOv11)项目遇到的难点和解决方法is,列表和元组的区别Python多线程有什么问题?Pyt…

5.18 day24

知识点回顾: 元组可迭代对象os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。 元组 元组的特点: 有序,可以重复,这一点和列表一样 元组中的元素不能修改,这一点…

Uniapp中小程序调用腾讯地图(获取定位地址)

1、先配置权限: 这是上图的代码: "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序位置接口的效果展示" } } 第二步:写代码: //下面是uniapp的模版代码 主…

写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果

1. 添加依赖 在项目的 pom.xml&#xff08;Maven&#xff09;中添加以下依赖&#xff1a; xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…

nginx服务器实验

1.实验要求 1&#xff09;在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2&#xff09;为nginx服务配置虚拟主机&#xff0c;新增两个域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言 ** 在当今的分布式系统架构中&#xff0c;随着业务复杂度的不断提升以及系统规模的持续扩张&#xff0c;如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术&#xff0c;应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…

c++多线程debug

debug demo 命令行查看 ps -eLf|grep cam_det //查看当前运行的轻量级进程 ps -aux | grep 执行文件 //查看当前运行的进程 ps -aL | grep 执行文件 //查看当前运行的轻量级进程 pstree -p 主线程ID //查看主线程和新线程的关系 查看线程栈结构 pstack 线程ID 步骤&…

10.7 LangChain v0.3架构大升级:模块化设计+多阶段混合检索,开发效率飙升3倍!

LangChain v0.3 技术生态与未来发展 关键词:LangChain Chains, Agents 架构, Retrieval Strategy, LangGraph, 模块化设计 3. LangChain 项目:Chains, Agents, Retrieval Strategy LangChain v0.3 通过 Chains-Agents-Retrieval 三位一体的技术栈,构建起完整的大模型应用开…

分布式 ID 生成的五种方法:优缺点与适用场景

0.简介 在分布式系统中&#xff0c;生成全局唯一的id是一个常见的需求。由于分布式系统的特性&#xff08;多节点&#xff0c;网络分区&#xff0c;时钟不同步等&#xff09;&#xff0c;传统的单机ID生成方式不再适用&#xff0c;所以一些分布式生成方式应运而生&#xff0c;…

基于单片机路灯自动控制仪仿真设计

标题:基于单片机路灯自动控制仪仿真设计 内容:1.摘要 本设计旨在解决传统路灯控制方式效率低、能耗大的问题&#xff0c;开展了基于单片机的路灯自动控制仪仿真设计。采用单片机作为核心控制单元&#xff0c;结合光照传感器、时钟模块等硬件&#xff0c;运用相关软件进行编程和…

计算机网络-MPLS VPN基础概念

前面几篇文章我们学习了MPLS的标签转发原理&#xff0c;有静态标签分发和LDP动态标签协议&#xff0c;可以实现LSR设备基于标签实现数据高效转发。现在开始学习MPLS在企业实际应用的场景-MPLS VPN。 一、MPLS VPN概念 MPLS&#xff08;多协议标签交换&#xff09;位于TCP/IP协…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口&#xff0c;通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口&#xff0c;但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

windows 安装gdal实现png转tif,以及栅格拼接

windows 安装gdal实现png转tif&#xff0c;以及栅格拼接 一、安装gdal 网上有很多安装gdal的方法&#xff0c;此处通过osgeo4w安装gdal 1.下载osgeo4w 下载地址 https://trac.osgeo.org/osgeo4w/ 2、安装osgeo4w exe文件安装&#xff0c;前面部分很简单&#xff0c;就不再…