目標檢測之SSD(single shot multibox detector)的pytorch代碼閱讀總結

代碼地址:點擊打開鏈接(https://github.com/amdegroot/ssd.pytorch)

這是別人的閱讀筆記:在medium,點擊打開鏈接(https://towardsdatascience.com/learning-note-single-shot-multibox-detector-with-pytorch-part-1-38185e84bd79)

數據準備部分
  • 準備三個文件: images, anonation(xml,與圖片數據同名),txt(待訓練數據的名稱)
  • 先讀取txt,根據txt內容讀取image和label
  • 重寫torch.datasets的__getitem__方法,在這個過程中,要將xml的內容提取出來,xml的內容主要以object的name和box爲主,將name轉換成index,再將index與box連起來,注意(2,)這樣形式的shape
  • 再將數據經過transforms,包括加噪聲,剪裁,最最關鍵的是box對應的變化
  • 數據預處理也是很重要的一塊內容,包括加噪聲和裁剪,但是要重寫自己的transform。在重寫的過程中還得帶上標籤,因爲image的變化可能會引起box的變化,這點不同於分類。
網絡結構
  • 第一遍粗略過了下網絡結構和multi box的代碼,網絡很明確,vgg+額外的卷積層,然後從中間層的特徵圖上預測loss,分別是位置的偏移和類別的概率
  • box的產生很依賴trick,針對每個gt找出最匹配的default box
  • 第二遍過整個網絡結構,先構成vgg+extra layers,然後從vgg的conv4_3和fc7、extra layers的每隔兩層提取網絡的輸出結果,通過與其對應的task網絡(與提取的層數一一對應)結構產生location/confidence(應該是一些map)。test過程中,這些結果送入detect過程,將conf通過softmax生成概率,將loc解碼成對應的座標位置,最後結果先是選出conf大於閾值的位置,根據這些位置挑選出對應的框,再對框使用nms,最後挑出top_k個最優結果。
訓練過程
到現在爲止,已經全部過了一遍,接下來的過程就是訓練的細節,主要是損失函數的計算,每個image共有8732個box,第一步就是一個個image和其groundtruth進行匹配,將一個batchsize的匹配結果進行累計到一個變量裏,通過向量化的操作儘量避免循環的使用,涉及到很多tensor的形狀相關的屬性的使用以及不少技巧。包括以下過程:
  • 在計算兩個box的IOU時,採用unsqueeze和expand實現了兩個for循環的操作,可以自己在程序裏實驗一下
  • 根據重合度,爲8732中的每個box選擇一個groundtruth,location:8732*4,confidence:8732*1(值爲0~19,共20類),①對於confidence中對應重合度小於閾值的地方,值設爲0,即負樣本,類別成了21類,在loss的計算過程中增加background部分的損失。②要將box的位置(x1,y1,x21,y2)表達成偏移量delta(x,y,w,h),然後進行損失函數的計算,包括兩部分:
  • location:挑選重合度大的一些box,根據自帶函數F.smooth_l1_loss 計算。
  • confidence:文章中說 根據highest confidence loss,選擇3倍於正樣本數目的負樣本,正樣本根據重合度已經選擇出來了,選擇負樣本先計算這個confidence loss,首先求取預測confidence的log_sum_exp值,再減去其中對應groundtruth的confidence,其值作爲篩選樣本的confidence loss,進行排序,選取最大的幾個值爲負樣本,計算交叉熵,計算最終的loss,負樣本針對的是background。


新添加框圖結構




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章