해당 구조에서 사용되는 block은 Conv(DWConv), Focus, CSPLayer, SPPBottleneck가 있습니다.
Conv: depthwise=True일때 DWConv로 교체됨 -> backbone darknet에서는 모든 conv가 DW로 바뀜(Base가 따로 없음)
Focus: 2x2칸을 4배의 채널로 합치는 block -> 나중에 고쳐야할 부분일 듯
CSPLayer: 전체 구조에서 메인이 되는 layer(backbone, fpn에 모두 사용됨). Baseconv로만 이뤄짐, 중간에 bottleneck이 사용됨.
Bottleneck: 1x1 BaseConv, 3x3 Conv(DW)의 path와 residual을 더하는 bottleneck 구조. attention을 삽입하게 될 블럭.
SPPBottleneck: 여러 크기의 maxpooling으로 이뤄진 spatial pyramid pooling layer
yolopafpn
채널을 합치는 요소를 제외하고는 모두 CSPLayer로 이뤄져있습니다. 구현체의 resolution, channel은 위에 그림 참고하시면 됩니다.
최종적으로는 (pan_out2, pan_out1, pan_out0)이 출력되고
각각 dafault 크기는 [(64, 52, 52), (128, 26, 26), (256, 13, 13)] 규격입니다.
해당 output에 맞춰 yolo_pafpn을 전체 수정하면, head와 바로 연결할 수 있습니다.
yolo_head
입력으로 주어진 3개의 layer에 따라서 for 문으로 진행됩니다.
각 입력에 따라
stem: 1x1 baseconv -> 모든 head에 공통적으로 적용됨
cls & reg convs -> Conv * 2
cls & reg & obj preds -> 각각 최종 출력의 크기에 맞춰줍니다. (그림 참고)
strides -> backbone의 크기가 수정될 때, 핵심이 되는 부분입니다.
원본 resolution 대비 얼마나 작아졌는지가 들어가야합니다.
ex) default input resolution: [52, 26, 13] -> strides = [416/52, 416/26, 416/13] = [8, 16, 32]
%% 추가로 코드를 쭉 따라가시다보면 gt_output_and_grid가 있습니다. 이는 stride를 이용하여, 해당 grid가 원본 resolution에서는 어느 box를 가르키는지를 return하는 코드이고, 이후부터는 수정할 부분이 없다고 생각하시면 됩니다.
내용
설명하는 시간을 따로 갖겠지만, 글로도 작성해두었습니다!
yolo_pafpn
backbone -> darknet.py -> CSPDarknet
해당 구조에서 사용되는 block은 Conv(DWConv), Focus, CSPLayer, SPPBottleneck가 있습니다.
yolopafpn
채널을 합치는 요소를 제외하고는 모두 CSPLayer로 이뤄져있습니다. 구현체의 resolution, channel은 위에 그림 참고하시면 됩니다. 최종적으로는 (pan_out2, pan_out1, pan_out0)이 출력되고 각각 dafault 크기는 [(64, 52, 52), (128, 26, 26), (256, 13, 13)] 규격입니다.
해당 output에 맞춰 yolo_pafpn을 전체 수정하면, head와 바로 연결할 수 있습니다.
yolo_head
입력으로 주어진 3개의 layer에 따라서 for 문으로 진행됩니다. 각 입력에 따라
%% 추가로 코드를 쭉 따라가시다보면 gt_output_and_grid가 있습니다. 이는 stride를 이용하여, 해당 grid가 원본 resolution에서는 어느 box를 가르키는지를 return하는 코드이고, 이후부터는 수정할 부분이 없다고 생각하시면 됩니다.