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

opencv中的图像特征提取

图像的特征,一般是指图像所表达出的该图像的特有属性,其实就是事物的图像特征,由于图像获得的多样性(拍摄器材、角度等),事物的图像特征有时并不特别突出或与无关物体混杂在一起,因此图像的特征获取需要采用特定的方法。

本文主要描述了图像特征提取的几种常用方法,并说明了其在opencv中的应用。

一.概述

图像的特征,分整体特征和局部特征,顾名思义,整体特征是将整个图像作为一个研究对象,而局部特征,是将整个图像划分为子区域,以子区域作为一个研究对象。历史上,图像的特征的提取是从整体特征开始的,但很快出现了困难:首先是背景的干扰,然后是事物在图像中的各种“形变”。于是研究的重点就转移到局部特征的提取上。

图像的局部特征,往往处于图像变化比较大的区域,例如边缘、角、脊等,因为这些区域所含有的信息,比一块色彩无变化的区域要多。常用的特征包括:灰度、直方图、梯度、边缘、纹理、矩等等,因此局部特征提取主要分为:基于灰度的算法、基于分布统计的算法和基于轮廓的算法,它们各有特点。

图像的特征包含了事物图像表述的大部分信息,有些特征即使进行某些操作,它们仍然稳定地存在。这里的图像的操作包括几何变化和光度变化。几何变化就是平移,旋转,缩放等,光度变化就是亮度,色度等变化。局部特征一般都能做到平移无关。要做到旋转无关,则需要将窗口以某个主方向对齐后再提取局部特征。如果对图像进行归一化(最大最小值归一化、均值方差归一化、直方图均衡化等)处理,能在一定程度上做到对亮度或光照无关。采用合适的方法,找出并提取这些特征,就相当于确定了事物的图像。

  图像特征提取,一般可以用来做聚类、匹配、识别、拼接等工作

特征提取其实包括特征检测与特征描述两方面内容,一般情况下,先检测、判断特征点,然后对特征点进行相似性度量,但大部分检测方法都形成了特定的绑定,即在判断特征点的同时生成特定的描述符,以致二者变成了同一个过程。特征提取和匹配包括三部分内容:

  1. 1、检测(detection):识别特征(关键)点
  2. 2、描述(description): 描述每个特征点周围的特征,理想情况下,这种描述在光照、平移、旋转等变化下是不变的。通常对特征点的描述采用的是一个描述符向量。
  3. 3、匹配(matching): 通过比较图像中的特征描述符来识别相似的特征。比较的方法和判断的阈值是关键。

下面是一些经典关键点的检测方法。

  1. HARRIS- 1988 Harris Corner Detector (Harris, Stephens)
  2. Shi, Tomasi- 1996 Good Features to Track (Shi, Tomasi)
  3. SIFT- 1999 Scale Invariant Feature Transform (Lowe)
  4. SURT- 2006 Speeded Up Robust Features (Bay, Tuytelaars, Van Gool) -None free

二.Harris角点检测

图像中的边缘,角,脊等一般都是图像的特征(关键)点,先给出它们的特征:

  1. 边缘:是组成图像两个区域之间边界(或边缘)的像素。一般是图像中拥有大梯度(颜色或灰度变化率大)的点组成的子集。
  2. 角 :在局部有两维结构,一般是图像梯度中高度曲率的点(方向突然发生变化的边缘)。
  3. 脊 :长条形的物体被称为脊,可以被看作是代表对称轴的一维曲线,对于每个脊有一个脊宽度。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。

这里以Harris方法说明角点的检测。算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素变化程度,如果存在任意方向上的滑动,都有着较大变化,那么可以认为该窗口中存在角点。这个过程的形象说明如下图:

蓝色窗口朝各方向移动后,窗口内像素值没有变化;黑色窗口如果如果沿着垂直方向移动,像素值会发生改变,如果沿着水平移动,像素值不会发生变化;红色窗口不管朝哪个方向移动,像素值都会发生很大变化。从这里也可以看出,角点特征是图像中较好的特征,比边缘特征更好地用于定位。

Harris 角点检测具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘(例如小圆角可被认为是角点,而大圆角可能被认为是边缘)。

Opencv中提供了cornerHarris函数,它的声明如下:

void cv::cornerHarris (InputArray  	src,OutputArray  	dst,int  	blockSize,int  	ksize,double  	k,int  	borderType = BORDER_DEFAULT ) 	

Harris根据图像的灰度进行检测,所以src为灰度图像,dst为窗口的变化响应值(该值的意义参见官网的“Harris Corner Detection”条目),它与原图像大小相同(每像素一个值),通过该值,可将这个窗口所在的区域划分为平面、边缘或角点,角点时,该值比较大,因而可认为该值大于某阈值时,此窗口内包含角点。blockSize是检测窗口的大小,ksize表示计算梯度时Sobel()算子的大小,k是计算dst用到的一个参数,borderType是图像像素的边界模式,一般blocksize取2,ksize取3,k取0.04。

