YOLO (v3) object detector in PyTorch: Part 3-Implementing the the forward pass of the network

maroo·2022년 11월 9일
0

ML&DL

목록 보기
4/6

Defining The Network

Implementing the forward pass of the network

-network의 forward pass: nn.Moduleforward 메소드 사용

  • forward의 역할(1): output 계산
  • forward의 역할(2): output detection map을 처리하기 쉽게 transform
  • forward의 인자 3개: self, x, CUDA
    • CUDA가 true일 경우 GPU사용

Convolutional and Upsample Layers

Route Layer / Shortcut Layer

YOLO (Detection Layer)

-YOLO의 output: BB의 attribute를 포함하는 convolutional feature map
-predict_transform 함수를 통해 구현한다.

  • predict_transform: util.py에 위치

Transforming the output

-먼저 util.py의 import구문을 위한 cv2라이브러리 다운받기

  • pip install opencv-python
  • pip install opencv-contrib-python
  • predict_transform 함수
    • parameter 5개: prediction(output),inp_dim(input image dimension),anchors,num_classes,CUDA flag
    • detection feature map을 받아 2D tensor로 바꾼다
      • tensor의 각 row가 BB의 attribute

Detection Layer Revisited

-3개 scale의 detection map을 하나의 tensor로 concatenate

Testing the forward pass

-image를 YOLOv3폴더에 저장
-에러 발생: RuntimeError: shape '[1, 255, 3025]' is invalid for input of size 689520

  • 에러 해결: https://discuss.pytorch.org/t/shape-1-255-3025-is-invalid-for-input-of-size-689520/37603/11 참고
    - get_test_input()에서는 img resize를 (416,416)으로 해주고 있는데, yolov3.cfg파일에서는 net의 input width, height가 608, 608임. yolov3.cfg의 width, height를 수정해 주니 작동됨

    -tensor의 shape: 1 x 10647 x 85
  • 1: batch size. image가 1개이므로
  • 10647 x 85:
    -위 출력 결과는 random weight 상태로 출력된 것. official weight file을 사용하여 올바른 결과를 내야 함

Downloading the Pre-trained Weights

-yolov3.weights를 다운받아 YOLOv3폴더 안에 위치시키기

Understanding the Weights File

-yolov3.weights: weights를 순차적으로 저장한 binary file
-weights 형식

  • float
  • 어떤 숫자가 어떤 layer의 것인지 명시되어 있지 않음
    -weight 이해하기
  • 두 layer중 하나에 속함: batch norm layer / convolutional layer
  • order: configuration file의 order와 같음

Loading Weights

-에러 발생: AttributeError: 'Darknet' object has no attribute 'load_weights'

  • 에러 원인: 내가 load_weights 함수를 Darknet class에 넣지 않고 아예 바깥에 작성했음. 그러니 당연히 model.load_weights가 작동이 안 될 수밖에.
  • 에러 해결: load_weights 함수를 Darknet class안에 넣는다.
profile
할수이따 ~

0개의 댓글