YOLOv3-YOLOv8的一些总结
0 写在前面
这个文档主要总结YOLO系列的创新点,以YOLOv3为baseline。参考(抄)了不少博客,就自己看看吧。有些模型的trick不感兴趣就没写进来,核心的都写了。
YOLO系列的网络都由四个部分组成:Input、Backbone、Neck、Prediction head。
- Input:主要是在训练开始之前进行resize、数据增强等操作,不同的YOLO在数据增强方面也有很多改进。在测试阶段则只会进行resize。其中resize操作中,先将图像进行灰度值填充成正方形,再resize等比缩放,常用的尺寸为640 * 640,这个值越大,模型预测的越准确,但消耗的显存越大。
- Backbone:主要对图像进行下采样。在YOLOv3以后的网络都会在BackBone不同的深度经过Neck层拿到3种深度的特征图。一般会进行5次下采样(好像),所以输入的图像的宽高会被resize成32的倍数。YOLO的思想是把图像经过下采样,将图像划分成 S * S 个区域,每个区域由对应的节点进行预测框的生成。
- Neck:与Backbone配合,取3种深度/尺寸的特征图。拿416 * 416的图为例,最底层为13 * 13相当于把原图划分成13 * 13个区域,因为深度最深,所以感受野最大,利于大目标的检测,其他的尺度类似。
- Prediction Head:基于Neck层取到的特征图进行预测框的生成,每一个节点负责对应小区域的预测框生成,每个预测框包括预测框位置与大小、置信度、分类结果。例如在YOLOv3中13 * 13 * 255,13 * 13是区域,255=3 * (4 + 1 + 80),其中3表示会基于3种锚框进行预测,4为预测框的位置(中心点坐标、宽高),1为置信度,80为分类结果(COCO数据集有80个类)。在YOLO系列中有anchor based和anchor free两种方法。
1 YOLOv3(Anchor based)
1.1 动机
YOLOv3借鉴了FPN的方法,采用多尺度的特征图对不同大小的物体进行检测,以提升小物体的预测能力。例如输入416X416的图像,则会得到13 * 13 (416/32),26 * 26(416/16) 以及52 * 52(416/8)这3个尺度的特征图。
1.2 值得注意的地方
-
Backbone使用Darknet53,其中包括残差卷积,每一次卷积的时候进行L2正则化,完成卷积后进行BN与LeakyReLU激活。
-
置信度部分则继续沿用v1v2中的IoU作为标签,IoU的表达式如下:
I o U = A ∩ B A ∪ B IoU=\frac{A \cap B}{A \cup B} IoU=A∪BA∩B -
使用anchor based方法生成预测框(其实是YOLOv2就有的)。在训练开始前基于训练集所有的ground-truth利用k-means进行聚类,得到9个聚类中心/锚框(anchor boxes,也有叫先验框的)。9个锚框被分成3组分别用于三种深度的Prediction Head锚框的中心点位置为每个网格的中心点。9种锚框的尺寸随着不同的数据集而变化。
由Prediction Head生成框的位置与尺寸结果 [ t x , t y , t w , t h ] [t_x, t_y, t_w, t_h] [tx,ty,tw,th] 还需要基于锚框进行解码映射,计算过程如下:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h b_x=\sigma(t_x) + c_x \\ b_y=\sigma(t_y) + c_y \\ b_w=p_we^{t_w} \\ b_h=p_he^{t_h} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
其中 c x , c y c_x, c_y cx,cy 代表网格的左上角距离最左上角相差的格子数, p w , p h p_w, p_h pw,ph 代表锚框的宽高, t x , t y t_x, t_y tx,ty 代表目标中心点到网格左上角顶点的偏移量, t w , t h t_w, t_h tw,th 代表宽高偏移量, [ b x , b y , b w , b h ] [b_x, b_y, b_w, b_h] [bx,by,bw,bh] 即为最终的预测框。图解如下: -
使用非极大值抑制(Non_max Suppression, NMS)对重叠过高的框进行筛选,NMS对不同类别的框分开操作。以单独类举例,首先将框按照置信度降序排序构建集合H,并建造一个存放最优框的集合M,初始化为空集。每次在集合H取最高置信度的框,跟同类别其他的框计算IoU,如果IoU超过一定的阈值则抛弃后取出的框,遍历结束则将最高置信度的框放入集合M,接着循环这个操作,直到集合H为空集。集合M中所有的框即为最优检测结果。
-
YOLO系列的损失函数都由三个大部分构成,即框位置与尺寸误差、置信度误差、分类误差。
L o s s = L o b j + L c o n + L c l s Loss=L_{obj}+L_{con}+L_{cls} Loss=Lobj+Lcon+Lcls
具体一点可以分为box的中心点误差、框尺寸误差、置信度误差、不存在box时置信度误差、分类的误差。YOLOv3的损失函数如下:
L o s s = − λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ x ^ i j log ( x i j ) + ( 1 − x ^ i j ) log ( 1 − x i j ) + y ^ i j log ( y i j ) + ( 1 − y ^ i j ) log ( 1 − y i j ) ] + λ c o o r d 1 2 ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i j − w ^ i j ) 2 + ( h i j − h ^ i j ) 2 ] − ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ C ^ i j log ( C i j ) + ( 1 − log C ^ i j ) log ( 1 − C i j ) ] − λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j [ C ^ i j log ( C i j ) + ( 1 − C ^ i j ) log ( 1 − C i j ) ] − ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ∑ c ∈ c l a s s s e s [ P ^ i , c j log ( P i , c j ) + ( 1 − P ^ i , c j ) log ( 1 − P i , c j ) ] Loss=-\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[\hat{x}_i^j\log{(x_i^j)} + (1-\hat{x}_i^j)\log{(1-x_i^j)} + \hat{y}_i^j\log{(y_i^j)}+(1-\hat{y}_i^j)\log{(1-y_i^j)} \right] \\ +\lambda_{coord}\frac{1}{2}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[(w_i^j-\hat{w}_i^j)^2 +(h_i^j-\hat{h}_i^j)^2 \right] \\ -\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[\hat{C}_i^j\log{(C_i^j)+(1-\log{\hat{C}_i^j})\log{(1-C_i^j)}} \right] \\ -\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{noobj}\left[\hat{C}_i^j\log{(C_i^j)}+(1-\hat{C}_i^j)\log{(1-C_i^j)} \right] \\ -\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\sum_{c\in{classses}}\left[\hat{P}_{i,c}^j\log{(P_{i,c}^j)}+(1-\hat{P}_{i,c}^j)\log{(1-P_{i,c}^j)} \right] Loss=−λcoordi=0∑S2j=0∑BIijobj[x^ijlog(xij)+(1−x^ij)log(1−xij)+y^ijlog(yij)+(1−y^ij)log(1−yij)]+λcoord21i=0∑S2j=0∑BIijobj[(wij−w^ij)2+(hij−h^ij)2]−i=0∑S2j=0∑BIijobj[C^ijlog(Cij)+(1−logC^ij)log(1−Cij)]−λnoobji=0∑S2j=0∑BIijnoobj[C^ijlog(Cij)+(1−C^ij)log(1−Cij)]−i=0∑S2j=0∑BIijobjc∈classses∑[P^i,cjlog(Pi,cj)+(1−P^i,cj)log(1−Pi,cj)]- 中心点误差
L o s s = − λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ x ^ i j log ( x i j ) + ( 1 − x ^ i j ) log ( 1 − x i j ) + y ^ i j log ( y i j ) + ( 1 − y ^ i j ) log ( 1 − y i j ) ] Loss=-\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[\hat{x}_i^j\log{(x_i^j)} + (1-\hat{x}_i^j)\log{(1-x_i^j)} + \hat{y}_i^j\log{(y_i^j)}+(1-\hat{y}_i^j)\log{(1-y_i^j)} \right] Loss=−λcoordi=0∑S2j=0∑BIijobj[x^ijlog(xij)+(1−x^ij)log(1−xij)+y^ijlog(yij)+(1−y^ij)log(1−yij)]
I i j o b j I_{ij}^{obj} Iijobj 表示该预测框是否负责检测目标物体, ( x i j , y i j ) (x_i^j,y_i^j) (xij,yij) 为预测框中心点坐标, ( x ^ i j , y ^ i j ) (\hat{x}_i^j,\hat{y}_i^j) (x^ij,y^ij) 为ground-truth中心点坐标, λ c o o r d \lambda_{coord} λcoord 为权重系数。总体为交叉熵的形式。正例由NMS得到。
- 框尺寸误差
λ c o o r d 1 2 ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i j − w ^ i j ) 2 + ( h i j − h ^ i j ) 2 ] \lambda_{coord}\frac{1}{2}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[(w_i^j-\hat{w}_i^j)^2 +(h_i^j-\hat{h}_i^j)^2 \right] λcoord21i=0∑S2j=0∑BIijobj[(wij−w^ij)2+(hij−h^ij)2]
( w i j , h i j ) (w_i^j,h_i^j) (wij,hij) 为预测框宽高, ( w ^ i j , h ^ i j ) (\hat{w}_i^j,\hat{h}_i^j) (w^ij,h^ij) 为ground-truth宽高。总体为欧几里得距离的形式。
- 置信度误差
− ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ C ^ i j log ( C i j ) + ( 1 − log C ^ i j ) log ( 1 − C i j ) ] − λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j [ C ^ i j log ( C i j ) + ( 1 − C ^ i j ) log ( 1 − C i j ) ] -\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\left[\hat{C}_i^j\log{(C_i^j)+(1-\log{\hat{C}_i^j})\log{(1-C_i^j)}} \right] \\ -\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{noobj}\left[\hat{C}_i^j\log{(C_i^j)}+(1-\hat{C}_i^j)\log{(1-C_i^j)} \right] −i=0∑S2j=0∑BIijobj[C^ijlog(Cij)+(1−logC^ij)log(1−Cij)]−λnoobji=0∑S2j=0∑BIijnoobj[C^ijlog(Cij)+(1−C^ij)log(1−Cij)]
C i j C_i^j Cij 为置信度,即预测框内含目标物体的概率得分, C ^ i j \hat{C}_i^j C^ij 为真实值, I i j n o o b j = 1 − I i j o b j I_{ij}^{noobj}=1-I_{ij}^{obj} Iijnoobj=1−Iijobj 。公式的后者为负例产生的loss,负例为与所有ground-truth的IoU均小于0.5的框,负样例只对置信度产生loss的贡献,置信度的标签均为0。除了正例和负例,还有忽略样例,不对loss产生任何贡献。忽略样例为除正例外与任意一个ground-truth的IoU大于0.5的框。
- 分类损失
− ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ∑ c ∈ c l a s s s e s [ P ^ i , c j log ( P i , c j ) + ( 1 − P ^ i , c j ) log ( 1 − P i , c j ) ] -\sum_{i=0}^{S^2}\sum_{j=0}^{B}I_{ij}^{obj}\sum_{c\in{classses}}\left[\hat{P}_{i,c}^j\log{(P_{i,c}^j)}+(1-\hat{P}_{i,c}^j)\log{(1-P_{i,c}^j)} \right] −i=0∑S2j=0∑BIijobjc∈classses∑[P^i,cjlog(Pi,cj)+(1−P^i,cj)log(1−Pi,cj)]
对每个类别和每个框与真实框做交叉熵。
2 YOLOv4(Anchor based)
整体感觉YOLOv4就是堆trick和调参的结果,没提出自己的东西。
2.1 创新点
-
Input:训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练。
- Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
- cmBN把大batch内部的4个mini batch当做一个整体进行BN(大概,不太关心这种改动),主要改变在于BN层的统计量计算方面。
- SAT自对抗训练主要目标是通过改变输入图像,使得网络难以识别,从而迫使网络提高泛化性能。(不太关心)
-
Backbone:使用CSPDarknet53、Mish激活函数、Dropblock。
- CSPDarknet53中的最小组件是CBM,由Conv+BN+Mish组成。
- Mish激活函数:ReLU 和 Mish 的对比,Mish 的梯度更平滑。表达式与图像如下:
f ( x ) = x ∗ tanh ( ln ( 1 + e x ) ) f(x)=x*\tanh{(\ln(1+e^x))} f(x)=x∗tanh(ln(1+ex))
-
Dropblock:在卷积的过程中随机丢弃一些块的图像信息。池化层本身就是对相邻单元起作用,随机丢弃信息后卷积层仍然可以从相邻的激活单元学习到相同的信息。这样做是为了缓解过拟合。
-
Neck:SPP模块和FPN+PAN结构。
- SPP模块:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
-
FPN+PAN结构:抄的是18年CVPR的PANet,当时主要应用于图像分割领域。FPN层自顶向下传达强语义特征,而PAN则自底向上传达强定位特征。
原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而YOLOv4中则采用concat操作,特征图融合后的尺寸发生了变化。(效果好才这样的吧,笑)
-
Prediction Head:与YOLOv3相同,训练时框的位置损失用的CIoU_Loss,NMS用的是DIoU。关于不同的IoU有怎样的特点与不适用于怎样的场景网上有很多,这东西能写很长,我以前在论文里也提到过,懒得写,随便找找别的博客看看吧(逃。
3 YOLOv5(Anchor based)
YOLOv5整体跟YOLOv4很相似,可以看成在YOLOv4的基础上改的,属于狂堆trick的产物。
3.1 创新点
-
Input:自适应图片缩放。之前的resize方式是先将图片利用灰度值填充至正方形,再resize成416 * 416等尺寸。YOLOv5的作者认为这样做太慢了,而且填多了则会产生大量冗余信息,所以提出了自适应图片缩放。假设我现在有一张800 * 600的图片,需要resize成416 * 416的。步骤如下:
- 计算两个维度上的缩放比例,416/800=0.52,416/600=0.69,选小的先进行resize,得到416*312的图。
- 之后再进行灰度值填充至416 * 416。
-
Backbone:采用CSPNet,在CSPNet之前提出一种Focus结构。
- CSPNet:最小组件CSP结构,感觉没啥好说的,他效果好他有理。
- Focus:对图片进行切片(slice)操作,具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了四张图片,这样就在没丢失信息的情况下扩充了特征图量。YOLOv5中的Focus先切片,通道数变为12,再利用1 * 1卷积再次扩充通道数至32。(感觉会丢失小目标的特性信息,后面的模型都没用这个trick了)
-
Neck:依旧沿用YOLOv4的FPN+PAN结构。(FPN是金字塔层级结构,PAN是利用浅层特征信息对深层特征信息的补充)
-
Prediction Head:计算预测框损失的时候改用GIoU_Loss,懒得过多解释。利用不同的IoU对NMS也做了一点改进,好像就是用CIoU和DIoU加权改进的。YOLOv5还改了预测框回归计算公式。
-
之前的回归公式中宽和高的映射关系由于存在exp的操作,可能导致梯度过大不稳定,不利于训练,YOLOv5的预测框回归计算公式:
b x = 2 σ ( t x ) − 0.5 + c x b y = 2 σ ( t y ) − 0.5 + c y b w = p w ( 2 σ ( t w ) 2 ) b h = p h ( 2 σ ( t h ) 2 ) b_x=2\sigma(t_x)-0.5+c_x \\ b_y=2\sigma(t_y)-0.5+c_y \\ b_w=p_w(2\sigma(t_w)^2) \\ b_h=p_h(2\sigma(t_h)^2) bx=2σ(tx)−0.5+cxby=2σ(ty)−0.5+cybw=pw(2σ(tw)2)bh=ph(2σ(th)2)
其中 c x , c y c_x, c_y cx,cy 代表网格的左上角距离最左上角相差的格子数, p w , p h p_w, p_h pw,ph 代表锚框的宽高, t x , t y t_x, t_y tx,ty 代表目标中心点到网格左上角顶点的偏移量, t w , t h t_w, t_h tw,th 代表宽高偏移量, [ b x , b y , b w , b h ] [b_x, b_y, b_w, b_h] [bx,by,bw,bh] 即为最终的预测框。图解如下:
-
4 YOLOv6(Anchor free)
美团开发的模型,抄了YOLOv5和YOLOX。有点搞笑的是,现在YOLOv6的github仍然在维护,甚至在YOLOv7和v8出来之后,又把他们比下去了,乐。但似乎也就嘴硬,YOLOv7的引用量已经四位数了,而YOLOv6才三位数。
4.1 创新点
-
Input:跟YOLOv5差不多,但是没用Focus。(发现端倪)
-
Backbone:设计了EfficientRep,见下图,相比于 YOLOv5 采用的CSP-Backbone,该 Backbone 能够高效利用硬件(如 GPU)算力的同时,还具有较强的表征能力。(他们在博客里这么说的)
将Backbone中stride=2的普通Conv替换成了stride=2的RepConv。同时,将原始的CSP-Block都重新设计为 RepBlock,其中RepBlock的第一个RepConv会做channel维度的变换和对齐。还将原始的SPPF优化设计为更加高效的SimSPPF。好像是他们发现Inception结构比单路径网络分类效果好,但Inception结构并行性降低耗时。他们在训练的时候用(a)结构,推理的时候则用(b)结构。
-
Neck:YOLOv6的颈部被表示为Rep-PAN。Rep-PAN基于PAN拓扑方式,用RepBlock替换了YOLOv5中使用的CSP-Block,同时对整体Neck中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力。(这个结构有点像EfficientDet?)
-
Prediction Head:解耦头(Decoupled head)、Anchor free、SimOTA、SIoU 边界框回归损失。(看起来改了很多地方,实则前三个都是YOLOX里面的,今天少点一份外卖,笑)
-
**解耦头(Decoupled head)**就是把分类任务与置信度+框位置尺寸分成两个分支,这一概念最早由YOLOX的作者提出,他们就是小改了一下。
-
Anchor free:对于Anchor based方法,需要对数据集进行k-means聚类生成9个锚框,说实话这种方法就像打CSGO用鼠标宏压枪一样(雾),像挂又不是挂。Anchor free也是YOLOX先用的,主要是速度快。
-
SimOTA:这个也是YOLOX先用的,用于区分正负样本,此前的模型都是用IoU判的。步骤如下:
①计算成对预测框与ground-truth代价,由分类及回归loss构成;
②计算前k小个loss对应的预测框与ground-truth的IoU,其和为Dynamic k(需要向下取整);因此对于不同真值框,其Dynamic k存在差异;
③最后选择代价最小的前Dynamic k个预测框作为正样本。
-
SIoU 边界框回归损失:这个之前看过,没看懂,现在看又没看懂,看啥时候把这个坑填上吧。(逃
还有一些杂七杂八的改进,主要用于工业界处理,不细讲了。
-
5 YOLOv7(Anchor based)
图从YOLOv7网络结构图拿的,画的好啊!
YOLOv7是基于YOLOv5改的,跟YOLOv6不是一个团队,同规模乱杀,能锤YOLOv8说是。Trick略多。。。
5.1 创新点
-
Input:好像并无变化。
-
Backbone:ELAN、MP、RepVGG。
-
在原ELAN架构上提出**E-ELAN(extended ELAN)**用于改进Backbone。E-ELAN只改变了计算块的架构,而过渡层的架构完全没有改变,其作用是引导不同组的计算块学习更多样化的特征。ELAN结构采用组卷积来扩展计算块的通道数和基数。
-
MP模块,主要由Maxpool和CBS组成。MP模块主要对特征图进行下采样与扩充通道数,大概的作用就是将FPN的浅层特征通过下采样与深层特征进行融合,以扩充深层特征的信息量。
-
RepVGG:在Prediction Head出现,主要表现为训练和推理的时候使用不同的网络结构,即训练的时候使用多流结构推理的时候将分支的参数重参数化到主分支上。(感觉这样只是为了加速推理速度)
RepConv中的identity-connection破坏了ResNet中的残差和DenseNet中的拼接,为不同的特征映射提供了更多的梯度多样性。作者使用without identity connection的**RepConvN (RepConv without identity connection)**来设计计划重参数化模型的体系结构,见下图:
-
-
模型缩放:模型缩放的主要目的是调整模型的某些属性,并生成不同比例的模型,以满足不同推理速度的需要(像YOLOv5和YOLOX)。作者提出了一种复合模型方法,在考虑计算模块深度因子缩放的同时也考虑过渡层宽度因子做同等量的变化。当对连接结构的网络进行尺度缩放时,只缩放计算块的深度,转换层的其余部分只进行宽度的缩放。
-
Prediction Head:深度监督、标签分配策略。
-
深度监督:在网络的中间层增加额外的Auxiliary head,以及以Auxiliary损失为导向的浅层网络权值,图5(b)。将负责最终输出的head为Lead head,用于辅助训练的head称为Auxiliary head。
-
标签分配策略:与其他YOLO系列基于ground-truth的IoU分配soft label不同,本文将网络预测结果与基本事实一起考虑,提出两种soft label分配机制,Lead guided assigner(图5d)与Coarse-to-fine lead guided assigner(图5e)。目前的基操是独立标签匹配结构,将Auxiliary head和Lead head分离,然后使用它们自己的预测结果和真实标签来进行标签分配。
-
Lead guided assigner:主要基于Lead head的预测结果和ground-truth来计算,并通过优化过程生成soft label。这组soft label将用作Auxiliary head和Lead head的训练。(看的别人的博客,我也没明白,留个坑)
-
Coarse-to-fine lead guided assigner:在这个过程中生成了两组不同的soft label,即粗标签和细标签。细标签与Lead head在标签分配器上生成的soft label相同;粗标签是通过放宽认定positive target的条件生成的,也就是允许更多的grids作为positive target。(没看代码,晕的)
-
-
6 YOLOv8(Anchor free)
YOLOv8是基于YOLOv5改进的,没改多少东西,把YOLOX的解耦头、Anchor free抄过来了。本身是更侧重于实用,trick不多,甚至没找到论文。
4.1 创新点
-
Input:学YOLOX在训练的最后10个epoch关闭Mosiac,猛涨点。
-
Backbone:将YOLOv5的C3结构换成了梯度流更丰富的C2F结构,并对不同尺度模型调整了不同的通道数,像是调参的产物,都给我调!
-
Neck:无。
-
Prediction Head:解耦头、Anchor free、Distribution Focal Loss、TaskAlignedAssigner。
-
解耦头:似乎把置信度丢了,两个分支为分类分支与回归分支。分类的损失函数用的交叉熵。回归的损失函数用的CIOU_Loss+Distribution Focal Loss。
-
Distribution Focal Loss:不懂,但是尊重,留个坑。[DFL](大白话 Generalized Focal Loss - 知乎 (zhihu.com))
-
TaskAlignedAssigner:根据分类与回归的分数加权的分数选择正样本。分数公式为:
t = s α × μ β t=s^{\alpha} \times \mu^{\beta} t=sα×μβ
s s s 是标注类别对应的预测分值, μ \mu μ 是预测框与ground-truth的IoU。首先对于每个ground-truth计算对应类别的所有预测框的分数alignment_metrics。对于每个ground-truth基于alignment_metrics选取最大TopK大的分数对应的预测框作为正样本。
-
相关文章:
YOLOv3-YOLOv8的一些总结
0 写在前面 这个文档主要总结YOLO系列的创新点,以YOLOv3为baseline。参考(抄)了不少博客,就自己看看吧。有些模型的trick不感兴趣就没写进来,核心的都写了。 YOLO系列的网络都由四个部分组成:Input、Backbone、Neck、Prediction…...
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、公共属性 常用的公共属性有: 宽(with)、高(height)、…...
最新同步云盘推荐:实现轻松管理与便捷同步的理想选择
同步云盘——可以轻松管理文件,同步不同设备之间的文件,受到了许多用户的青睐!目前国内有什么值得推荐的同步云盘? Zoho Workdrive同步云盘,助您轻松管理文件,进行多设备同步,便捷使用文件&…...
(第27天)Oracle 数据泵转换分区表
在Oracle数据库中,分区表的使用是很常见的,使用数据泵也可以进行普通表到分区表的转换,虽然实际场景应用的不多。 创建测试表 sys@ORADB 2022-10-13 11:54:12> create table lucifer.tabs as select * from dba_objects;Table created.sys...
业务上需要顺序消费,怎么保证时序性?
消息传输和消费的有序性,是消息队列应用中一个非常重要的问题,在分布式系统中,很多业务场景都需要考虑消息投递的时序。例如,电商中的订单状态流转、数据库的 binlog 分发,都会对业务的有序性有要求。今天我们一起来看…...
ubuntu 开机提示 you are in emergency mode,journalctl -xb
进入系统界面 回车输入: journalctl -xb -p3 查看出问题的盘符类型。 然后 lsblk 查看挂载情况 我的是/dev/sda3没有挂载上,对应/home目录,注意这时候不要直接mount 需要先修复 fsck -y /dev/sda3等待修复完成,在重新挂载 moun…...
【Hadoop面试】HDFS读写流程
HDFS(Hadoop Distributed File System)是GFS的开源实现。 HDFS架构 HDFS是一个典型的主/备(Master/Slave)架构的分布式系统,由一个名字节点Namenode(Master) 多个数据节点Datanode(Slave)组成。其中Namenode提供元数…...
B01、JVM与Java体系结构-01
字节码与多语言混合编程 字节码概述: 我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器,可以编译出相同的字节码文件&…...
Python:Jupyter
Jupyter是一个开源的交互式计算环境,由Fernando Perez和Brian Granger于2014年创立。它提供了一种方便的方式来展示、共享和探索数据,并且可以与多种编程语言和数据格式进行交互。Jupyter的历史可以追溯到2001年,当时Fernando Perez正在使用P…...
macos苹果电脑开启tftp server上传fortigate60e固件成功
cat /System/Library/LaunchDaemons/tftp.plist<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist…...
如何使用ArcGIS Pro裁剪影像
对影像进行裁剪是一项比较常规的操作,因为到手的影像可能是多种范围,需要根据自己需求进行裁剪,这里为大家介绍一下ArcGIS Pro中裁剪的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的影像和行政区…...
Tekton 构建容器镜像
Tekton 构建容器镜像 介绍如何使用 Tektonhub 官方 kaniko task 构建docker镜像,并推送到远程dockerhub镜像仓库。 kaniko task yaml文件下载地址:https://hub.tekton.dev/tekton/task/kaniko 查看kaniko task yaml内容: 点击Install&…...
netty-daxin-4(httpwebsocket)
文章目录 学习链接http服务端NettyHttpServerHelloWorldServerHandler 客户端ApiPost websocket初步了解为什么需要 WebSocket简介 浏览器的WebSocket客户端客户端的简单示例客户端的 APIWebSocket 构造函数webSocket.readyStatewebSocket.onopenwebSocket.onclosewebSocket.ο…...
文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《市场环境下考虑全周期经济效益的工业园区共享储能优化配置》
这个标题涉及到工业园区中共享储能系统的优化配置,考虑了市场环境和全周期经济效益。以下是对标题中各个要素的解读: 市场环境下: 指的是工业园区所处的商业和经济背景。这可能包括市场竞争状况、电力市场价格波动、政策法规等因素。在这一环…...
WPF——命令commond的实现方法
命令commond的实现方法 属性通知的方式 鼠标监听绑定事件 行为:可以传递界面控件的参数 第一种: 第二种: 附加属性 propa:附加属性快捷方式...
信息收集 - 域名
1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…...
基于YOLOv8深度学习的路面标志线检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
leetCode算法—1.两数之和
难度:* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你…...
oracle 设置访问白名单
有相关安全策略会要求部分 ip 禁止访问oracle数据库,那么如何实现对IP的白名单设置呢?又如何细分到对用户的限制访问呢?本文将介绍方法给大伙。 1、禁止IP访问数据库(修改sqlnet.ora方式实现) vi $ORACLE_HOME/network…...
Flink系列之:窗口关联
Flink系列之:窗口关联 一、窗口关联二、INNER/LEFT/RIGHT/FULL OUTER三、SEMI四、ANTI五、限制 一、窗口关联 适用于流、批窗口关联就是增加时间维度到关联条件中。在此过程中,窗口关联将两个流中在同一窗口且符合 join 条件的元素 join 起来。窗口关联…...
Eolink 两项产品入选 2023 年广东省名优高新技术产品名录!
近日,2023 年广东省名优高新技术产品正式名单已经发布,Eolink 旗下两项产品荣幸入选! “广东省名优高新技术产品”是广东省对高新技术产品领域的升级和优化的重要措施。名优产品的评选不仅强调了技术的先进性,更对产品的质量、市…...
054:vue工具 --- BASE64加密解密互相转换
第054个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…...
自动驾驶学习笔记(二十)——Planning算法
#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 参考线平滑 双层状态机 EM Planner …...
adb的使用
Adb windows 环境搭建 (1)将adb包安装或者解压到一个路径,并拿到adb.exe所在的路径值,例如,D:\Tools\adb (2)将路径值放进windows环境变量 我的电脑(此电脑图标)右键–》 选择“属…...
会旋转的树,你见过吗?
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...
Azure Machine Learning - 提示工程简介
OpenAI的GPT-3、GPT-3.5和GPT-4模型基于用户输入的文本提示工作。有效的提示构造是使用这些模型的关键技能,涉及到配置模型权重以执行特定任务。这不仅是技术操作,更像是一种艺术,需要经验和直觉。本文旨在介绍适用于所有GPT模型的提示概念和…...
服务器的安全包括哪些方面?服务器安全该如何去加固处理?
服务器安全包括如下几个方面: 系统安全:包括操作系统的安全性、系统的漏洞和补丁管理、用户管理、文件权限和访问控制等。 网络安全:包括网络拓扑结构、网络设备的安全性、网络协议的安全性、防火墙和入侵检测等。 数据安全:包括数…...
为什么在Android中需要Context?
介绍 在Android开发中,Context是一个非常重要的概念,但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念,并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…...
AIGC实战——条件生成对抗网络(Conditional Generative Adversarial Net, CGAN)
AIGC实战——条件生成对抗网络 0. 前言1. CGAN架构2. 模型训练3. CGAN 分析小结系列链接 0. 前言 我们已经学习了如何构建生成对抗网络 (Generative Adversarial Net, GAN) 以从给定的训练集中生成逼真图像。但是,我们无法控制想要生成的图像类型,例如控…...
高性能计算HPC与统一存储
高性能计算(HPC)广泛应用于处理大量数据的复杂计算,提供更精确高效的计算结果,在石油勘探、基因分析、气象预测等领域,是企业科研机构进行研发的有效手段。为了分析复杂和大量的数据,存储方案需要响应更快&…...
医疗网站建设计划书/长沙互联网推广公司
一般都是这么写: ifneq ($(KERNELRELEASE),) obj-m : else KERNELDIR ? /lib/modules/$(shell uname -r)/build PWD : $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M$(PWD) modules endif 这个makefile会用到两次。 第一次make的时候,KERNELR…...
网站建设在微信里打广告内容/哪些平台可以做推广
为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵。时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的。选来选去还是Python适合现…...
学校网站建设的申请/南昌企业网站建设
基于SSMMavenBootStrapMySQL的在线商城系统[实战视频]—304人已学习 课程介绍 本课程基于MavenSpringSpringMVCMyBatisMySQLBootStrap技术,使用IntelliJ IDEA开发工具。 主要是锻炼SSM技术的运用,通过项目实战,加强对框架技术的理解和运用…...
婚纱摄影的网站怎么做/seo技术培训机构
1.配置Java环境变量 首先进入到终端 输入 vi ~/.bashrc然后输入 i 插入数据 export JAVA_HOME/usr/lib/jvm/jdk15.0.2 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/bin:$PATH输入esc 然后 :wq 退出 最后输…...
网页制作第一步/seo目标关键词优化
前言 其实,在服务器的安全设置方面,我虽然有一些经验,但是还谈不上有研究,所以我写这篇文章的时候心里很不踏实,总害怕说错了会误了别人的事。 本文更侧重于防止ASP漏洞***,所以服务器防黑等方面的讲解可能…...
17zwd一起做网站官网/灰色广告投放平台
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的…...