rpn的輸入是卷積層最後的feature map,所謂的sliding window其實還是做卷積,用n*n**裡說的是視窗大小,其實就是卷積核大小。這裡取n=3。
上述卷積結果,得到了乙個共享的層,**裡叫shared、這個共享層,指的是class(是否為roi)和regression(4個bbox資料的回歸)共享。
**裡提到說shared到cls和reg是個fcn,**裡也是用乙個con2d實現的。卷積後,reshape成對應的維度:reg頭是[batchsize,anchorsize,4],cls頭是[batchsize,anchorsize,2]。
def rpn_graph(feature_map, anchors_per_location, anchor_stride):
shared = kl.conv2d(512, (3, 3), padding='same', activation='relu',
strides=anchor_stride,
name='rpn_conv_shared')(feature_map)
# anchor score. [batch, height, width, anchors per location * 2].
x = kl.conv2d(2 * anchors_per_location, (1, 1), padding='valid',
activation='linear', name='rpn_class_raw')(shared)
# reshape to [batch, anchors, 2]
rpn_class_logits = kl.lambda(
lambda t: tf.reshape(t, [tf.shape(t)[0], -1, 2]))(x)
# softmax on last dimension of bg/fg.
rpn_probs = kl.activation(
"softmax", name="rpn_class_***")(rpn_class_logits)
# bounding box refinement. [batch, h, w, anchors per location, depth]
# where depth is [x, y, log(w), log(h)]
x = kl.conv2d(anchors_per_location * 4, (1, 1), padding="valid",
activation='linear', name='rpn_bbox_pred')(shared)
# reshape to [batch, anchors, 4]
rpn_bbox = kl.lambda(lambda t: tf.reshape(t, [tf.shape(t)[0], -1, 4]))(x)
return [rpn_class_logits, rpn_probs, rpn_bbox]
RPN遇到的坑
要點1 在每個滑動視窗的中心 經過3x3卷積得到的點,該卷積層不改變feature map的大小,只是將周圍的資訊融合到中心點上,該中心點的可視野為3x3大小的vgg zf特徵 9種不同尺度大小的錨框 anchors 這裡用的是zf的feature map 是256 d,而vgg的feature m...
volatile的實現細節
jvm是由c 實現的。jvm層面。storestorebarrier volatile寫操作 storeloadbarrier loadloadbarrier volatile讀操作 loadstorebarrier也就是volatile操作前後都加了記憶體屏障。storeloadbarrier上面...
RPN網路的anchor機制
anchors是一組大小固定的參考視窗 三種尺度 三種長寬比,如下圖所示,表示rpn網路中對特徵圖滑窗時每個滑窗位置所對應的原圖區域中9種可能的大小,相當於模板,對任意影象任意滑窗位置都是這9中模板。繼而根據影象大小計算滑窗中心點對應原圖區域的中心點,通過中心點和size就可以得到滑窗位置和原圖位置...