最近因緣際會, 在使用SSD做object detection training時, 遇到兩個需求
因Wei Liu的Caffe SSD code不支援以上兩種功能, 在github搜issue找大神時也得不到完整的solution, 自己動手修改成了唯一解.
為了確保coding上的調整沒有問題, 就花了幾天的時間將Caffe SSD仔細掃過一輪, 並在此分享心得
最後, 也感謝Viscovery小夥伴們的支持, 其中Ryan與Isis都給了不錯的建議
本文撰寫時, 預設讀者已具備以下知識
如不熟悉, 相信用括號內的關鍵字可以google到不少資訊
稍微複習一下, 從R-CNN這類two-stage object detector演進而來的one-stage detectors(e.g. YOLO, SSD, RetinaNet等)
精神上很像是Faster R-CNN中RPN(region proposal network)的延續.
RPN想做的事情很單純, 就是在一張image中, 找出可能有物體的位置, 並將他用框框(bounding box; bbox)匡出來
雖然這樣的做法可行, 但實際執行起來太慢 (步驟1切圖+步驟2一張一張送進去)
因此rgb大神們就想出了一個平行化的概念, 將原本
reg layer TBD
MultiBoxLossLayer
|
|- GetGroundTruth: Parse Dataset Ground Truth BBoxes 資料
|
|- GetPriorBoxes: Parse Network 預設的 Prior Boxes
|
|- GetLocPredictions: Parse Network output 的 Predicted Boxes
|
|- FindMatches: 以ground truth bboxes為基準, 比較並找出positive matched的 predicted boxes / prior boxes
|
|- MineHardExamples: 根據設定而定, mine hard negative examples (MAX_NEGATIVE) 或 mine hard (positive+negative) examples (HARD_EXAMPLES)
|
|- EncodeLocPrediction: 最終 encode localization 結果 (localization loss 用此做計算)
|
-- EncodeConfPrediction: 最終 encode confidence 結果 (confidence loss 用此做計算)
vector<map<int, vector<int> > >* all_match_indices
map<int, vector<int>> match_indices
int
vector<int>
-1
: 沒有與任何一個 ground truth bbox 重疊-2
: predict出來的bbox超出圖片界線, 不考慮 (ignore_cross_boundary_bbox = True
時)loc_loss_type
: localization regression loss; 可選用P.MultiBoxLoss.SMOOTH_L1
或P.MultiBoxLoss.L2
conf_loss_type
: confidence classification loss; 可選用P.MultiBoxLoss.SOFTMAX
或P.MultiBoxLoss.LOGISTIC
loc_weight
: localization 與 confidence 之間的平衡比例 weight; 其實就是paper中eq X 的 /alphanum_classes
: total classification的class數量 (須包含background class)share_location
: 預設為True. 若設為False, 則per prior box localization的結果會由4個參數(x, y, w, h)擴增為4*num_classes個參數(代表每個class都用不同的localization參數)match_type
: 預設為P.MultiBoxLoss.PER_PREDICTION
, 同paper描述, 若任一predicted bbox/prior bbox跟ground truth(gt) bbox IoU大於overlap_threshold
時, 就判斷成matched bbox(positive bbox)
若設定成P.MultiBoxLoss.BIPARTITE
, 則ground truth bbox只能有一個相對應的matched bbox(挑IoU最高的那個)overlap_threshold
: 應用場景見match_type
, 預設為0.5
(IoU)use_prior_for_matching
: 預設為True, 則matching的方式是用 prior bboxes 跟 gt bboxes 做比對 (若相符, 則該bboxes被添加到matched_indices中);
若設成False
, 則matching方式是用 predicted bboxes 跟 gt bboxes 做比對background_label_id
: 背景 class iduse_difficult_gt
: dataset 有個difficult
的tag可以進行標記. 此param預設為True
, 即就算困難的ground truth sample也丟進去訓練mining_type
: MineHardExamples
裡使用, 有以下三種模式
P.MultiBoxLoss.MAX_NEGATIVE
(default)P.MultiBoxLoss.HARD_EXAMPLE
P.MultiBoxLoss.NONE
neg_pos_ratio
neg_overlap
code_type
ignore_cross_boundary_bbox