• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    해결됨

Neck에서 Head 부분을 연결할 때 어떤 연산을 거치는지 궁금합니다!

22.07.14 16:47 작성 조회수 87

0

안녕하세요 선생님

그림상 Neck에서 Head로 넘어갈 때 5개의 결과 값들이 각각 class prediction, box prediction으로 합쳐지는 것 같은데 어떤 연산으로 합치는지 논문에는 안나와 있는 것 같더라구요,, 

혹시 코드를 통해서 설명이 가능하면 그렇게 해주시면 너무나도 감사하겠습니다

바쁘신데 귀찮게 해드려서 죄송합니다

 

답변 2

·

답변을 작성해보세요.

0

제가 질문을 잘 못 드린 것 같네요ㅠㅠ 제가 궁금했던 부분은 BI-FPN을 거치고  서로 다른 사이즈의 5가지 최종 피처값이 나오는데 이들이 Class Prediction과 Box Prediction으로 통과 될 때 어떤 식으로 합쳐지는지였습니다. 크기가 다른 5가지의 피처들이 업샘플링 혹은 다운샘플링으로 크기를 같게하고 합쳐지는 것인지.. 

https://github.com/xuannianz/EfficientDet/blob/030fb7e10ab69a297c7723120c2d1be856a852c0/model.py#L305

여기 174 line에서  return P3_out, P4_td, P5_td, P6_td, P7_out 라고 나오는데 그 다음 어떻게 되는지 찾기가 힘드네요ㅜㅜ 

혹시 첨부해주신 깃헙 코드에서 (https://github.com/google/automl/blob/5b2b61005c54efe72f97cf7d0e924afed6a62a60/efficientdet/tf2/efficientdet_keras.py) 700 line에 FPNCells 가 관련된 내용인가 싶기도 합니다만...

답변 부탁드립니다ㅠㅠ 귀찮게 해드려서 죄송합니다.. 

보통 FPN 의 여러개의 출력 Layer들은 각각 하나씩 Classification layer로 연결한 뒤에 최종으로는 classification layer들을 Concatenation 하는 방식으로 수행합니다. 

그러니까 FPN 의 P3_OUT, P4_OUT , P5_OUT Layer들이 있고 Classification Layer는 C3, C4, C5가 있을 경우  P3_OUT->C3, P4_OUT->C4, P5_OUT->C5 으로 연결한 다음에 Contenate([C3, C4, C5]) 와 같은 방식으로 최종 출력을 생성합니다. 

보내주신 코드 https://github.com/xuannianz/EfficientDet/blob/030fb7e10ab69a297c7723120c2d1be856a852c0/model.py#L305

에서는 아마도 443~446 line에서 위에서 설명드린 작업을 수행하는 것 같습니다. 

classification = [class_net([feature, i]) for i, feature in enumerate(fpn_features)]

classification = layers.Concatenate(axis=1, name='classification')(classification)

regression = [box_net([feature, i]) for i, feature in enumerate(fpn_features)]

regression = layers.Concatenate(axis=1, name='regression')(regression)

그리고 448 line에서 model의 최종 output으로 classification과 regression layer를 등록합니다.  

model = models.Model(inputs=[image_input], outputs=[classification, regression], name='efficientdet')

감사합니다.

답변 감사합니다!

0

안녕하십니까, 

합쳐진다는 의미가 어떤건지 정확히는 모르겠습니만, class prediction, box prediction 모델 layer가 나중에 서로 합쳐진다란 의미로 받아들이고 설명드리면, 

 

EfficientDet 구현체를 보면 class prediction, box prediction layer가 별도로 있습니다. 

그리고 FPN Cells 각각에 class prediction layer와 box prediction layer가 연결되어 있습니다. 

코드로 요약해서 설명드리면 아래 URL의 

https://github.com/google/automl/blob/5b2b61005c54efe72f97cf7d0e924afed6a62a60/efficientdet/tf2/efficientdet_keras.py#L609

835 Line에 보시면 아래와 같이 있습니다. 

class_outputs = self.class_net(fpn_feats, training)

box_outputs = self.box_net(fpn_feats, training)

outputs.extend([class_outputs, box_outputs])

if 'segmentation' in config.heads:

seg_outputs = self.seg_head(fpn_feats, training

self.class_net은 ClassNet, self.box_net은 BoxNet 객체를 나타냅니다.  fpn_feats는 FPNCells 객체를 나타냅니다. 해당 클래스와 객체에 대한 보다 자세한 내용은 위의 소스 코드를 참조 부탁드립니다.