该函数的应用比较简单,就是判断dst[i,j]是否大于阈值,该阈值与具体的图像有关,例如官网的一个示例中,取dst中最大值的0.01。

三.HOG

HOG( histogram of oriented gradients)的意思是方向梯度直方图,由 Navneet Dalal 和 Bill Triggs 于 2005 年首次引入的,它实际上是以统计的角度来表达某一区域内像素值变化的大小和方向。

HOG有以下特点:

  1. HOG表示的是边缘(梯度)的结构特征,因此可以描述局部的形状信息;
  2. 位置和方向空间的量化一定程度上可以抑制平移和旋转带来的影响;
  3. 如果采用局部区域归一化直方图,可以部分抵消光照变化带来的影响;

HOG特征是通过计算各小区域的特征集合而成,这里先需要说明一下HOG中的区域划分的概念:block(块),cell(胞元),win(窗口),它们会在HOG计算过程中出现。block包含cell(一般要求blokc大小是整数倍数的cell大小),例如cell可取8*8的像素,每个block可取2*2个cell,那么block的大小应该是16*16。win就是要计算特征的图像窗口,在win中,采用滑动block的方法得到各block,滑动时,由滑动步长控制每滑动一次的距离。win, block, cell滑动步长之间的关系如下图所示。

上图中,cell的大小为2*2,block的大小为4*6(包含2*3个cell),win的大小为10*10,虚线框表示初始block横向和纵向分别滑动了一步,此时滑动步长为2和1。理想情况下,如果block大小正好能“套住”图像的特征,当然最好,但现实不是这样,因此各block之间应有一定的重叠,block和滑动步长的大小也要合适。对上面的情况,横向可以有(窗口长-cell长)/步长+1个block(要求整除),纵向同理,即总共有[(10-4)/2+1]* [(10-6)/1+1]=20个block。

HOG相对于其它算法是比较简单的,步骤如下:

  1. 图像预处理:包括大小,灰度化,抑噪等,主要是为了提高图像特征描述对光照及环境变化的鲁棒性,降低图像局部的阴影、局部曝光过多及纹理失真,尽可能抑制噪声干扰。
  2. 对待计算的图像设置win,block等,先计算每个像素的图像梯度和方向,再在cell内进行统计(按角度划分若干个统计区间),形成直方图。这种直方图包含了局部图像方向变化的和强度的信息,在block范围内进行归一化,采用归一化后,可以消除整体亮度变化带来的影响。
  3. 将win内所有的block向量合起来,就是整个win的特征。

这里可以看出,HOG中的直方图是对cell而言的,无论cell的大小,每个cell都有固定个值(下标维度隐含了角度,这个固定值一般为9,即将180度分成9个统计区间,大于180度梯度认为是负值),但特征向量是对block而言的,即如果一个block含有4个cell,特征值就是一个36维的向量,如果一个窗口有20个block,则特征值就是一个36*20=720维的向量。

