SSD模型訓練起來較為簡單,所以最近用的也比較多
現在做一個完整的SSD模型解析,包括訓練過程中遇到的各種坑的解決辦法
先放一個被用爛了的圖

模型說明
圖片通過vgg16的conv4_3layer得到一個feature_map_1
對feature_map_1進行卷積,使用3*3的卷積核,再使用1*1的卷積核,使用multi_task方法(在使用3*3卷積核之后,分別經過兩個不同的1*1卷積核)
獲得result_sigmoid(h*w*1)和result_softmax(h*w*m)
result_sigmoid對應的是這個區域的archer_box是否包含正樣本
result_softmax對應的是這個區域那一個archer_box為字母框的概率最大
對feature_map_1通過3*3卷積核卷積之后的結果進行max_pooling獲取feature_map_2
對feature_map_2進行卷積,使用3*3的卷積核,再使用1*1的卷積核,使用multi_task方法(在使用3*3卷積核之后,分別經過兩個不同的1*1卷積核)
獲得result_sigmoid_2(hh*ww*1)和result_softmax_2(hh*ww*m)
result_sigmoid_1對應的是這個區域的archer_box是否包含正樣本
result_softmax_2對應的是這個區域那一個archer_box為字母框的概率最大
以此類推
關於archer_box:
先放個圖

一般來說,CNN的不同層有着不同的感受野。然而,在SSD結構中,default box不需要和每一層的感受野相對應,特定的特征圖負責處理圖像中特定尺度的物體。在每個特征圖上,default box的尺度計算如下:
計算feature_map_k的感受野 receptive_field
其中,smin = 0.2 × receptive_field,smax = 0.9 × receptive_field
default box的aspect ratios 有:
一般來說,設置6個radio即可(m=6)
每一個default box,寬度、高度、中心點計算如下:

對於每一個Sk 我們有
a = {1, 2, 3,1/2,1/3},對於 aspect ratio = 1,額外增加一個default box,該box的尺度為 

訓練過程:
訓練和解析是很不一樣的
因為ssd模型的輸出是一個feature map嘛,我開始就拿輸入為一張圖和輸出為n張feature map去做反向傳播
結果效果非常差,,,feature_map 全部趨於0
之后重新讀了一遍論文,又讀了一些博客,找到了正確訓練的方法
我們已有的數據為帶標記的圖片數據
數據生成:
將圖片輸入vgg_16的conv5_3獲取feature_map(h*w*c)
使用3*3的滑動窗口,stride為1 ,padding = same 將feature_map 取成h*w個3*3*c的小窗口
計算這個3*3滑動窗口的感受野
通過感受野,每個滑動窗口生成35個default box
遍歷所有的標記,找到對這35個default_box最大的IOU
若iou<0.3則記為負樣本,若iou>0.7則記為正樣本
對於IOU>0.7的,找到對於iou最大的default box 相當於一個softmax 分類
因為我們ssd是多層的,feature_map是可以替換的,所以每一個feature map按照以上規則生成數據即可
網絡訓練
我們的輸入是3*3*c的一個feature map
輸出有兩個
一個是一維的值,表示是否是正負樣本
另一個是35維的向量,表示哪一個default box為iou最大的那個
網絡結構就是卷積加全連接嘛,這個也比較簡單
但要注意,最后一個卷積要使用(3*3) 的卷積核,輸出為1*c
就是把每一個通道變成一個
網絡封裝
封裝之后的網絡輸入為h*w*3的bgr圖像
輸出為3-5個map_1(h*w) , map_2(h*w*35)
第一個map 表示正負樣本 第二個map表示哪一個default box iou最大
但是我們有全連接,,,全連接使用1*1卷積核代替即可
卷積沒什么好說的
全連接用1*1卷積核代替即可
