论文标题:《Oriented RepPoints for Aerial Object Detection Wentong》
论文发表:CVPR2022
论文链接:http://openaccess.thecvf.com
1 | @inproceedings{li2022oriented, |
Name | Value |
---|---|
标签 | #旋转目标检测 #标签分配 |
数据集 | #DOTA #HRSC2016 #UCAS-AOD #DIOR-R |
目的 | 设计面向航拍图像的旋转目标检测器 |
方法 | 基于RepPoint实现 |
作者提到航拍图像中目标具有非水平,任意方向,密集分布,背景复杂等困难,主流的方法大多将其视为简单的旋转目标检测问题。其中基于角度回归的方法最受欢迎,然而这种增加了角度预测的方法会面临损失的不连续性以及回归的不一致性问题。这是因为角度的有界周期性和旋转框的方向定义造成的。因此为了避免这种问题,一些方法重新定义了目标旋转框的表示方法。例如,基于点集表示的方法RepPoints可以捕获关键的语义特征。但是这种简单的转换函数只产生垂直-水平边界框,无法精确估计航拍图像中旋转物体的方位。同时RepPoint在忽略学到的点集的质量的同时只根据语义特征回归关键点集,会导致旋转的、密集分布的和复杂背景下的目标精度较差。
针对上述问题,作者提出Oriented RepPoints方法,其引入自适应点表示不同的方向,形状和姿势。同时该方法不仅可以精确定位任意方向目标,还可以捕获目标的底层几何结构。
文章贡献点如下:
与传统直接回归方向的方法不同,Oriented RepPoint利用自适应点集来细致地表征目标,甚至能够表征目标的几何结构。为了这个目的,Oriented RepPoint引入了可微分转换函数,其可以使点集自适应地移动到合适的位置。为了在没有直接点对点监督的情况下有效地学习高质量的自适应点,提出了一种在训练阶段选择高质量的方向点的质量度量策略。
为了将点集表示转换成旋转框表示,Oriented RepPoint引入了转换函数。在文章中,作者测试了三种转换函数,分别是:
其中MinAreaRect不可微分,其他两个可微分,因此作者在推理时使用MinAreaRect,在训练时从NearestGTCorner和ConvexHull中任选一个。
Oriented RepPoint包含两个阶段,第一个阶段根据特征点生成自适应点集,第二个阶段为精炼阶段,对点集进行优化。损失函数如下:
$$L=L_{cls}+\lambda_1L_{s1}+\lambda_2L_{s2}$$
其中$\lambda_1,\lambda_2$是平衡权重,$L_{cls}$是分类损失:
$$L_{cls}=\frac{1}{N_{cls}}\sum\limits_iF_{cls}(R_i^{cls}(\theta),b_j^{cls})$$
其中$R_{i}^{cls}(\theta)$代表预测类别置信度,$b_j^{cls}$是真实类别,$F_{cls}$是focal loss。
$L_{s1},L_{s2}$分别代表第一阶段和第二阶段的空间定位损失,对于每一阶段定位损失计算为:
$$L_s=L_{loc}+L_{s.c.}$$
其中$L_{loc},L_{s.c.}$分别代表基于转换后边界框的定位损失(localization loss based on converted oriented boxes)和空间限制损失(spatial constraint loss)。其中
$$L_{loc}=\frac{1}{N_{loc}}\sum\limits_i[b_j^{cls}\geq1]F_{loc}(OB_i^{loc}(\theta),b_j^{cls})$$
其中$F_{loc}$代表GIoU损失,$N_{loc}$代表全部正样本点数。
$$L_{s.c.}=\frac{1}{N_a}\frac{1}{N_o}\sum\limits_{i=1}\sum\limits_{j=1}\rho_{ij}$$
其中$N_a,N_o$分别代表对每个目标分配的正样本点数以及在真值框外的点数。
$$\rho=\begin{equation}
\begin{cases}
||p_o-p_c|| , & \text{$p_{o}$ is outside GT} \
0 , & \text{otherwise}
\end{cases}
\end{equation}
$$
其中$p_o$代表GT外的点,$p_c$代表GT的中心点
首先,APAA定义了一个质量评估值Q,该值从四个方法来度量学到的自适应点集的质量。
$$Q=Q_{cls}+\mu_1Q_{loc}+\mu_2Q_{ori}+\mu_3Q_{poc}$$
其中$Q_{cls},Q_{loc},Q_{ori},Q_{poc}$分别代表分类置信度(classification confidence),空间位置距离(spatial location distance),Chamfer距离(Chamfer distance)以及特征多样性(point-wise feature diversity)。Chamfe距离计算如下:
$$CD(R^v,R^g)=\frac{1}{2n}\sum_{i=1}^nmin_{j}||(x_i^v,y_j^v)-(x_i^g,y_j^g)||2+\frac{1}{2n}\sum{j=1}^nmin_{i}||(x_i^v,y_j^v)-(x_i^g,y_j^g)||2$$
特征多样性计算如下:
$$Q{poc}=1-\frac{1}{N_p}\sum_{k}cos<e^\star_{i,k},e^\star_i>=1-\frac{1}{N_p}\sum_k\frac{e^\star_{i,k}\cdot{e^\star_i}}{||e^\star_{i,k}||\times||e^\star_i||}$$
之后针对每个目标,利用Q值,选择前k个样本作为正样本。
论文标题:《Shape-Adaptive Selection and Measurement for Oriented Object Detection》
论文发表:AAAI 2022
论文链接:https://ojs.aaai.org/index.php/AAAI/article/view/19975
论文代码:https://github.com/houliping/SASM
1 | @inproceedings{hou2022shape, |
Name | Value |
---|---|
标签 | #标签分配 #旋转目标检测 |
数据集 | #DOTA #HRSC2016 #UCAS-AOD #ICDAR2015 |
目的 | 解决旋转目标检测中样本选择没有考虑目标形状信息、没有区分不同质量正样本的问题 |
方法 | 提出shape-adaptive selection以及shape-adaptive measurement |
作者提到旋转目标检测仍然面临挑战,其中最主要的挑战来自目标的形状(如长宽比)。在通用目标检测任务中,样本选择(sample selection,也叫标签分配,label assignment)对于性能提升具有重要作用。然而现有的样本选择策略存在以下不足:
针对上述问题,作者提出了shape-adaptive selection(SA-S)和shape-adaptive measurement(SA-M)策略。
作者做了一个实验,分析不同正负样本IoU划分阈值对不同长宽比类别性能的影响,可以发现当长宽比变大时,IoU阈值越小越好,这可以说明传统的固定IoU阈值的划分方式并不是最优的。
根据ATSS,目标真值和预测值的IoU均值和方法可以用于计算动态的IoU阈值,因此对于第i个真值框,IoU阈值可以计算为:
$$\tau_i^{IoU}=f(y_i)\times(\mu+\sigma)$$
其中:
$$\mu = \frac{1}{J}\sum\limits^{J} _ {j=1} I _ {i,j}$$
而
$$\sigma=\sqrt{\frac{1}{J}\sum _ {j=1}^J(I _ {i,j}-\mu)^2}$$
其中J是候选样本的数量,$I_{i,j}$是第i个真值框和第j个预测框之间的IoU值,$y_{i}$代表真值框的长宽比。 根据上面的分析,权重应该随着纵横比的增加而减小,因此长宽比较大的目标被分配一个较低的IoU阈值,故而:
$$f(y_i)=e^{-\frac{y_i}{\omega}}$$
其中ω是一个权重参数,默认为4。当数据集包含大量大长宽比目标时,较大的ω通常可以获得更好的性能。这样,当IoU大于等于$\tau_i^{IoU}$时,认为其是正样本。
作者认为与位于物体内部的点相比,位于物体边界附近的点包含更多关于杂波背景,甚至附近物体的信息。因此,位于物体内部的点,特别是位于物体中心周围的点,比位于物体边界附近的点更能代表物体的特征。因此如果用所有正样本都有同样的权重会导致一些高质量正样本被远离物体中心的低质量样本点抑制,且每个样本点的质量与物体的形状密切相关,而不仅仅与每个点到物体中心的距离有关。
因此作者提出了一种基于归一化形状距离的Shape-Adaptive Measurement策略。其具体做法如下:
针对每一个真值框$(x,y,w,h,\theta)$,其分别代表中心点坐标,宽度,高度和角度。归一化形状距离计算如下:
$$
\Delta d _ {ij}=
\begin{equation}
\begin{array}{lr}
\sqrt{\frac{(x _ i-x _ j)^2}{w _ i}+\frac{(y _ i-y _ j)^2}{h _ i}}, & 0\leqslant\theta _ i\leqslant\frac{\pi}{2} \\
\sqrt{\frac{(x _ i-x _ j)^2}{h _ i}+\frac{(y _ i-y _ j)^2}{w _ i}}, & otherwise
\end{array}
\end{equation}
$$
正样本的质量计算为$\bar{Q} _ {ij}=e^{-\Delta{d _ {ij}}}$.
作者认为较大偏差的孤立点会极大地影响凸包(convex hull,其由预测点集计算得到)的质量,并对精确定位产生不利影响,因此提出了边界中心损失(Boundary-Center Loss),其从点集中选取最左点、最右点、最上点和最下点,用点集中所有点的x坐标和y坐标的平均值来计算平均中心点:
$$L^{bc}=\sum\limits _ {i=1}^{5}L _ {smooth}(p _ i,g _ i)$$
因此总损失为:
$$L=\lambda _ 1L^c+\lambda _ 2L^1+\lambda _ 3L^2$$
其中$L^c,L^1,L^2$分别代表分类损失,初始检测损失,精炼检测损失。$\lambda_1,\lambda_2,\lambda_3$是权重系数,根据经验设为1.0,0.375和1.0. 其中分类损失计算为:
$$L _ i^c=\frac{1}{N^+}\frac{1}{\sum _ {p _ j\in{P^+}}\bar{Q} _ {ij}}\sum\limits _ {ij}\bar{Q} _ {ij}$$
其中$j,N^+,P^+$分别代表序号,总数和预测值。$L^{cls}$代表focal loss。
初始检测损失为:
$$L^1 _ i=\frac{1}{N^+}\frac{1}{\sum _ {p _ j\in{P^+}}\bar{Q} _ {ij}}\sum\limits _ {ij}\bar{Q} _ {ij}L _ {ij}^{reg}+L^{bc} _ {ij}$$
其中$L^{reg}=1-GIoU$代表GIoU Loss。
精炼阶段检测损失为:
$$L^2 _ i=\frac{1}{N^+}\frac{1}{\sum _ {p _ j\in{P^+}}\bar{Q} _ {ij}}\sum\limits _ {ij}\bar{Q} _ {ij}L _ {ij}^{reg}$$
论文标题:《A General Gaussian Heatmap Label Assignment for Arbitrary-Oriented Object Detection》
论文发表:2022 IEEE TRANSACTIONS ON IMAGE PROCESSING
论文链接:https://ieeexplore.ieee.org/document/9709203
1 | @article{huang2022general, |
Name | Value |
---|---|
标签 | #遥感 #标签分配 #旋转目标检测 |
数据集 | #DOTA #DOTAv2 #SKU10-R #SSDD |
目的 | 解决旋转目标检测任务中,采样策略没有考虑目标的形状和方向特性的问题。 |
方法 | 提出了GGHL,其包含OLA,ORC以及JOL |
作者提到近年来,大多数做旋转目标检测的方法都是设计复杂的网络结构以使得提取的特征分布接近GT的分布。然而改进模型结构不是提升性能的唯一解决途径。下图可见,一个完整的检测流程包括:数据;标签分配(正负样本划分);模型结构;目标函数(损失)。
对于CNN-Based检测器而言,如何提升标签分配也很重要,不同的策略将会通过影响生成的样本空间来直接影响模型的性能。因此,要想提升检测性能,一个方法是使用复杂的CNN结构(复杂的近似估计函数),另一个方法是设计标签分配策略从而构建更好的能够反映目标特性的样本空间。
目前一些工作采用的标签分配策略如下:
(1)Anchor-Based Label Assignment
SCRDet,LO-Det,DAL,CenterMap,DCL以及Oriented R-CNN等使用的基于Anchor的标签分配策略。(计算IoU,通过和阈值比较来判断)这种方法会导致正负样本误分。
(2)Dense-Points Assignment
FCOS,IENet,AOPG等使用更宽松的采样策略,会导致样本空间中混入负样本。
(3)Key-Point Assignment
CenterNet,BBAVector以及O2DNet等使用更严格的采样策略,导致正负样本严重不平衡。
因此一个上述标签分配策略都没有考虑目标的旋转和形状特性,故而存在很多不足。此外,即便得到了更好的训练样本空间,还需要一个合适的目标函数来引导模型学到更高质量的特征。而目前,主流的目标函数都是独立优化分类和回归分支。因此其可能导致精准定位的预测框只有很低的分类得分,或者高得分的目标定位不准。因此,PISA,Free-Anchor,以及AutoAssign等方法将不同子任务联合训练来实现更理想的性能。
针对上述问题,作者提出了通用高斯热力图标签分配策略(GGHL),其主要包括三个部分:
下图为GGHL的结构框架。
作者提到,之前的标签分配(Label Assignment,LA)存在样本误匹配的问题,并且存在大量超参数。如GWD使用2D高斯来计算损失,其LA仍基于Anchor实现。CenterNet,BBAvector,DRN等使用标准高斯分布(圆形)不能反映目标的形状和方向特性,并且其只使用高斯峰值点作为正样本加剧了正负样本不平衡,并且使用高分辨率特征图加大了计算复杂性。因此作者提出的OLA采用旋转椭圆高斯区域来采样。
(1)与标准高斯分布不同,OLA使用整个高斯区域作为正样本采样区域,再根据高斯密度函数对不同位置加权。高斯概率密度函数如下:
其中$X=[x,y]^T\sim N(\mu,C)$,$\mu\in R^2$代表平均向量,$C\in R^{2\times2}$为非负半定实矩阵,代表两个变量的协方差矩阵。实对称矩阵$C$正交对角分解为:
其中Q为实对称矩阵,$\Lambda$代表由降序特征值组成的对角矩阵。
高斯概率密度函数变换为:
如果$f(x,y)>0$,该位置定义为正样本,且其值代表该位置的权重。
(2)对于重叠问题,如果一个位置包含在不同的高斯区域内,则将其分配给$f(x,y)$最大的那个高斯区域。
(3)空间和尺度范围。对于空间范围,设高斯峰值的边界框为C-BBox,此时其他位置的边界框与C-BBox的IoU大于阈值$T_{IoU}$则视为正位置(positive location)。这些正位置构成了原始高斯候选区域的一个子集(表现为一个较小的椭圆,与原始高斯椭圆共心),其半轴长度为:
其中$r_i$代表原始高斯椭圆的半轴长度。
而对于尺度范围,假设不同特征层的下采样率为$stride_m=2^{m+3},m=1,2,3$,同时为了保证在空间尺度上正样本的数量,定义$max_i(r_i^c)/stride_m\geq 1$,即$max_i(2r_i)\geq \frac{2\times stride_m}{1-T_{IoU}}$。定义OBB的四条边长为$d_j,j=1,2,3,4$,则有$max_j(d_j)=max_i(2r_i)\geq \frac{2\times stride_m}{1-T_{IoU}}$。定义一个超参数$\tau=3$,得到两个阈值:
此时,当$max_j(d_j)\in (1,range_1)$时,目标分配给$stride_1$。当$max_j(d_j)\in(range_1,range_2]$时,目标分配给$stride_2$。当$max_j(d_j)\in(range_2,\sqrt{2}len^{img}]$时,目标分配给$stride_3$。
作者提到,现有的OBB表示方法有两类,一类是基于角度的,如CenterMap,另一类是基于点的,如Gliding Vertex。ORC如下图,使用$l_{x,y,m}=[l_1,l_2,l_3,l_4]$以及$s_{x,y,m}=[s_1,s_2,s_3,s_4]$来表示一个位于$(x,y) _ {m}$的点所表示的OBB。其中与Gliding Vertex一样,使用$ar_{x,y,m}\in[0,1]$表示HBB和OBB的面积比例,因此ORC相当于使用一个9维的向量表示OBB:$obb_{x,y,m}=[l_{x,y,m},s_{x,y,m},ar_{x,y,m}]$。
除此之外,并不是每一个凸四边形都能被ORC表示,还需要讨论顶点不在HBB上的情况以及ORC中顶点的隐式排序。
此外,直接使用高斯分布来加权并不适合部分目标,如港口等等。因此需要设计一种自适应的加权调整策略,如AutoAssign以及IQDet等等。因此借鉴此思想,作者提出了OWAM。
包括:
(1)消融实验
(2)可视化结果
(3)对比实验
论文标题:《Object Detection for Aerial Images With Feature Enhancement and Soft Label Assignment》
论文发表:2022 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING
论文链接:https://ieeexplore.ieee.org/document/9780146
1 | @article{yu2022object, |
Name | Value |
---|---|
标签 | #遥感 #特征增强 #标签分配 #旋转目标检测 |
数据集 | DOTA1.0;DOTA1.5;HRSC2016;UCAS-AOD; |
目的 | 解决遥感图像中旋转特征不对齐以及正负样本不平衡的问题 |
方法 | 提出旋转特征精炼,类感知上下文聚合以及软标签分配策略 |
作者提到,航拍图像目标检测任务存在目标方向任意以及前景与背景极不平衡的问题。并且提到Anchor-Based方法受超参数影响较大。因此作者的工作主要基于Anchor-Free模型实现。
(1)目标方向任意
由于航拍图像的鸟瞰视角,目标具有任意方向的性质。因此,通过标准2D卷积的水平感受野所获得特征并不能准确描述旋转目标的特征。下图可见,水平感受野和OBB不能很好的对齐。
(2)正负样本
作者发现不同空间位置的正样本展现出不一致的检测能力。下图可见,在不同位置检测出的OBB在IoU和Cls Score得到的结果差距很大。
并且作者发现遥感图像中前景和背景不平衡问题极其突出,导致模型不能学到很强的(strong)、公正的(unbiased)特征。下图可见,遥感图像中的前后景不平衡,导致的FP。
为解决上诉问题,作者提出了FSDet,其包含:
(1)旋转特征精炼(oriented feature refinement,OFR),利用几何信息解决特征未对齐问题
(2)类感知上下文聚合(class-aware context aggregation,CCA),提高类内前景特征的分辨能力
(3)软标签分配(soft label assignment,SLA),解决训练过程中不同位置样本得到结果不一致问题
FSDet基于FCOS构建,并加入了其所提出的OFR,CCA以及SLA模块。
目标框表示方法为$d=(l,t,r,b,\theta)$,如下图所示:
损失函数如下:
其中分类损失为focal loss,回归损失包括HBB损失(使用的GIoU loss)以及角度损失:
OFR:利用旋转目标框的空间几何信息,学习更有效的特征表示。
OFR包括辅助回归分支和框特征注意机制。
首先特征图F输入到辅助分类分支得到粗糙的分类结果$\hat{c}={p_{i,k}|k=1,…,C}$,然后输入到一个门函数(gating function)来抑制负样本和低质量正样本,如下图:
其中t是预设阈值,A是放大系数,默认20。然后得到新的分类结果$\hat{p} _ {i,k}$,使用它来聚合每一层上此类的特征:
之后使用 $v_{k}$ 表示获取了更多类内语义信息的特征。同时为了计算每个位置的上下文特征,挖掘分类和位置的联系,使用每个位置$i$的特征$f_{i}$和类别$c^{\ast}$以及聚合特征$v _ {cls}$,计算两者的相似性:
并且希望$f_{i}$和其他类的相似性低于$f_{i}$和$c^{\ast}$。在计算特征的相似性后,得到类感知上下文特征$z_i$。
并且作者验证了CCA模块的有效性:
由于高质量样本能够产生比低质量样本更准确预测的结果,SLA对每个样本的损失分配了一个软权重,使模型更关注高质量样本点。样本的质量$Q_{i,n}$定义为:
其中$p_{i,c^{(n)}}$代表样本$i$属于第n个Box的类别的概率,$IoU(\hat{B} _ i,B_n)$代表预测OBB$\hat{B} _ i$和真值OBB$B_n$之间的IoU值。超参$\alpha\in[0,1]$用于控制分类和回归之间的权重。$x$表示坐标$(x,y)$,$G_{n}(x)$代表高斯分布:
其中$\mu$和$\sum$代表均值和高斯分布的协方差矩阵。
其中R代表旋转矩阵,$\Lambda$代表特征值的对角矩阵。特征值$\lambda_{1}$和$\lambda_{2}$分别是椭圆半轴的平方,将OBB内切椭圆外的位置的$G_{n}(x)$值设为0。高斯分布将高值分配给靠近物体中心的位置,而低值分配给远离中心的位置。
根据样本的质量$Q_{i,n}$,可得正样本权重:
负样本权重:
加权后的损失:
辅助分支的损失:
总损失:
(1)消融实验:
(2)不同层的正样本权重可视化:
(3)其他实验
(4)对比试验
本打算9月30日晚上去天安门看看,结果去太晚了不让进,只能在附近转转…
不知道是因为动物园太老了,还是天气太冷了,好多动物都没看见,比如长颈鹿…
去的那天下着小雨,烟雨朦胧…
去故宫那天正好赶上了天安门开音乐喷泉,录了视频,不过没拍照…
护城河里的锦鲤,见者好运…,以及集福门…
把白塔拍出了小清新的感觉…
位于北京六环边上,周末踏青,强身健体…
论文标题:《SCRDet: Towards More Robust Detection for Small, Cluttered and Rotated Objects》
论文发表:ICCV2019
论文链接:https://openaccess.thecvf.com
论文代码:https://github.com/DetectionTeamUCAS
1 | @inproceedings{yang2019scrdet, |
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#遥感 #注意力机制 #旋转目标检测 | 解决了遥感目标角度边界问题 | IoU SmoothL1 Loss,多维注意力 | 从遥感目标的难点出发 |
遥感目标检测的难点:
针对上述问题进行改进:
目标检测经典模型:
针对小目标:RP-Faster R-CNN
整个框架基于Faster R-CNN based R2CNN实现,模型结构如下图:
主要包含三个部分:
针对小目标检测,作者认为特征融合和有效采样是关键。对于anchor-based来说,anchor的铺设方式直接影响正样本采样率。经典的anchor铺设方式和特征图的分辩率有关,也就是anchor铺设的步长(C2-C5上的anchor步长分别是4,8,16,32)。随着网络加加深,特征图分辨率下降,anchor的步长扩大,常常会导致小目标的采样丢失,如下图所示:
文章通过resize的方式选取了一个合适的特征图分别率,尽可能保证小目标都被采样到,再加上简单的特征融合保证丰富的语义信息和位置信息。在这里之所以不使用C2,是因为遥感目标检测会设置较多的尺度和比例,那么在C2这个特征图上面的anchor就变得太多了,而且在遥感数据集中最小的目标一般也都在10像素以上(特指DOTA1.0,DOTA1.5则给出了像素10以下的标注)。
由于遥感图像背景的复杂性,RPN产生的建议区域可能引入大量噪声信息,如下图所示:
过多的噪音可能会混淆物体信息,物体之间的界限将变得模糊,导致漏检并增加虚警。因此,有必要增强物体特征并削弱非物体特征。为了更有效地捕捉复杂背景下小物体的特征,文章设计了一种有监督的多维注意力网络(MDA-Net),如下图所示。具体来说,在基于像素的注意网络中,特征图F3通过具有不同大小卷积核进行卷积运算,学习得到双通道的显著图(参见上图d)。这个显著图显示了前景和背景的分数。选择显著图中的一个通道与F3相乘,得到新的信息特征图A3(参见上图c)。需要注意的是,Softmax函数之后的显着图的值在[0,1]之间。换句话说,它可以降低噪声并相对的增强对象信息。由于显著图是连续的,因此不会完全消除背景信息,这有利于保留某些上下文信息并提高鲁棒性。
其实这个模块现在也是被用的比较烂了,就是空间注意力加通道注意力的组合。但在实际的应用过程中,空间注意力在遥感检测真的是非常有用的;
首先我们要先了解一下两种旋转边界框的两种常见的方式,下图来自这篇文章的作者yangxue:
SCRDet是采用的opencv 表示法。在当前常用的旋转检测框的角度定义下,由于存在旋转角度的边界问题,会产生不必要的损失,如下图所示:
最理想的角度回归路线是由蓝色框逆时针旋转到红色框,但由于角度的周期性,导致按照这个回归方式的损失非常大(参见上图右边的Example)。此时模型必须以更复杂的形式回归(例如蓝色框顺时针旋转,同时缩放w和h),增加了回归的难度。为了更好地解决这个问题,我们在传统的smooth L1 损失函数中引入了IoU常数因子。在边界情况下,新的损失函数近似等于0,消除了损失的突增。新的回归损失可分为两部分,smooth L1回归损失函数取单位向量确定梯度传播的方向,而IoU表示梯度的大小,这样loss函数就变得连续。此外,使用IoU优化回归任务与评估方法的度量标准保持一致,这比坐标回归更直接和有效。IoU-Smooth L1 loss公式如下:
可以看一下两种loss在边界情况下的效果对比:
导致这种原因的根本原因是角度的预测超出了所定义范围。其实解决这种问题的方法并不唯一,RRPN和R-DFPN在论文的loss公式中就判断了是不是在定义范围内,通过加减$k\pi$来缓解这个问题,但这种做法明显不优美而且仍然存在问题,主要是较难判断超出预测范围几个角度周期。当然可以通过对角度部分的loss加一个周期性函数,比如tan、cos等三角函数来做,但是我在实际使用过程中常常出现不收敛的情况。对于边界问题,我其实还做了其他方法的研究,会在以后的文章中详细讨论。
消融实验:
对比实验:
hexo\source\_posts\
文件夹中的全部文章,把里面含有https://cdn.jsdelivr.net/gh
的图片全部下载下来,并替换链接为npm的CDN链接。总体流程非常简单,下面是具体实现。
1 | import os |
由第一步已经下载好图片了,这一步需要对图片进行简单的压缩,这里我采用最简单的图片缩放,通过缩小图片来压缩(有损)
,需要无损压缩的可以用软件或者其他方法(百度、CSDN)。
1 | from PIL import Image |
到这一步就很简单了,把之前压缩好的图片放在一个文件夹里,如:
1 | - mj-img\ |
之前用过npm的,可以直接在文件夹里打开bash
,输入npm init
与npm publish
.
没有使用过npm的,可以参考Akilar的npm图床使用技巧.
]]>论文标题:《IENet: Interactive Embranchment Network Based One-Stage Anchor Free Detector for Orientational Aerial Object Detection》
论文发表:arxiv 2019
论文链接:https://arxiv.org/pdf/1912.00969
1 | @article{lin2019ienet, |
Name | Value |
---|---|
标签 | #遥感 #目标检测 |
数据集 | DOTA,HRSC2016 |
目的 | 两阶段方法计算量大,单阶段方法性能不足 |
方法 | 基于自注意力的互动分支 |
作者提到,遥感图像的目标检测任务的难点在于:
而目前最好的性能都是两阶段算法实现的,但是两阶段算法通常在第一阶段定位,在第二阶段分类,因此计算量是非常大的,尤其是对旋转目标检测而言,因为Anchor匹配(涉及IoU计算)和RoI特征提取的计算量大。
针对上诉问题,作者提出了IENet(interactive embranchment network),其是一个单阶段的Anchor-Free旋转目标检测器,其包含如下贡献点:
在FCOS的基础上增加了一个独立的角度回归分支(Orientation Regression)
由于独立的角度分支不能很好的利用位置等信息,因此检测性能下降,基于此IENet提出了基于自注意力机制的分支交互模块即IE(Interactive Embranchment) Module,用于利用分类和位置回归信息。
IENet使用HBB+几何变换来表征OBB,如下图所示:
IENet使用HBB加h,w来表示一个OBB,其中GT OBB是一个8维的向量$[x_1,y_1,x_2,y_2,x_3,y_3,x_4,y_4]$,HBB可由$[x_{min},y_{min},x_{max},y_{max}]$表示,h和w计算如下:
$$w=x_{max}-x_2$$
$$h=y_{max}-y_1$$
基于上述几何变化,可将OBB回归问题转换成HBB回归和方向回归的问题,其中HBB回归和FCOS的一致,为Box的偏移量$R_b=[l,t,r,b]$,方向回归为$R_o=[w,h]$.
IE模块结构图:
在获得了分类和位置回归的特征图$F^m$后,使用1x1的卷积层和softmax层来构建自注意力模块:
总损失为:
$$L = \frac{1}{N_{pos}}L_{cls}+\frac{\lambda}{N_pos}L_{reg}+\frac{\omega}{N_{pos}}L_{ori}$$
其中分类损失为Focal Loss损失
位置回归损失为centerness损失加smoothL1
角度回归损失为smoothL1损失
DOTA_v1
HRSC2016
同时IENet在推理和训练时的速度上也有优势:
消融实验:
特征可视化:
]]>论文标题:《Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection》
论文发表:
CVPR2020
论文链接:https://openaccess.thecvf.com
论文代码:https://github.com/sfzhang15/ATSS
1 | @inproceedings{zhang2020bridging, |
Name | Value |
---|---|
标签 | #正负样本 #目标检测 |
数据集 | MSCOCO |
目的 | 通过实验发现Anchor-Base 和Anchor-Free 的区别在于正负样本定义,并提出了ATSS |
方法 | 使用IoU的均值和标准差作为判断正负样本的自适应IoU 阈值 |
论文指出单阶段Anchor-Based
和Center-Based Anchor-Free
检测算法的性能差异主要来自于正负样本的选择策略不同
,基于此问题,作者提出了ATSS(Adaptive Training Sample Selection)方法,该方法能够自动根据真实框(GT)的相关统计特征自适应地选择合适的样本,进而提升模型性能…
Anchor-Free
和Anchor-Based
方法的根本差异主要来源于正负样本的选择;ATSS
( Adaptive Training Sample Selection
)方法来根据对象的统计特征自动选择正负样本;anchor
是无用的操作;MS COCO
上达到SOTA
;Anchor-Based
和Anchor-Free
的区别分析由于FCOS
是基于point
进行预测,故可以认为就是一个像素位置有一个anchor
,为了公平对比,将RetinaNet
的anchor
也设置为1个(#A=1
),将FCOS
的训练策略移动到RetinaNet
上面,可以发现性能依然是RetinaNet
低于fcos 0.8mAP。 排除这个因素后,现在两个算法的区别是:
point
回归还是从anchor
回归;从point
回归就是指的每个点预测距离4条边的距离模式,而从anchor
回归是指的RetinaNet
那种基于anchor
偏移量回归的模式。但作者通过实验分析可以知道回归分支中从point回归还是从anchor回归对最终影响很小,反而是正负样本定义对结果影响最大。
算法流程如下:
论文提出ATSS方法,该方法根据目标的相关统计特征自动进行正负样本的选择,具体逻辑如算法1所示。对于每个GT box g
,首先在每个特征层找到中心点最近的k
个候选anchor boxes(非预测结果),计算候选box与GT间的IoU $U_g$,计算IoU的均值$m_g$和标准差$v_g$,得到IoU阈值$t_g=m_g+v_g$,最后选择阈值大于$t_g$的box作为最后的输出。如果anchor box对应多个GT,则选择IoU最大的GT。
均值$m_g$表示预设的anchor与GT的匹配程度,均值高则应当提高阈值来调整正样本,均值低则应当降低阈值来调整正样本。标准差$v_g$表示适合GT的FPN层数,标准差高则表示高质量的anchor box集中在一个层中,应将阈值加上标准差来过滤其他层的anchor box,低则表示多个层都适合该GT,将阈值加上标准差来选择合适的层的anchor box,均值和标准差结合作为IoU阈值能够很好地自动选择对应的特征层上合适的anchor box;
根据统计原理,大约16%的anchor box会落在$[m_g+v_g,1]$,尽管候选框的IoU不是标准正态分布,但统计下来每个GT大约有0.2×kL个正样本,与其大小和长宽比无关,而RetinaNet和FCOS则是偏向大目标有更多的正样本,导致训练不公平;其中ATSS仅有一个超参数k,并且实验表明ATSS的性能对k不敏感,参数k
在区间$[7,17]$几乎是一样的,过大的设置会到导致过多的低质量候选anchor,而过小的设置则会导致过少的正样本,而且统计结果也不稳定。总体而言,参数k
是相对鲁棒的,所以ATSS几乎是hyperparameter-free的。
将ATSS应用到RetinaNet和FCOS上测试效果:
anchor point
改为长宽为$8S$的anchor box
来根据ATSS选择正负样本,但仍然使用原始的回归方法,提升了1.4%AP。两种方法找到的anchor point
在空间位置上大致相同,但是在FPN
层上的选择不太一样。从结果来看,自适应的选择方法比固定的方法更有效。论文还补充测试了不同anchor数下的性能,并且其实验结果证明,在每个位置设定多个anchor box是无用的操作,关键在于选择合适的正样本;
ATSS : 目标检测的自适应正负anchor选择,很扎实的trick | CVPR 2020 - 知乎 (zhihu.com)
]]>COPY
,再加上我一直想要在我的博客首页加一个大画幅的轮播图插件,于是又参考了Hassan的文章轮播图…经过一番折腾,效果如下:hometop.pug
在themes/butterfly/layout/includes
路径下创建hometop.pug
文件:
1 | if is_home() |
其中第一行的is_home()
是Hexo
自带的辅助函数,用于判断是否为首页,但是其在justlovesmile.top/
以及justlovesmile.top/page/2/
等页面都返回True
,因此如果你只想在首页的第一页显示该模块,可以使用is_current('/')
。
css
样式在自己的css
文件中添加:
1 | :root{ |
sticky.pug
在themes/butterfly/layout/includes
路径下创建sticky.pug
文件:
1 | link(rel='stylesheet' href='https://unpkg.com/swiper/swiper-bundle.min.css') |
sticky.js
在themes/butterfly/source/js
路径下创建sticky.js
文件:
1 | var mySwiper = new Swiper('#stickyList', { |
sticky.css
在themes/butterfly/source/css
路径下创建sticky.css
文件:
1 | :root{ |
slider.yml
在hexo\source\_data\
路径下创建slider.yml
文件,最好准备6
个推荐文章,例如:
1 | #- cover: 封面图片链接 |
css
样式见1.2
中.top_post_group
等样式类,不再赘述…
people
页面在hexo\source\
路径下创建people
文件夹,其中创建index.html
:
1 | --- |
css
样式在hexo\source\people
路径下,创建style.css
:
1 | body, |
js
文件在hexo\source\people
路径下,创建script.js
:
1 | function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,a=new Array(r);t<r;t++)a[t]=e[t];return a}function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var a=r[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),e}var config={src:"https://npm.elemecdn.com/guli-heo/others/open-peeps-sheet.png",rows:15,cols:7},randomRange=function(e,r){return e+Math.random()*(r-e)},randomIndex=function(e){return 0|randomRange(0,e.length)},removeFromArray=function(e,r){return e.splice(r,1)[0]},removeItemFromArray=function(e,r){return removeFromArray(e,e.indexOf(r))},removeRandomFromArray=function(e){return removeFromArray(e,randomIndex(e))},getRandomFromArray=function(e){return e[0|randomIndex(e)]},resetPeep=function(e){var r,t,a=e.stage,n=e.peep,o=.5<Math.random()?1:-1,i=100-250*gsap.parseEase("power2.in")(Math.random()),s=a.height-n.height+i;return 1==o?(r=-n.width,t=a.width,n.scaleX=1):(r=a.width+n.width,t=0,n.scaleX=-1),n.x=r,n.y=s,{startX:r,startY:n.anchorY=s,endX:t}},normalWalk=function(e){var r=e.peep,t=e.props,a=(t.startX,t.startY),n=t.endX,o=gsap.timeline();return o.timeScale(randomRange(.5,1.5)),o.to(r,{duration:10,x:n,ease:"none"},0),o.to(r,{duration:.25,repeat:40,yoyo:!0,y:a-10},0),o},walks=[normalWalk],Peep=function(){function a(e){var r=e.image,t=e.rect;_classCallCheck(this,a),this.image=r,this.setRect(t),this.x=0,this.y=0,this.anchorY=0,this.scaleX=1,this.walk=null}return _createClass(a,[{key:"setRect",value:function(e){this.rect=e,this.width=e[2],this.height=e[3],this.drawArgs=[this.image].concat(_toConsumableArray(e),[0,0,this.width,this.height])}},{key:"render",value:function(e){e.save(),e.translate(this.x,this.y),e.scale(this.scaleX,1),e.drawImage.apply(e,_toConsumableArray(this.drawArgs)),e.restore()}}]),a}(),img=document.createElement("img");img.onload=init,img.src=config.src;var canvas=document.querySelector("#canvas"),ctx=canvas.getContext("2d"),stage={width:0,height:0},allPeeps=[],availablePeeps=[],crowd=[];function init(){createPeeps(),resize(),gsap.ticker.add(render),window.addEventListener("resize",resize)}function createPeeps(){for(var e=config.rows,r=config.cols,t=e*r,a=img.naturalWidth/e,n=img.naturalHeight/r,o=0;o<t;o++)allPeeps.push(new Peep({image:img,rect:[o%e*a,(o/e|0)*n,a,n]}))}function resize(){stage.width=canvas.clientWidth,stage.height=canvas.clientHeight,canvas.width=stage.width*devicePixelRatio,canvas.height=stage.height*devicePixelRatio,crowd.forEach(function(e){e.walk.kill()}),crowd.length=0,availablePeeps.length=0,availablePeeps.push.apply(availablePeeps,allPeeps),initCrowd()}function initCrowd(){for(;availablePeeps.length;)addPeepToCrowd().walk.progress(Math.random())}function addPeepToCrowd(){var e=removeRandomFromArray(availablePeeps),r=getRandomFromArray(walks)({peep:e,props:resetPeep({peep:e,stage:stage})}).eventCallback("onComplete",function(){removePeepFromCrowd(e),addPeepToCrowd()});return e.walk=r,crowd.push(e),crowd.sort(function(e,r){return e.anchorY-r.anchorY}),e}function removePeepFromCrowd(e){removeItemFromArray(crowd,e),availablePeeps.push(e)}function render(){canvas.width=canvas.width,ctx.save(),ctx.scale(devicePixelRatio,devicePixelRatio),crowd.forEach(function(e){e.render(ctx)}),ctx.restore()} ; |
之前考虑到自己剪了一些vlog,但是直接用iframe
嵌入的话页面会很长,而且点开这个页面会自动加载全部视频,感觉很奇怪,并且不能很好的展示,于是写了一个视频点播页面
首先使用命令新建一个页面:
1 | hexo new page video |
在index.md
里面写入一下内容:
1 | --- |
在主题路径themes\butterfly-dev\layout\includes\page
下新建video.pug
:
1 | //if top_img === false |
在主题路径butterfly/layout/
的page.pug
文件中注册上述页面模板:
1 | extends includes/layout.pug |
在视频播放页面通常会有分享按钮,并且一般会提供链接和iframe
嵌入两种分享方式,例如我的(顺便求一波关注):
复制iframe
代码,如下:
1 | <iframe src="//player.bilibili.com/player.html?aid=937145035&bvid=BV18T4y1D7wj&cid=545915013&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe> |
在hexo\source\_data
路径下(没有就创建一个文件夹)新建一个数据文件video.yml
,把刚才的iframe
代码内容转换成:
1 | - cover: https://npm.elemecdn.com/justlovesmile-img/33f7ad7c55b5df1e5bdb6a6ea3eb35b.jpg |
至此,一个视频点播页面就做好了,该方法适用于一切提供iframe嵌入的视频平台,页面展示如下:
]]>论文标题: R3det: Refined single-stage detector with feature refinement for rotating object
论文发表:AAAI 2021
论文链接:https://ojs.aaai.org/index.php/AAAI/article/view/16426/16233
论文代码:https://github.com/Thinklab-SJTU/R3Det_Tensorflow
1 | @article{yang2019r3det, |
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#遥感 #单阶段 #Anchor | 针对单阶段精炼检测器特征未对齐的问题,提出了FRM模块 | RRetinaNet Based,FRM,SkewIou | 精炼 |
作者称对于旋转目标检测存在三个挑战:
针对上述问题,作者提出了R3Det,其主要工作如下:
R3Det主要基于 RetinaNet 实现,结构如下:
对于边界框$(x,y,w,h,\theta)$,其中x,y代表中心点坐标,w,h代表宽和高,$\theta \in [-\frac{\pi}{2},0)$代表角度,边界框回归的值为:
其中$x,x_a,x’$分别代表gt,anchor以及预测值,其余同上。
损失函数为:
其中$v’$为预测的偏移量向量,v代表gt的偏移量向量。其中N表示Anchor的数目,超参数 $\lambda_1$, $\lambda_2$ 控制着这两个损失的平衡,并且默认值为1。$L_{cls}$ 和 $L_{reg}$ 分别是Focal Loss和smooth L1 Loss。
Skew IoU对于角度十分敏感,因此作者在第一阶段使用0.5为前景阈值,0.4为背景阈值,在精炼的第一阶段使用0.6为前景阈值,0.5为背景阈值,如果有多段精炼阶段,使用0.7以及0.6为阈值。总损失:
$$L_{total}=\sum_{i=1}^N\alpha_iL_i$$
其中$L_i$为第i个精炼阶段的损失,$\alpha_i$为平衡系数,默认为1.
许多精炼检测器仍然使用相同的特征图来执行多个分类和回归,而没有考虑边界框位置变化引起的特征未对齐。因此作者提出将当前精炼边界框(橙色矩形)的位置信息重新编码为对应的特征点(红色点),从而以逐像素的方式重构整个特征图,实现特征对齐。整个过程如上图(c)所示。为了准确地获取精炼后的包围框对应的位置特征信息,采用了双线性特征插值方法,如上图(a)所示。特征插值可以表示为:
其中A代表图(a)中的区域,$F\in \mathbb{R}^{C\times 1\times 1}$代表特征图上点的特征向量。
算法流程:
时间过得真快呀,我还记得自己第一次建立博客那天,刚考完期末考试,回到寝室,室友说他发现了一个特别好看的个人网站,我看着那个网站,心中萌发出我也要拥有一个自己的博客的想法,于是在当天我搜索了很多建立个人网站的教程,最后因为自己课设用过python的flask框架并且写过静态的HTML,于是决定在阿里云上购买了一个轻量应用服务器(学生有优惠),然后自己写一个博客网页,因此当时的博客非常简单(并且非常丑)。
直到假期里我看见知乎上有人推荐wordpress,并且也是可以直接在阿里云的轻量应用服务器上直接部署的,因此我果断的开始了wordpress的踩坑之旅,中途先后使用了多个wordpress官网推荐的主题,一直没有找到自己喜欢的,后来还是在知乎上,看见了sakura
主题,非常的漂亮,并且封面图也很好看,如下:
并且在部署的过程中,从作者的博客友链看到了很多大佬的博客,也是第一次知道了原来博客还有友链这种东西…
再到假期末尾,又是我的室友(还是他😂),他给我看了他的博客,虽然只有一个首页(就是Hexo默认的主题)我突然感觉好像也不错,而且他告诉我这个不用租服务器,我突然感觉自己好像打开了新世界的大门,原来还有Hexo这种静态博客生成器…
于是我又开始了Hexo的踩坑之旅,先后用过了yilia
、Sakura-Hexo
、Ayer
、以及现在的Butterfly
主题,他们都是非常优秀的主题,如下图:
除了主题外,自己还添加又卸载了很多插件(如live2d,我用的是下面这个👇),最后发现还是简单实用比较适合我。
从2019年9月6日开始,我的博客终于有了自己的域名,而为什么要买这个域名呢,主要是因为我的游戏id基本上都是这个,比如:Justlovesmile
,Just微笑
,Justlove微笑
等等.
直到换到Butterfly
主题,我突然发现他能满足我绝大部分的需求,不仅适配了黑暗模式,各个模块也写的非常简单明了,非常适合魔改,并且在不同博客的友链中找啊看啊,发现了很多非常棒非常好看的博客,还加入了Butterfly主题的QQ群(后来因为我基本上不聊天所以被踢了qwq),认识了很多大佬,也从他们的博客学到了很多东西,得到了很多帮助,如zhheo博主、小冰博主、Akilar博主等等,因此我的友链中专门开了一个模块保存(供奉)着他们博客。
在看了很多博客魔改和优化的文章以及自己一点一点修改之后,我的博客现在是这个样子的:
从2019年7月10日至今,博客总共发布了文章85篇,标签57个,分类6个,详细见统计页面:
其中2019年24篇,2020年39篇,2021年8篇,2022年目前14篇:
博客共有评论355条,也随时欢迎大家能在留言板中留言。
本文是纪念、也是总结,纪念这1000个日日夜夜在个人博客分享学习笔记或者主题美化的时光,总结我的博客这1000天的一些数据统计。希望在下一个1000天里我的博客能变得越来越好、越来越合我心意。
]]>论文标题: Feature Pyramid Networks for Object Detection
论文发表:CVPR2017
论文链接:CVPR2017 open access
1 | @inproceedings{lin2017feature, |
Name | Value |
---|---|
标签 | #多尺度 |
目的 | 针对目标检测任务中,目标尺度变化的问题,设计了特征金字塔网络 |
方法 | 构建多层特征图之间的联系,合理利用高层语义信息和底层位置信息 |
总结 | 是目标检测模型的标配,较好地解决了多尺度检测问题 |
作者提到,在2017年以前,目标检测中的一个基本挑战就是目标检测模型在处理目标多尺度变化问题的不足,因为在当时很多网络都使用了利用单个高层特征,(比如说Faster R-CNN利用下采样四倍的卷积层——Conv4,进行后续的物体的分类和bounding box的回归),但是这样做有一个明显的缺陷,即小物体本身具有的像素信息较少,在下采样的过程中极易被丢失,而之前的图像金字塔结构虽然也能解决多尺度问题,但计算量大,内存消耗大,因此作者提出了特征金字塔结构,能在增加极小的计算量的情况下,处理好物体检测中的多尺度变化问题。
针对上诉问题,提出了一个利用深度卷积神经网络固有的多尺度金字塔结构来以极小的计算量构建特征金字塔的网络结构,即FPN。
作者对比了多种金字塔结构,其中:
下图是FPN的网络结构:
其主要包含两个部分:
图片来自【论文笔记】FPN —— 特征金字塔 - 知乎 (zhihu.com)
可参考Pytorch官方的代码https://github.com/pytorch/vision
论文标题:Prototypical Networks for Few-shot Learning
论文发表:Advances in neural information processing systems, 2017
论文链接:https://proceedings.neurips.cc/paper/6996-prototypical-networks-for-few-shot-learning
1 | @article{snell2017prototypical, |
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#度量学习 #嵌入网络 | 解决小样本问题 | 学习一个低纬嵌入空间 | 将分类问题转换成度量问题 |
ProtoNet,即原型网络,其想法非常直接但有效,即对每张图像都先用神经网络得到一个特征表示,然后对支持集中每个类别的所有特征取一个平均,作为这个类别的类中心,最后比较查询集和各个类中心之间的距离,取最近的一个类别作为预测结果。
作者的思想是构建一个映射函数,可以将每一类映射到一个简单的原型特征点集中。因此作者使用神经网络学习了一个非线性映射,将输入映射到嵌入空间中,并且规定每一类的原型特征为每个嵌入空间的均值。之后就可以将分类任务看作是在嵌入空间中寻找距离最近的原型特征。
定义样本为S,类别为k,原型特征为$c_k=\frac{1}{S_k}\sum_{(x_i,y_i)\in{S_k}}f_{\phi}(x_i)$,衡量距离的函数为d,那么对于输入样本,其在嵌入空间的分布为$p_\phi(y=k|x)=\frac{\exp(-d(f_\phi(x),c_k))}{\sum_{k^\prime}\exp(-d(f_\phi(x),c_{k^{\prime}}))}$,学习的过程就是最小化负对数损失$J(\phi)=-\log{p_\phi(y=k|x)}$。
其实验结果如下:
]]>题外话:时光荏苒,青春在时间的河岸慢慢行走,不知不觉中,博主的大学生活渐行渐远,带走的是那四年青春的美好回忆,而留下的是那厚厚的、考试前兢兢业业记录下来的学习笔记,看着一篇篇动辄上W字数的笔记,脑海中还能会想起当时的场景。
本文是博主本科期间的专业课程学习笔记的整理和归档,适合计算机专业的同学阅读。
]]>人生的长短不是时间衡量的,而是以思想和行为去衡量,且行且珍惜!
hexo cl && hexo g && gulp && hexo s
一键生成,点开后却发现这个标题的字体颜色亮瞎我的眼睛:于是试了很多帖子,终于把它改好了:
提取主题色的js:https://github.com/briangonzalez/rgbaster.js
处理配色js如下:
1 | if (document.getElementById('post-cover')) { |
参考:
]]>PS:参考YOLO官网的配色和logo做的封面图,感觉还挺好看的,hhhh
论文标题:You Only Look Once: Unified, Real-Time Object Detection
论文发表:CVPR 2016
论文链接:You Only Look Once: Unified, Real-Time Object Detection (cv-foundation.org)
论文官网:YOLO: Real-Time Object Detection (pjreddie.com)
1 | @inproceedings{redmon2016you, |
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#Anchor-Free | 解决两阶段算法检测慢的问题 | 将目标检测(cls和reg)都视为回归问题 | 经典单阶段算法 |
随着深度学习的大火,在YOLO提出那一年,主流的目标检测算法框架主要分为两类:
作者认为人可以一眼看到目标在哪,并且能立即知道是什么,并且对于很多实际场景而言,如自动驾驶,实时性和准确性都是非常重要的。
针对上述问题,作者提出了经典的YOLO算法,它是一个统一的,端到端的单阶段目标检测算法。YOLO具体做法是,首先将输入图片缩放到448x448,然后送入CNN网络,最后使用NMS过滤网络预测结果得到检测的目标。
而在CNN网络里,它首先将图片划分为S×S大小的网格,然后每个单元格负责检测中心点落在该格子的目标,如下图,每个单元格会输出B个边界框(每个边界框输出5个预测值:x, y, w, h, confidence)以及边界框类别概率C,例如:作者在PASCAL VOC的检测实验里使用S=7,B=2,C=类别数量20,一共预测7×7×(2×5+20)个向量。同时这里的confidence代表边界框置信度,它的定义为:
$$Pr(object)\times IoU_{pred}^{truth}$$
其中边界框包含目标时,$Pr(object)=1$,否则为0。而C代表每个类别的置信度,即:
$$Pr(Class_i|Object)\times Pr(objec) \times IoU_{pred}^{truth}=Pr(class_i)\times IoU_{pred}^{truth}$$
YOLO采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数$max(x,0.1x)$,但是最后一层却采用线性激活函数。
在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。
Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重 $\lambda_{coord}=5$ 。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 $\lambda_{noobj}=0.5$ 。其它权重值均设为1。然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为$(x,y,\sqrt{w},\sqrt{h})$。
损失函数中,第一项为边界框中心坐标的误差项,$\mathbb{1} _ {ij}^{obj}$ 是指第 i 个单元格存在目标,且该单元格中的第 j 个边界框负责预测该目标,第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。最后一项是包含目标的单元格的分类误差项,$\mathbb{1} _ {i}^{obj}$值是指第 i 个单元格存在目标。
论文标题: 《SSD: Single Shot MultiBox Detector》
论文发表:2016
论文链接:SSD: Single Shot MultiBox Detector | SpringerLink
1 | @inproceedings{liu2016ssd, |
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#Anchor #单阶段 | 实现多尺度以及卷积预测,进一步提升精度和速度 | MultiBox,Anchor | 经典单阶段算法 |
SSD算法,其英文全名是Single Shot MultiBox Detector, SSD的优势在于消除了bounding box proposal和pixel or feature resampling,并使用了multi-scale,因此达到了比faster rcnn和yolo更高的检测精度和更快的检测速度。
图片来自目标检测|SSD原理与实现 - 知乎 (zhihu.com)
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测,模型结构如下图:
SSD和Yolo一样都是采用一个CNN网络来进行检测,但是却采用了多尺度的特征图,网络的核心点:
SSD将背景也当做了一个特殊的类别,如果检测目标共有c个类别,SSD其实需要预测c+1个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值(cx,cy,w,h),分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值。先验框位置用$d=(d^{cx},d^{cy},d^{w},d^{h})$表示,其对应边界框用$b=(b^{cx},b^{cy},b^{w},b^{h})$表示,那么边界框的预测值$l$其实是b相对于d的转换值:
首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本,其次,通过判断先验框和ground truth之间的IoU值是否大于阈值(如0.5),大于则为正样本
损失包含两个部分:定位损失和分类损失
$$L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))$$
其中N代表所匹配的正负样本数量,l
代表预测框,g
代表真实框,和faster rcnn相似,回归的偏移量的值是边界框的中心坐标(cx,cy)和框的宽度w和高度h。
$$\hat{g} _ {j}^{cx}=(g _ {j}^{cx}-d _ {i}^{cx})/d _ {i}^{w}$$
$$\hat{g} _ {j}^{cy}=(g_{j}^{cy}-d_{i}^{cy})/d_{i}^{h}$$
$$\hat{g} _ {j}^{w}=\log(\frac{g_{j}^{w}}{d_{i}^{w}})$$
$$\hat{g} _ {j}^{h}=\log(\frac{g_{j}^{h}}{d_{i}^{h}})$$
因此定位损失函数为:$L_{loc}(x,l,g)=\sum_{i \in Pos}^N \sum_{m\in {cx,cy,w,h}}x_{ij}^{k}smooth_{L1}(l_i^m-\hat{g} _ j^m)$
分类损失是一个softmax损失:$L_{conf}(x,c)=-\sum_{i\in Pos}^{N}x_{ij}^p\log(\hat{c} _ i^p)-\sum _ {i\in Neg}log(\hat{c} _ i^0)$
其中$\hat{c} _ i^p=\frac{exp(c_i^p)}{\sum_p(exp(c_i^p))}$