RPN的實現細節

2021-08-20 11:40:26 字數 1453 閱讀 8119

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就可以得到滑窗位置和原圖位置...