目標識別程式碼解讀整理

獨鹿發表於2018-05-08

end_points用來記錄每一層的特徵圖,各層的特徵圖大小是不一樣的

end_points[end_point] = net

 

特徵層數記錄

for i, layer in enumerate(feat_layers):

i表示第幾個特徵層,layer表示特徵層的名字

把各層的特徵圖資料取出來end_points[layer]

把所有目標類別取出來num_classes

anchor的尺寸列表,有6個尺寸(莫非一個特徵圖上只用一個尺寸的anchor?)   

anchor_sizes=[(21.,45.),(45., 99.), (99., 153.), (153., 207.), (207., 261.), (261., 315.)],

一個anchor尺寸上的不同比例列表anchor_ratios,不同層的比例個數不一樣。

anchor_ratios=[[2,.5], [2, .5, 3, 1./3], [2, .5, 3, 1./3], [2, .5, 3, 1./3], [2, .5], [2, .5]],

各層上畫素的放縮到的值,總共6層,

anchor_steps=[8,16, 32, 64, 100, 300]

取anchor 迴歸時需要用的調整數anchor_offset

normalizations是什麼鬼還不清楚

normalizations=[20, -1, -1, -1, -1, -1],

 

 

一層特徵圖上的多框預測:(也就是在一層圖上想要返回一個預測結果和位置的時候需要準備什麼,準備好怎麼處理)

需要準備的東西:這一層的特徵圖,這層圖上框的尺寸,這個尺寸對應的幾個比例,和一個不知道是什麼鬼的normalization.

p, l = ssd_multibox_layer(end_points[layer],

                                         num_classes,

                                         anchor_sizes[i],

                                         anchor_ratios[i],

                                          normalizations[i])

 

準備好後怎麼處理:

第一步:先看normalization是不是大於0,大於0的就把這一層的特徵資料給正則化一下,不大於0的就不正則化了。(看normalizations的所有值,發現應該是隻有在第一個特徵圖的那一層做了正則化,後面幾個都沒有做。)

if normalization > 0:

        net =custom_layers.l2_normalization(net, scaling=True)

第二步:算一下這一特徵圖上的anchor個數,因為在傳的時候anchor_size只傳進來一個尺寸,所以這裡的len(sizes)應該等於1,而傳進來的anchor對應的不同比例len(rations)就是自定義的其他的幾個比例個數,所以anchor個數就是等於1+其他定義好的比例個數。程式碼裡這樣寫的:

num_anchors= len(sizes) + len(ratios)

第三步:框有了後進行確定框所在的位置,如何確定呢?利用和真實標記的anchor做迴歸來確定。

因為有多個anchor,而每個anchor要回歸出4個值來確定位置。所以總共需要回歸出值的個數有num_anchors*4個。

迴歸的過程:需要準備的東西有,這層特徵圖的值,要回歸出的值的個數,再來一個3*3的卷積核,準備完迴歸用的東西后,通過卷積操作來完成迴歸。卷積操作後輸入出的東西應該是一個通道個數為迴歸值個數的特徵圖。程式碼如下:

loc_pred= slim.conv2d(net, num_loc_pred, [3, 3], activation_fn=None,

                           scope='conv_loc')

(程式碼中還給了一個這樣的操作,把通道數放到最後,但由於tensorflow預設的就是通道數在最後放的,所以這個程式碼感覺有點多餘loc_pred = custom_layers.channel_to_last(loc_pred))

迴歸結束後,把得到的特徵圖進行了重新塑形reshape,(塑形後的資料是一個列表,列表的長度為anchor的個數,列表裡的具體每一項又是一個列表,這個列表是一個4個長度的list,即這4個值是一個anchor的四個位置資訊)

 

、、、-------------------------------------------------精華程式碼啊-------------------------------

deftensor_shape(x, rank=3):

    """Returns the dimensions ofa tensor.

    Args:

      image: A N-D Tensor of shape.

    Returns:

      A list of dimensions. Dimensions that arestatically known are python

        integers,otherwise they are integerscalar tensors.

    """

    if x.get_shape().is_fully_defined():

        return x.get_shape().as_list()

    else:

        static_shape =x.get_shape().with_rank(rank).as_list()

        dynamic_shape = tf.unstack(tf.shape(x),rank)

        return [s if s is not None else d

                for s, d in zip(static_shape,dynamic_shape)]

‘’‘’‘’---------------------------------------------------------------------------------

 


相關文章