DetectionOutput算子
本文基本結構:首先介紹detection output 這一層的基本理解,之后給出ssd所有代碼的詳細注釋,最后給出caffe中該層各個參數的定義和默認值。
detection out layer是ssd網絡最后一層,用於選框整合預、預選框偏移以及得分三項結果,最終輸出滿足條件的目標檢測框、目標的label和得分。
輸入方面,mbox_priorbox是網絡各個priorbox層輸出concat后的結果(priorbox解析點這里),相當於把所有預選框放到一起;mbox_loc是在預選框的基礎上的偏移量;mbox_conf_flatten就是每個類別在各個框上的得分。
輸出大小為[1, 1, x, 7],其中x是最后保留的框的個數,最后一維存放的數據為: [image_id, label, confidence, xmin, ymin, xmax, ymax]
計算思路:
1)對bottom層的location、confidence和priorbox進行解析,放到vector中
2)對每個priorbox進行解碼。所謂解碼其實就是整合輸入層。前面說到過了,輸出需要給出每個目標的檢測框,但是輸入是預選框和偏移量,這里要做的就是計算出最終的檢測框。解碼需要考慮priorbox編碼方式,共三種情況。
假設檢測框用b表示(存儲內容:b_xmin, b_ymin, b_xmax, b_ymax),預選框用p表示(存儲內容:p_xmin, p_ymin, p_xmax, p_ymax),偏移量用t表示(存儲內容:t_x, t_y, t_height, t_width)。
b和p的寬高分別用x和y的最大最小值減一下得到,中心點的值用最大最小值相加除以2得到。
那么在每種類型中,編碼公式分別為:

解碼時求取b的各個值就可以。如果需要添加variance的值,將t與variance相乘即可。
以center_size解碼方式為例:

據此分別計算出b_xmin, b_ymin, b_xmax, b_ymax即可。詳細可參見代碼
3) Non-Maximum Suppression非極大值抑制
檢測算法給出的box往往有很多,如下圖所示,多個檢測框其實框出的是一個目標,nms就是一個目標保留一個最優框。抑制的過程是一個迭代-遍歷-消除的過程。

給定處理前的集合:預選結合,處理后的集合keep集合
首先,將預選集合所有框按照得分高低進行排序,選中得分最高的框,從預選集合移出放到keep集合中;
接下來進行迭代:
*從當前預選集合移出得分最高的框,用它與keep集合每個框計算交並比:
*超過閾值說明二者重復很多,框住的應該是同一個東西,不放到keep集合中;
*如果與keep集合中每個框交並比都小於閾值,說明當前框框住的是一個新目標,應該放到keep中。
迭代下去,直到預選集合為空,那么keep集合中留下的就是檢出的所有目標的檢測框。
jaccard overlap
這里補充介紹一下ssd網絡中的jaccard overlap。
jaccard overlap其實就是交並比,簡單說起來就是兩個檢測框重合的面積(相交的部分)除以兩個檢測框並在一起的面積(面積之和減去重合部分),用公式表示為

J為0說明兩個框一點沒有重合,為1說明完全重合
4)按照輸出大小要求輸出結果