关于block向量的归一化,原论文中提到4种方法:一是采用L2范数;二是采用L2范数,然后限制分量的最大值(为0.2),再次归一化,这种方法就是L2-Hys;三是L1范数;四是L1范数,然后取平方根。具体描述可见Navneet Dalal 和 Bill Triggs的论文(https://hal.inria.fr/inria-00548512/document/)。

Opencv中提供了HOGDescriptor类,HOGDescriptor类不但提供了计算HOG特征的方法,也提供了在图像中判断是否具有某特征的方法(即物体检测)。使用HOGDescriptor的流程大致上是:构造,compute计算特征,detect检测物体(如果需要)。

构造HOGDescriptor的声明如下:

cv::HOGDescriptor::HOGDescriptor(Size  	_winSize,Size  	_blockSize,Size  	_blockStride,Size  	_cellSize,int  	_nbins,int  	_derivAperture = 1,double  	_winSigma = -1,HOGDescriptor::HistogramNormType  	_histogramNormType = HOGDescriptor::L2Hys,double  	_L2HysThreshold = 0.2,bool  	_gammaCorrection = false,int  	_nlevels = HOGDescriptor::DEFAULT_NLEVELS,bool  	_signedGradient = false ) 

_winSize:要计算的图像窗口大小

_blockSize:block大小

_blockStride:滑动步长

_cellSize:cell大小

_nbins:每个cell按角度划分的区间,一般为9,即20度一个统计区间

_derivAperture:未知

_winSigma:在计算前可以使用高斯函数进行平滑,降低噪点的影响,高斯函数的σ

_histogramNormType:直方图的归一化的方法,就是L2-Hys

_L2HysThreshold:L2-Hys方法中的最大分量值

_gammaCorrection:是否进行gamma校正

_nlevels:用于不同图像尺寸(缩小)时进行检测,最大的层数,只计算特征时没有使用

_signedGradient: 计算的梯度是否有正负,如果不区分互为反方向的两个梯度(经验表明,在行人检测中,无符号梯度优于有符号梯度),把它们都当作正数,则采用无符号梯度,否则采用有符号梯度。

计算HOG特征的的声明如下:

void cv::HOGDescriptor::compute 	( InputArray  	img,std::vector< float > &  	descriptors,Size  	winStride = Size(),Size  	padding = Size(),const std::vector< Point > &  	locations = std::vector< Point >() ) 

Img:输入的灰度图像

descriptors:输出的HOG特征向量

winStride :检测窗口的滑动步长

padding:窗口填充大小,对物体处于边界时,检测比较有效。

locations :检测到物体时的左上角坐标(大小是winSize)

检测物体时,HOGDescriptor提供了detect和detectMultiScale方法,在setSVMDetector之后,就可以调用它们,其实应该是调用训练好的SVM进行分类,由于HOG对样本图像的大小比较敏感的,所以需要对待检测的图像进行多尺寸(缩放)检测,MultiScale就是这个意思,当然,待检测图像中可能不止一次出现样本的图像,检测的结果是一个数组而非一个数。这里不再描述HOGDescriptor本身具有的检测方法。

四.ORB

ORB(Oriented FAST and Rotated BRIEF) 是一种快速特征点提取和描述的算法,它作为一种替代SIFT,SURF方法而被提出的(2011年),它采用改进的FAST关键点检测方法,使其具有方向性,并采用具有旋转不变性的BRIEF特征描述子,并在它们原来的基础上做了改进与优化,FAST和BRIEF都是比较快速的特征计算方法,因此ORB具有非同一般的性能优势,算法实时性在移动端设备上有很好的应用。

ORB是FAST特征点的检测方法与BRIEF特征描述法的融合。

FAST也是检测图像中的角点,总的思路是:若某像素与其周围邻域内足够多的像素点相差较大,则该像素可能是角点(当然,FAST含有一些快速判断以及去除“伪”角点的子方法,以提高快速和准确性)。Opencv中提供了FAST函数,可以得到角点集合。

BRIEF于2010年提出,它是在每一个特征点的邻域内,选取n个点对,比如其中一个点对为p、q,比较它们像素的大小关系:如果p比q小,取1;反之取0,即其描述向量由n个0和1组成(二进制串)。关于p、q如何选取和选取的个数,算法提出者均有论述,如p、q可按均匀采样、随机采样、高斯分布采样等,其个数可取128,256和512。BRIEF建立速度比较快,同时也极大的降低了特征匹配的时间,但其缺点是对噪声敏感(因为二进制编码是通过比较具体像素值来判定的)以及不具备旋转不变性和尺度不变性。BRIEF在opencv的核心模块中未被支持,而是在扩展模块中xfeatures2d中被支持。

ORB对FAST的改进包括:

  1. 通过对原始图像的缩放,形成一系列图像(图像“金字塔”),为每张图像运用FAST。
  2. 在每个特征点,计算邻域内像素强度(“亮度”)的“质心”,“质心”与特征点的连线方向构成此特征点的方向。

措施1可以使算法具有一定的尺度不变性,措施2是为旋转不变性做准备的。

ORB对BRIEF的改进包括:

  1. 以小的区域块像素的平均值代替一个像素的值(上文中的p或q)
  2. 选取点后(上文中的p或q)绕特征点的方向(FAST的改进)旋转,由此,选取点关于特征点方向的相对位置是不变的,但关于特征点邻域的位置却变了。
  3. 如何选取(p,q)点对,没采用BRIEF中的5中方法,而采用所谓“rBRIEF”的方法,即统计查找所有(p,g)的选取方法中,相关性最小的若干组点对作为最终的(p,g)点对。

措施1可以增加抗干扰性,措施2可以增加旋转不变性,措施3使描述符尽量表达特征点的独特性,如果不同特征点的描述符的可区分性比较差,匹配时不容易找到对应的匹配点,引起误匹配。

Opencv中提供了ORB类,使用ORB的流程大致上是:构建(create函数)-> 检测,找出关键点集(detect函数)-> 对关键点进行计算,形成图像的特征描述符集(compute函数),后两步也可以合成一步(detectAndCompute函数),最后得到的是特征点的位置和特征点描述符向量。其中第一步设置ORB的参数是关键,ORB类构造的方法如下:

static Ptr<ORB> cv::ORB::create( 	int  	nfeatures = 500,float  scaleFactor = 1.2f,int  	nlevels = 8,int  	edgeThreshold = 31,int  	firstLevel = 0,int  	WTA_K = 2,ORB::ScoreType  	scoreType = ORB::HARRIS_SCORE,int  	patchSize = 31,int  	fastThreshold = 20 ) 

nfeatures:最多保留的特征点的数量;

scaleFactor:金字塔图像的尺度缩放参数,上一层图像的尺寸是下一层的(1/s)*(1/s)

nlevels:金字塔的层数;

edgeThreshold:边缘大小,靠近边缘edgeThreshold以内的像素是不检测特征点的,它大致与patchSize相等或大于patchSize。

firstLevel:将原始图像放在金字塔的第几层,即该层的上层或下层,被缩小或放大。

WET_K:用于产生BIREF描述符的点对的个数。

scoreType:使用FAST机制或者Harris corner机制来过滤特征点。

patchSize:用于计算BIREF描述符的特征点邻域大小。

fastThreshold:FAST算法提取特征点的阈值

五.SIFT

SIFT(Scale Invariant Feature Transform,尺度不变特征变换)是由加拿大教授David G.Lowe提出的,并申请了专利,该专利已在2020年到期。

历史上,SIFT特征和SURF特征都是非常常用的特征,SIFT特征以精确著称,但计算量大,无法在CPU上实时计算。SURF算法步骤与SIFT算法大致相同,但采用的方法不一样,降低了SIFT的精确度,但提高了性能,而ORB则适合于实时使用。在opencv中,SURF在扩展模块xfeatures2d中被支持。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

为理解SIFT,需要引入“尺度空间”的概念。尺度空间,是在信号长度不变的情况下,通过(高斯)平滑,获得信号在不同尺度下的表达,然后使用尺度对应大小的窗口进行观测和提取特征。因为获得了原始信号在所有尺度下的特征,这些特征在整体上做到了尺度无关——因为原始信号各种尺度的特征都有了。

对二维图像,尺度空间就是将图像的点I(x,y),经过不同σ作为参数的高斯核函数作用,而形成的一组图像,即

L(x,y, σ)=G(x,y, σ)*I(x,y),

上式中,L(x,y, σ)是尺度空间中某一σ尺度下在(x,y)点的像素值,I(x,y)为原始图像的在(x,y)的像素值,G(x,y, σ)为高斯核函数:

这样,以原始图像为最底层,按σ递增的顺序计算得到的一组L,此时按σ排列所形成的序列就是该图像的尺度空间表达,称为高斯金字塔(实际做法略有不同)。

从上面的公式,可以看出某点的最终像素值,是该点的像素值和周边像素值的加权平均值,权值就是高斯核函数,距离这点越远的像素值的权值越小,图像经过高斯核函数处理后,随着σ的增大,图像越模糊,相当于对图像做了低通滤波。

通常情况下,图像中物体的局部特征提取只有在一定的图像尺度下进行才有意义(例如在上面Harris角点检测中提到的某一尺寸下可以认为是角点,在放大后未必是角点),这个尺度称之为特征尺度。

为什么需要建立高斯金字塔?一般来讲,在没有先验知识的情况下,对两幅图像分别在每个尺度上检测关键点并提取特征,总有某些关键点及其特征正好来自相同的尺度,如果它们恰好可以匹配上,则图像1和图像2匹配,反之,如果所有关键点都配不上,则图像1和图像2不匹配。因此图像金字塔,是在保持观测窗口不变的情况下,获得输入图像在不同尺寸(分辨率)下的表达,在不同尺寸上提取到的特征在整体上做到了尺寸(分辨率)无关。

总结一下SIFT采取的措施,来实现旋转、尺度缩放、亮度变化等保持不变性的:

缩放:采用尺度空间,包含了所有的尺度下的特征

旋转:计算区域内的图像梯度方向,以主方向作为标准

亮度:特征向量有归一化,有一定的亮度变化无关性

SIFT算法可分为四步:

  1. 高斯(差分)金字塔(Difference of Gaussian, DOG)空间建立:为形成搜索不同尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
  1. σ是高斯正态分布的标准差,它可以控制邻域的大小,大致上3σ距离之外的像素都可以忽略其影响,因此邻域大小一般为(6σ+1)*(6σ+1),例如对5*5的邻域,σ=0.6。
  2. 如果m是高斯金字塔每组内的层数,则差分后层数变为m-1,可计算极值的层数为(m-1)-2,实际计算时(m-3)在3到5之间。
  3. 高斯金字塔的总组数n,最下层组一般扩采一次,然后是原图层组,再是降采层组,一般最小图像不小于16*16
  1. 尺度空间极值检测,特征点定位:找到每层属性的相对极值点,可作为候选的特征点,注意它是离散空间的极值点,采用Taylor插值,拟合到连续空间,去除低对比度的点,再去除不稳定的边缘响应点。
  2. 特征点方向计算:在特征点邻域完成像素梯度计算,使用直方图统计邻域内的梯度和方向,并分配到8个方向上,数量最多的是主方向。
  3. 特征点描述向量生成:对每个特征点,将坐标旋转到它的主方向,在邻域内计算像素梯度,Lowe建议在特征点周围4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征特征。

以上仅是对SIFT算法的简要说明,它确实比较复杂,详细的描述可参阅相关网上文章。

Opencv中提供了SIFT类(opencv早期版本放在contrib下,v4.4引入到features2d中),使用SIFT的流程与ORB是一样的(其实它们都继承相同的基类)。创建SIFT类的声明如下:

static Ptr<SIFT> cv::SIFT::create (int	nfeatures,int  	nOctaveLayers,double  	contrastThreshold,double  	edgeThreshold,double  	sigma,int  	descriptorType ) 

nfeatures:保留的最佳特性的数量(候选的特征点是有先后顺序的)。

nOctavelLayers:每组中图像的层数,组数可由图像的分辨率自动计算;

constrastThreshold:对比度阈值,在Taylor拟合后,对绝对值(DOG的差分值)过小的极值点,由于其稳定性较差应予以舍。对于[0,1]范围内的像素,Lowe建议该值取0.03。显然,阈值越大,产生的特征越少。在opencv中,真正应用的阈值是constrastThreshold/ nOctavelLayers。

edgeThreshold:用于过滤掉边缘响应的阈值。edgeThreshold越大,产生的特征越多;

sigma:σ,如果图像分辨率较低,则可能需要减少数值。

descriptorType:描述符数据结构,float或unsigned char

网上有文章对比了一下ORB,SURF,SIFT三个算法,建议在应用中,对时间有要求的,选用ORB,否则选用SURF。

相关文章:

opencv中的图像特征提取

图像的特征&#xff0c;一般是指图像所表达出的该图像的特有属性&#xff0c;其实就是事物的图像特征&#xff0c;由于图像获得的多样性&#xff08;拍摄器材、角度等&#xff09;&#xff0c;事物的图像特征有时并不特别突出或与无关物体混杂在一起&#xff0c;因此图像的特征…...

一文了解氨基酸的分类、代谢和应用

氨基酸&#xff08;Amino acids&#xff09;是在分子中含有氨基和羧基的一类化合物。氨基酸是生命的基石&#xff0c;人类所有的疾病与健康状况都与氨基酸有直接或间接的关系。氨基酸失衡可引起肝硬化、神经系统感染性疾病、糖尿病、免疫性疾病、心血管疾病、肾病、肿瘤等各类疾…...

Linux 系统安装Minio详细教程

一、&#x1f50d; MinIO 简介 MinIO 是一个高性能的对象存储服务&#xff0c;兼容 Amazon S3 接口&#xff0c;适用于大数据、AI、云原生等场景&#xff0c;支持分布式部署和高可用性&#xff0c;可作为轻量级的私有云对象存储解决方案。 二、&#x1f4e6; 安装准备 ✅ 系…...

排序算法-归并排序

归并排序是一种分治算法&#xff08;Divide and Conquer&#xff09;。对于给定的一组数据&#xff0c;利用递归与分治技术将数据序列划分成为越来越小的半子表&#xff0c;在对半子表排序后&#xff0c;再用递归方法将排好序的半子表合并成为越来越大的有序序列。 核心思想 分…...

js 两个数组中的指定参数(id)相同,为某个对象设置disabled属性

在JavaScript中&#xff0c;如果想要比较两个数组并根据它们的id属性来设置某个对象的disabled属性为true&#xff0c;你可以使用几种不同的方法。这里我将介绍几种常用的方法&#xff1a; 方法1&#xff1a;使用循环和条件判断 const array1 [{ id: 1, name: Item 1 },{ id…...

【Java基础】——集合篇

目标&#xff1a; 1.每个集合用的场景 2.每个集合的底层 一.概述 二. 三.Collection 1.通用方法 其中&#xff0c;contains方法&#xff0c;它的底层一定调用了equals方法进行比对&#xff0c;而且一定重写了equals方法&#xff0c;如果不重写equals方法&#xff0c;就是调用…...

小红书视频无水印下载方法

下载小红书&#xff08;RED/Xiaohongshu&#xff09;视频并去除水印可以通过以下几种方法实现&#xff0c;但请注意尊重原创作者版权&#xff0c;下载内容仅限个人使用&#xff0c;避免侵权行为。 方法一&#xff1a;使用在线解析工具&#xff08;推荐&#xff09; 复制视频链…...

代发考试战报:思科华为HCIP HCSE CCNP 考试通过

CCNP 300-410考试通过战报&#xff0c;HCIP云计算通过&#xff0c;HCIP数通 H12-821考试通过&#xff0c;H12-831考试通过&#xff0c;HCSP金融 H19-611考试通过&#xff0c;HCSE金融 H21-293 考试通过 报名考试一定要找正规报名&#xff0c;避免后续考试成绩被取消&#xff0…...

辉芒微离线烧录器“文件格式错误”问题解决

最近在使用辉芒微离线烧录器烧录程序时&#xff0c;提示“文件格式错误”&#xff0c;记录一下解决方法。 一、问题现象 经过多次尝试和排查&#xff0c;发现以下几种情况&#xff1a; 情况一&#xff1a;使用离线烧录器导入固件1&#xff08;boot程序&#xff09;&#xff0c…...

系统的从零开始学习电子的相关知识,该如何规划?

一、基础理论奠基&#xff08;6-12个月&#xff09; 1.1 数学与物理基础 核心内容&#xff1a; 微积分与线性代数&#xff08;高频电路建模必备&#xff09;复变函数与概率论&#xff08;信号处理与通信系统基础&#xff09;电磁场基础&#xff08;麦克斯韦方程组的物理意义&…...

网络研讨会开发注册中, 5月15日特励达力科,“了解以太网”

在线研讨会主题 Understanding Ethernet - from basics to testing & optimization 了解以太网 - 从基础知识到测试和优化 注册链接# https://register.gotowebinar.com/register/2823468241337063262 时间 北京时间 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 适宜…...

LSTM的简单模型

好的&#xff0c;我来用通俗易懂的语言解释一下这个 LSTMTagger 类是如何工作的。 1️⃣ 类的目的 这个 LSTMTagger 类是一个用于自然语言处理&#xff08;NLP&#xff09;任务的模型&#xff0c;目的是标注输入的句子&#xff0c;通常用于词性标注&#xff08;例如&#xff…...

聊聊Spring AI autoconfigure模块的拆分

序 本文主要研究一下Spring AI autoconfigure模块的拆分 v1.0.0-M6版本 (base) ➜ spring-ai-spring-boot-autoconfigure git:(v1.0.0-M6) tree -L 9 . ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ └…...

LVGL源码学习之渲染、更新过程(3)---绘制和刷写

LVGL版本&#xff1a;8.1 往期回顾&#xff1a; LVGL源码学习之渲染、更新过程(1)---标记和激活 LVGL源码学习之渲染、更新过程(2)---无效区域的处理 前文提到&#xff0c;在处理完无效区域后&#xff0c;会得到一个个需要重新绘制的对象&#xff0c;这些对象将在DRAW事件中…...

CTF-DAY11

[NSSRound#16 Basic]了解过PHP特性吗 题目&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match("/…...

手动修改uart16550的FIFO深度?

参考&#xff1a;修改AXI UART D16550 FIFO深度的过程记录 - lmore - 博客园...

Unity按钮事件冒泡

今天unity写程序时&#xff0c;我做了一个透明按钮&#xff0c;没图片&#xff0c;只绑了点击事件&#xff0c;把子对象文字组件也删了&#xff0c;空留一个透明按钮&#xff0c;此时运行时点击按钮是没有反应的&#xff0c;网上的教程说必须指定target graphic&#xff08;目标…...

基于Llama3的开发应用(一):Llama模型的简单部署

Llama模型的简单部署 0 前言1 环境准备1.1 硬件环境1.2 软件环境 2 Meta-Llama-3-8B-Instruct 模型简介2.1 Instruct含义2.2 模型下载 3 简单调用4 FastAPI 部署4.1 通过FastAPI简单部署4.2 测试 5 使用 streamlit 构建简易聊天界面6 总结 0 前言 本系列文章是基于Meta-Llama-…...

人工智能 机器学习期末考试题

自测试卷2 一、选择题 1&#xff0e;下面哪个属性不是NumPy中数组的属性&#xff08; &#xff09;。 A&#xff0e;ndim B&#xff0e;size C&#xff0e;shape D&#xff0e;add 2&#xff0e;一个简单的Series是由&#xff08; &#xff09;的数据组成的。 A&#xff0e;两…...

修改docker为国内源

一、编辑docker配置文件 vi /etc/docker/daemon.json二、配置国内源和修改docker数据目录 {"registry-mirrors":["http://hub-mirror.c.163.com","https://mirrors.tuna.tsinghua.edu.cn","http://mirrors.sohu.com","https://u…...

C++八股 —— vector底层

vector底层为动态数组 类构成 class vector : protected _Vector_base_Vector_base: _M_start&#xff1a;容器元素开始的位置_M_finish&#xff1a;容器元素结束的位置_M_end_of_storage&#xff1a;动态内存最后一个元素的下一个位置 构造函数 无参构造 根据性能优先规则&a…...

postgresql 参数wal_level

wal_level决定多少信息写入到 WAL 中。默认值是replica&#xff0c;它会写入足够的数据以支持WAL归档和复制&#xff0c;包括在后备服务器上运行只读查询。minimal会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录。最后&#xff0c;logical会增加支持逻辑解码所…...

Lightweight App Alternatives

The tech industry’s business model thrives on constant churn: new features, fancier designs, and heavier apps — not because they’re essential, but because they keep consumers upgrading. Stripping your phone back to basics is an act of tech self-defense.…...

SpringAI--基于MySQL的持久化对话记忆实现

SpringAI–基于MySQL的持久化对话记忆实现 项目源码 对话记忆官方介绍 SpringAI目前提供了一些将对话保存到不同数据源中的实现&#xff0c;比如: InMemoryChatMemory 基于内存存储CassandraChatMemory 在Cassandra中带有过期时间的持久化存储。Neo4jChatMemory 在Neo4j中没…...

【教学类-34-12】20250509(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+数字提示+参考图灰色)

背景介绍 制作了四款异形角拼图,初步实现效果 【教学类-34-10】20250503(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+参考图灰色)-CSDN博客文章浏览阅读1.4k次,点赞46次,收藏15次。【教学类-34-10】20250503(通义万相)4*3蝴蝶拼图(圆形、三角、正方、…...

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…...

Springboot+Vue+Mybatis-plus-Maven-Mysql项目部署

目录 VScode 1插件 2快捷键修改 3图标主题设置 4常用设置1 5设置自动换行 6颜色主题 7创建站点 8新建一个html文件 window系统设置 ps 1取色 2测量 3修改单位为像素 4放大图片 5拖动放大之后的图片 6文字大小测量 7测量文字的行高 8矩形选框切图1 9矩形选框…...

【C/C++】C++中noexcept的妙用与性能提升

文章目录 C中noexcept的妙用与性能提升1 什么情况下会抛出异常2 标记noexcept作用3 何时使用noexcept4 无异常行为标记场景5 一句话总结 C中noexcept的妙用与性能提升 在C中&#xff0c;noexcept修饰符用于指示函数不会抛出异常 1 什么情况下会抛出异常 在 C 中&#xff0c;异…...

增强学习(Reinforcement Learning)简介

增强学习&#xff08;Reinforcement Learning&#xff09;简介 增强学习是机器学习的一种范式&#xff0c;其核心目标是让智能体&#xff08;Agent&#xff09;通过与环境的交互&#xff0c;基于试错机制和延迟奖励反馈&#xff0c;学习如何选择最优动作以最大化长期累积回报。…...

如何优化系统启动时间--基于米尔瑞萨MYD-YG2LX开发板

1.概述 MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器&#xff0c;该处理器搭载双核Cortex-A551.2GHzCortex-M33200MHz处理器&#xff0c;其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元&#xff08;支持H.264硬件编解码&#xff09;,16位的DDR4-1600 / DDR3L-1333内…...

.Net HttpClient 概述

HttpClient 概述 作用 HttpClient是一个用于发送HTTP请求和接收HTTP响应的类。它提供了一种现代化、灵活和强大的方式来与Web服务进行通信。HttpClient类位于System.Net.Http命名空间下&#xff0c;可以通过NuGet包管理器进行安装。 整体理解 HttpClient是应用程序进程中&am…...

明远智睿SSD2351开发板:仪器仪表与智慧农业的创新利器

在仪器仪表和智慧农业领域&#xff0c;对设备的精度、稳定性和智能化程度有着较高的要求。明远智睿的SSD2351开发板以其独特的优势&#xff0c;成为这两个领域的创新利器。 在仪器仪表方面&#xff0c;SSD2351开发板的四核1.4GHz处理器能够快速处理仪器仪表采集到的各种数据&am…...

VBA -- 学习Day4

数组 创建数组&#xff1a; Dim 数组名&#xff08;数组元素上下角标&#xff09;[As 元素类型] eg. Dim MyArray (1 To 3) As Integer 注意&#xff1a;1.如果不指定元素类型&#xff0c;则是Variant类型 向数组赋值&#xff1a; eg. MyArray(1) 100 MyArray(2) 200…...

Nacos源码—7.Nacos升级gRPC分析四

大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 6.微服务实例信息如何同步集群节点 (1)服务端处理服务注册时会发布一个ClientChangedEvent事件 (2)ClientChangedEvent事件的处理源码 (3)集群节点处理数据同步请求的源码 (1)服务端处理服务注册…...

Linux 学习笔记2

Linux 学习笔记2 一、定时任务调度操作流程注意事项 二、磁盘分区与管理添加新硬盘流程磁盘管理命令 三、进程管理进程操作命令服务管理&#xff08;Ubuntu&#xff09; 四、注意事项 一、定时任务调度 操作流程 创建脚本 vim /path/to/script.sh # 编写脚本内容设置可执行权…...

一、每日Github软件分享----QuickGo外链直达工具​

QuickGo 是一款专注于提升网页浏览效率的浏览器扩展工具&#xff0c;其核心功能是自动绕过网站的安全跳转限制&#xff0c;让用户点击外链时无需手动确认&#xff0c;直接跳转至目标页面。以下是详细功能介绍与分析&#xff1a; 一、核心功能与亮点 极速跳转 通过优化浏览器 AP…...

【软件测试】软件缺陷(Bug)的详细描述

目录 一、软件缺陷(Bug) 1.1 缺陷的判定标准 1.2 缺陷的生命周期 1.3 软件缺陷的描述 1.3.1 提交缺陷的要素 1.3.2 Bug 的级别 1.4 如何发现更多的 Bug? 1.5 缺陷的有效管理 1.5.1 缺陷的编写 1.5.2 缺陷管理工具 1.5.2.1 缺陷管理 1.5.2.2 用例管理 一、软件缺陷…...

C++ stl中的list的相关函数用法

文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用&#xff0c;首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...

Cmd命令大全,从入门到放弃

1、文件和目录操作 dir /p:分页显示目录内容。 dir /w:以单行显示目录内容。 dir /s:显示指定目录及子目录下的所有文件。 dir /b:仅显示文件和目录名称。 dir /a:显示具有特定属性的文件和目录。 cd /d:改变当前驱动器。 pushd:将当前目录压入堆栈,并切换到指定…...

数据同步选择推Push还是拉Pull

数据同步选择“推”&#xff08;Push&#xff09;还是“拉”&#xff08;Pull”&#xff0c;要根据实际场景、系统架构和对实时性、资源消耗、安全性的需求来决定。下面是两种方式的对比分析&#xff0c;帮你更好地判断&#xff1a; 文章目录 推模式&#xff08;Push&#xff…...

Kafka集群加入新Broker节点会发生什么

Kafka集群加入新Broker节点会发生什么 当向现有的Kafka集群添加新的Broker节点时&#xff0c;会触发一系列自动和手动的过程。以下是详细的流程和影响&#xff1a; 自动发生的流程 集群发现与注册 新Broker启动时会向ZooKeeper注册自己加入集群的/brokers/ids路径下其他Broke…...

【LeetCode Solutions】LeetCode 176 ~ 180 题解

CONTENTS LeetCode 176. 第二高的薪水&#xff08;SQL 中等&#xff09;LeetCode 177. 第 N 高的薪水&#xff08;SQL 中等&#xff09;LeetCode 178. 分数排名&#xff08;SQL 中等&#xff09;LeetCode 179. 最大数&#xff08;中等&#xff09;LeetCode 180. 连续出现的数字…...

Sourcetree安装使用的详细教程

Sourcetree 是由 Atlassian 推出的 免费 Git 图形化客户端&#xff0c;支持 Git 和 Mercurial 仓库管理&#xff0c;适用于 Windows 和 macOS。 一、安装教程 1. 下载 官网地址&#xff1a;Sourcetree | Free Git GUI for Mac and Windows 选择你的平台下载安装包&#xff0…...

对比学习入门

Yann Lecun在NIPS 2016上提出了著名的“蛋糕比喻”&#xff1a;如果智能是一个蛋糕&#xff0c;蛋糕上的大部分是无监督学习&#xff08;unsupervised learning&#xff09;&#xff0c;蛋糕上的糖霜是监督学习&#xff08;supervised learning&#xff09;&#xff0c;而蛋糕上…...

Starrocks 的 ShortCircuit短路径

背景 本文基于 Starrocks 3.3.5 本文主要来探索一下Starrocks在FE端怎么实现 短路径&#xff0c;从而加速点查查询速度。 在用户层级需要设置 enable_short_circuit 为true 分析 数据流&#xff1a; 直接到StatementPlanner.createQueryPlan方法&#xff1a; ... OptExpres…...

Windows远程访问Ubuntu的方法

要在Windows上远程访问Ubuntu系统&#xff0c;以下是几种常见的方法&#xff1a; SSH (Secure Shell):通过Windows命令行远程连接到Ubuntu。 在Ubuntu上&#xff0c;确保安装并启用了SSH服务&#xff08;通常可以通过sudo apt update && sudo apt install openssh-serv…...

23种设计模式-行为型模式之模板方法模式(Java版本)

Java 模板方法模式&#xff08;Template Method Pattern&#xff09;详解 &#x1f9e0; 什么是模板方法模式&#xff1f; 模板方法模式是一种行为型设计模式&#xff0c;定义了一个操作中的算法骨架&#xff0c;将一些步骤的实现延迟到子类中。通过模板方法模式&#xff0c;…...

(undone) MIT6.S081 Lec17 VM for APP 学习笔记

url: https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec17-virtual-memory-for-applications-frans/17.1-ying-yong-cheng-xu-shi-yong-xu-ni-nei-cun-suo-xu-yao-de-te-xing 17.1 应用程序使用虚拟内存所需要的特性 今天的话题是用户应用程序使用的虚拟内存…...

值拷贝、浅拷贝和深拷贝

✅ 一、基本概念 1. 值拷贝&#xff08;Value Copy&#xff09; 含义&#xff1a;将一个变量的值完整复制到另一个变量中。 对象级别表现&#xff1a;调用的是拷贝构造函数&#xff08;copy constructor&#xff09;。 特点&#xff1a;对基本类型或不含动态资源的对象&…...

JWT原理及工作流程详解

JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间安全传输信息。其核心原理是通过结构化、签名或加密的JSON对象实现无状态身份验证和授权。以下是JWT的工作原理和关键组成部分&#xff1a; 1. JWT结构 J…...