急急如律令!offer速来见我!
读入COCO标注格式的标注文件,可以得到图片及对应的标注。
标注的数据格式如下:
输入网络的targets:
网络总体由三部分组成,backbone、RPN、ROI Head,三者的输入输出关系如下图所示。
(3.2)anchor生成
base_size
,长宽比分别为(0.5, 1, 2)的box,以cell为中心,放大box n n n倍;使用相同的
base_size
,对于较小的特征图来说,生成的anchor比较大,说明用来检测较大的物体。
(3.3)proposals生成(RPN后处理)
H/n, W/n
的特征分支为例,其anchor个数为H/n * W/n * 3
;pre_nms_top_n
的anchors;(eg pre_nms_top_n=2000
)post_nms_top_n
fpn_post_nms_top_n
个最后再把真实的gt-box
加入到proposals中
(3.4)计算损失
i)为所有anchor制作label
首先为分配前景后景标签。
满足以下条件的anchor设置为正标签1
(前景):
high_threshold=0.7
的anchor满足以下条件的anchor设置为负标签0
(背景):
low_threshold=0.3
的anchor其他与gt最大IoU介于阈值之间的(0.3,0.7)记为其他类,不算损失。
再计算anchor与对应gt的回归目标
ii)正负样本均衡化(筛选)
batch_size_per_image
:每张图片用于计算损失的anchor数目,eg 256
positive_fraction
:正样本所占比例, eg 0.5
正样本取num_pos=min(0.5*256, fg)
,即若生成的anchor中正样本数目超过128,则取128;若少于128,则保留所有正样本。
负样本取num_neg = batch_size_per_image - num_pos
iii)损失计算
类别损失,前后景预测的损失,交叉熵损失。
L c l s ( p i ) = − p i ∗ l o g ( p i ) − ( 1 − p i ∗ ) l o g ( 1 − p i ) L_{cls}(p_i) = -p_i^*log(p_i) - (1-p_i^*)log(1-p_i) Lcls(pi)=−pi∗log(pi)−(1−pi∗)log(1−pi)
回归损失,边框位置回归损失, s m o o t h L 1 smooth_{L_1} smoothL1损失。
坐标变换系数
t x = ( x − x a ) / w a , t y = ( y − y a ) / h a t w = log ( w / w a ) , t h = log ( h / h a ) t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a t w ∗ = log ( w ∗ / w a ) , t h ∗ = log ( h ∗ / h a ) \begin{aligned} t_{\mathrm{x}} &=\left(x-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}=\left(y-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ t_{\mathrm{w}} &=\log \left(w / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}=\log \left(h / h_{\mathrm{a}}\right) \\ t_{\mathrm{x}}^{*} &=\left(x^{*}-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}^{*}=\left(y^{*}-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ t_{\mathrm{w}}^{*} &=\log \left(w^{*} / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}^{*}=\log \left(h^{*} / h_{\mathrm{a}}\right) \end{aligned} txtwtx∗tw∗=(x−xa)/wa,ty=(y−ya)/ha=log(w/wa),th=log(h/ha)=(x∗−xa)/wa,ty∗=(y∗−ya)/ha=log(w∗/wa),th∗=log(h∗/ha)
s m o o t h L 1 smooth_{L_1} smoothL1函数:
smooth L 1 ( x ) = { 0.5 x 2 if ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}{0.5 x^{2}} & {\text { if }|x|<1} \\ {|x|-0.5} & {\text { otherwise }}\end{array}\right. smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
L r e g ( t i ) = p ∗ s m o o t h L 1 ( t i , t i ∗ ) L_{reg}(t_i) = p^* smooth_{L_1}(t_i, t_i^*) Lreg(ti)=p∗smoothL1(ti,ti∗)
只计算前景的回归损失
联合两项损失:
L R P N = 1 N c l s ∑ i L c l s ( p i ) + λ 1 N r e g ∑ i L r e g ( t i ) L_{RPN} = \frac{1}{N_{cls}}\sum_{i}L_{cls}(p_i) + \lambda \frac{1}{N_{reg}}\sum_i L_{reg}(t_i) LRPN=Ncls1i∑Lcls(pi)+λNreg1i∑Lreg(ti)
其中 N c l s N_{cls} Ncls即用于计算损失的anchor个数,batch_size_per_image
,而 N r e g N_{reg} Nreg则为正样本的个数,num_pos
(4.1) RoI Box Head
feature extractor
0.25×512=128个
,其余为负样本。ROI
尺寸设置为7
,features
的channel=256
,则取出来的特征维度为512*256*7*7
,reshape成512×12544
(12544,1024)、(1024,1024)
,得到特征512*1024
predictor
(1024, num_calsses)
(1024, 8)
loss
proposals
的交叉熵分类损失post processor
(4.2) RoI Mask Head
ROI Align
512
个proposals中的前景proposals,假设有20个ROI
尺寸设置为14
,features
的channel=256
,则取出来的特征维度为20*256*14*14
feature extractor
3*3
卷积20*256×14*14
的tensorpredictor
20*256×14*14
的tensor20*256×28*28
的tensor1×1
的卷积,输出20×num_class×28*28
tensorloss
resize
到28×28
,作为实际值用于计算lossmask_target
计算交叉熵损失。mask_loss = F.binary_cross_entropy_with_logits(
mask_logits[positive_inds, labels_pos], mask_targets
)