關於動機和發展流程,原做者已經在知乎說的很是清楚,主要解決的問題總結以下:python
爲什麼進行聯合表示?因爲論文核心就是使用權重一詞,而權重關係到 \(cls、reg、obj\) 等值大小,最後始終加權到一塊兒。git
論文引入 \(obj\) 參數(和YOLO的前背景相似,區別於centerness),未進行實際的監督,但效果在此處出奇的好,效果以下圖所示。相似於一個 \(FCOS \ \ Scale\) 和一些不肯定度論文的操做,直接獲取一個可學習的 \(Weight\) 和目標進行相關操做。具體爲什麼好,做者未給出實際的理論依據:github
首先將 \(cls\) 和 \(obj\) 相乘進行融合,以下公式所示。注意:此處的 \(obj\) 是一個數,好比 \(batch=2,num_{cls}=80,anchor=100\) ,那麼分類的結果爲 \(2 \times100 \times 80\) ,可是 \(obj=2\times100\times1\) 。由於其表示的意思是:此 \(anchor\) 是前景仍是背景。而具體的類別和置信度,全靠 \(cls\) 進行判斷。app
而後將 \(reg、cls\) 進一步聯合表示,其中 \(L^{loc}\) 是計算的 \(IOU、GIOU、DIOU\) 結果,\(L^{cls}\) 是正樣本的交叉熵 \(loss\) 。這也就和上面公式(1)對應起來,這裏計算的都是正樣本(此處表示GT內的anchor) \(loss\).ide
這裏須要額外補充一點:GT內部的anchor包括正負樣本,而GT外部確定是負樣本,這至關於人的先驗。源碼分析
2.1節中 \(L_i(\theta)\) 表示 \(Loss\) ,而內部的值 \(P_i(\theta)\) 就表示某個anchor爲正樣本的機率值,這個參考交叉熵正樣本分類loss公式便可。因此 \(P_i(\theta)=P_i^{+}\) 也就是正樣本的機率值(正樣本的權重),下式(2)直接進行一個指數變換,至關於放大了正樣本的置信度(機率=置信度),同時使用一個超參數進行調節放大倍數,這裏其實沒有太多其它意義。學習
\(G(d_i)\) 表示高斯權重,包括四組可學習參數: \(\mu->(x,y)\ 、\ \sigma->(x,y)\) ,每一個種類四個參數,COCO數據集共 \(\sigma=80\times2,\mu=80\times2\). 那麼公式(3)就很容易理解了,乘以權重之後取平均。 其中可學習參數最重要的做用是防止初始化過擬合(參考了李翔知乎),若是沒有高斯可學習參數,那麼和正常anchor迴歸區別不大,假設A,B,C三個anchor,其中初始權重A>B>C,那麼在下一輪的訓練中依然是A>B>C,N輪以後A>>B>>C。這是一種強者越強的學習方式,徹底陷入了和初始化息息相關的問題上了。而可學習的gaussian參數使得中心權重偏大,即便中心anchor初始化較差,後面也能慢慢學習增強,而偏遠anchor會愈來愈差。idea
正樣本的Loss組成包括:\(cls、reg、obj\) ,發現上面的公式所有都已包含,直觀上上理解是正確的。spa
負樣本 \(loss\) 僅包含 \(cls、obj\) ,可是會參考 \(reg\) 的結果。前者不用多說,後者爲何會參考 \(reg\) 的值?由於迴歸的越好,是負樣本的機率越低,正樣本的loss會把正樣本的 \(reg\) 學習的很好,而負樣本的 \(reg\) 一直不學習就漸漸沒落了。code
負樣本包含兩個部分,在GT框以外的點所有都是負樣本,在GT框以內的點IOU匹配度較差的點。GT框內點匹配度越差,那麼負樣本的權重越高,如上式(5)(6)所示。權重再乘以 \(\mathcal{P}_{i}(\operatorname{cls} \mid \theta)\) 就獲得負樣本的loss。
按照2.3和2.4節的推導,很容易得出下式(6)的公式。可是正樣本loss中的 \(\sum\) 有點不對稱,按公式log徹底能夠拿到公式裏面乘。按照李翔知乎裏面說的,防止log的值太大沒法收斂,這個地方筆者也沒徹底理解。
看代碼還有一個要點,每一個GT框內anchor正樣本權重gaussian-map得進行normlize,目的是讓gaussian分佈在anchor內部。
gaussian_norm_losses.append( len(gt_instances_per_image) / normal_probs[foreground_idxs].sum().clamp_(1e-12)) # gt數量/所有gaussian權重 ''' ...... ''' loss_norm = torch.stack(gaussian_norm_losses).mean() * (1 - self.focal_loss_alpha) # 指望讓每一個gt內的權重之和等於1(歸一化事後容易學習)
註釋代碼地址:https://github.com/www516717402/AutoAssign 論文說的雲裏霧裏,其實代碼很簡單,論文idea很好。