Mask_RCNN V2.1版本
檔案:Model.py
Resnet的程式碼是由下面這專案參考改來的
https://github.com/fchollet/deep-learning-models/blob/master/resnet50.py
identity_block
這function主要是為了後面的resnet_graph做準備的, 主要是為了重複利用,對應到的就是Resnet裡面的identity_block,然後這是純粹的Resnet版本,在shortcut上沒有操作
input_tensor: 其實就是接上一層的output
kernel_size : 基本上是3,
filters:程式碼中filters通常是一個list, 而通常是三個, 像是[128,128,512],代表三層分別的filter數量
stage: 命名用,知道是哪一個stage的
block: 命名用,知道是stage中的第幾個idenity_block
use_bias: conv layer需不需要bias
train_bn: 這個identity_block要freeze還是train
從裡面可以看到一個完整的Identity_Block
Input->(Conv->BN->RELU)->(Conv->BN->RELU)->(Conv->BN)->ADD(prev,Input)->RELU
|
|
Conv_block
這邊就是純粹的Conv_block, input參數與上方相仿, 除了從stage3開始第一個Conv有subsample=(2,2), 而shortcut因此也需要subsample=(2,2)
|
|
Resnet_Graph
Resnet主體程式碼 剩下就是call上面的function
而ResNet50與ResNet101差異就在於中間使用for來判斷要增加幾個identity_block
|
|
FPN Feature Pyramid Network
FPN被寫在了下面 並沒有獨立一個function, 但這邊順便連帶一起講
C5先通過了一個1x1的conv layer調整channel數量,得到P5
|
|
接下來P5為了要跟P4層進行運算,所以得resize, 這裡用單純的upsampling, 沒有dialated conv或是transposed conv或是bilinear interpolation.
|
|
所以P4層就是把原本的C4調整過channel數量以後 跟upsamplinge過後的P5相加
|
|
FPN完整程式碼如下
P6是用來給RPN用的, 不是給FPN用的
另外P2~P5又做了一次3x3的conv 是為了消除upsampling的混疊效應
|
|