A A
[CV] OpenCV에서 YOLO를 이용한 Object Detection Part.1

OpenCV DNN으로 YOLO Inference 구현시 유의 사항

  • YOLO 모델 구현시 알아두어야 할 점은, OpenCV YOLO Inference Code는 기존 OpenCV inference 코드와는 다릅니다.
  • 또한 Darknet 구성 환경 및 YOLO Architecture에 따라 사용자가 직접 Object Detection 정보를 추출해야 합니다.

Pretrained된 inference 모델 로딩 방법

  • Weight 모델 파일과 config 파일은 Darknet 사이트에 Download가 가능합니다.
  • cv2.dnn.readNetFromDarknet(config 파일, weight 모델 파일)으로 pretrained된 inference 모델을 로딩합니다.
  • readNetFromDarket(config 파일, weight 모델 파일)에서 config 파일 인자가 weight 모델 파일 인자보다 먼저 위치함에 유의해야 합니다.

3개의 scale Output Layer에서 직접 Detection 결과 추출

  • 이 모델의 Architecture를 보면 Backend-Darknet Layer를 거쳐서, 82번 Layer, 94번 Layer, 106번 Layer에서 3개의 다른 Scale별로 구성된 Output Layer에서 Object Detection 결과를 추출합니다.
  • 그후, 추출한 3개의 Object의 결과를 합칩니다.
  • 이때, 사용자가 직접, NMS(Non Maximum Supressing)으로 최종 결과를 필터링 해야 합니다.

Bounding box 정보 추출 시 직접 85개의 구성에서 추출

 

Bounding Box 정보 추출 시 Coco 데이터 세트로 Pretrained된 모델에서 Bounding Box 정보를 추출합니다.

 

  • Bounding Box 정보 추출: 4개의 Box 좌표, 1개의 Object Score, 80개의 Class Score로 구성된 총 85개의 정보에서 Bounding Box 정보를 추출합니다.
  • Class ID와 Class Score: 80개의 클래스 확률 벡터에서 가장 높은 값을 가지는 위치 인덱스와 그 값을 추출합니다.
  • 최종 Bounding Box 계산: 예측된 오프셋 값과 앵커 박스를 사용하여 Bounding Box의 실제 좌표와 크기를 계산하고, 시그모이드 함수를 적용하여 Objectness Score를 계산합니다.
  • 이때, Class id, Class Score는 80개의 클래스 확률 벡터에서 가장 높은 값을 가지는 위치 index와 값입니다.

추출 좌표의 변환

OpenCV Yolo로 추출한 좌표는 Detected된 Object의 center와
width, height 값이므로 이를 좌상단, 우하단 좌표로 변경이 필요합니다.

  • 좌상단과 우하단 좌표로 변환하는 과정은 다음과 같습니다.
  • YOLO 예측값에서 중심 좌표 (bx,)와 크기 (bw)를 가져옵니다.
  • 중심 좌표와 크기를 이용하여 좌상단 좌표 (x1)와 우하단 좌표 (x2)를 계산합니다.

Opencv로 Yolo Inference 구현 절차

Opencv로 Yolo Inference 구현 절차를 설명해 보겠습니다.
  1. cv2.dnn.readNetFromDarknet(config 파일, weight 모델 파일)으로 pretrained된 inference 모델을 로딩합니다.
    • 이때, config 파일 위치를 주의해야 합니다.
  2. 사용자가 3개의 다른 Scal별로 구성된 output layer에서 Object Detect 결과를 추출합니다.
    • Detected된 Object당 85개의 vector를 가집니다.
    • 이때 4개의 위치 정보는 cente점의 x,y 좌표와 width, height이므로 이를 좌상단, 우하단 좌표로 변경이 필요합니다.
    • Class id와 class score는 이 80개 vector에서 가장 높은 값을 가지는 위치 인덱스와 그 값입니다.
  3. 사용자가 직접, NMS(Non Maximum Suppressing)로 최종 결과 필터링 해야 합니다
    • 이때, OpenCV에서 제공하는 NMS 함수로 NMS 최종 필터링 된 Object 시각화 작업을 진행합니다.