YOLO-Object Detection

Speedwell🍀·2022년 1월 2일
1

Human Following Robot

목록 보기
4/18

YOLO 논문 발표 영상
https://www.youtube.com/watch?v=NM6lrxy0bxs

YOLO 검출 방법
https://www.youtube.com/watch?v=9s_FpMpdYW8&ab_channel=DeepLearningAI

YOLO v1 이해하는 데 도움된 영상
https://www.youtube.com/watch?v=ag3DLKsl2vk&ab_channel=codebasics

anchor box 개념이 어려워서 찾아본 영상
https://www.youtube.com/watch?v=RTlwl2bv0Tg&ab_channel=DeepLearningAI

https://mickael-k.tistory.com/27?category=798520

[출처]https://www.youtube.com/watch?v=5ev0MMBzY3E&ab_channel=%EC%9D%B4%EC%88%98%EC%95%88%EC%BB%B4%ED%93%A8%ED%84%B0%EC%97%B0%EA%B5%AC%EC%86%8C


객체 탐지 ( Object Detection )

  • 한 이미지에서 객체와 그 경계 상자(bounding box)를 탐지
  • 객체 탐지 알고리즘은 일반적으로 이미지를 입력으로 받고, 경계 상자와 객체 클래스 리스트를 출력
  • 경계 상자에 대해 그에 대응하는 예측 클래스와 클래스의 신뢰도(confidence) 출력

Applications

  • 자율 주행 자동차에서 다른 자동차와 보행자를 찾을 때
  • 의료 분야에서 방사선 사진을 사용해 종양이나 위험한 조직을 찾을 때
  • 제조업에서 조립 로봇이 제품을 조립하거나 수립할 때
  • 보안 산업에서 위협을 탐지하거나 사람을 셀 때


용어 설명

Bounding Box

  • 이미지에서 하나의 객체 전체를 포함하는 가장 작은 직사각형

IOU (Intersection Over Union)

  • 실측값(Ground Truth)과 모델이 예측한 값이 얼마나 겹치는지를 나타내는 지표

IoU= A∩B / A∪B


  • IOU가 높을수록 잘 예측한 모델

  • 예시

[이미지 출처]: https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/

# IoU = Intersection / (A + B − Intersection)

def compute_iou(pred_box, gt_box):
  x1 = np.maximum(pred_box[0], gt_box[0])
  y1 = np.maximum(pred_box[1], gt_box[1])
  x2 = np.minimum(pred_box[2], gt_box[2])
  y2 = np.minimum(pred_box[3], gt_box[3])

  # w = np.maximum(x2 - x1, 0), h = np.maximim(y2 - y1, 0)
  intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)

  pred_box_area = (pred_box[2] - pred_box[0]) * (pred_box[3] - pred_box[1])
  gt_box_area = (gt_box[2] - gt_box[0]) * (gt_box[3] - gt_box[1])

  union = pred_box_area + gt_box_area - intersection_area

  iou = intersection / union

  return iou

NMS (Non-Maximum Suppression, 비최댓값 억제)

  • 확률이 가장 높은 상자와 겹치는 상자들을 제거하는 과정
  • 최댓값을 갖지 않는 상자들을 제거
  • 과정
    1. 확률 기준으로 모든 상자를 정렬하고 먼저 가장 확률이 높은 상자를 취함
    2. 각 상자에 대해 다른 모든 상자와의 IOU를 계산
    3. 특정 임계값을 넘는 상자는 제거
[이미지 출처]: https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/
import numpy as np

def non_max_suppression_fast(boxes, overlap_thresh):
  if len(boxes) == 0:
    return []
  
  if boxes.dtype.kind == 'i':
    boxes = boxes.astype('float')

  pick = []
  x1 = boxes[:, 0]
  y1 = boxes[:, 1]
  x2 = boxes[:, 2]
  y2 = boxes[:, 3]

  area = (x2 - x1 + 1) * (y2 - y1 + 1)
  idxs = np.argsort(y2)

  while len(idxs) > 0:
    last = len(idxs) - 1
    i = idxs[last]
    pick.append(i)

    xx1 = np.maximum(x1[i], x1[idxs[:last]])
    yy1 = np.maximum(y1[i], y1[idxs[:last]])
    xx2 = np.maximum(x2[i], x2[idxs[:last]])
    yy2 = np.maximum(y2[i], y2[idxs[:last]])

    w = np.maximum(0, xx2 - xx1 + 1)
    h = np.maximum(0, yy2 - yy1 + 1)

    overlap = (w * h) / area[idxs[:last]]

    idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlap_thresh)[0])))

    return boxes[pick].astype('int')


모델 성능 평가

정밀도와 재현율

  • 일반적으로 객체 탐지 모델 평가에 사용되지는 않지만, 다른 지표를 계산하는 기본 지표 역할을 함
    • TP
      • True Positives
      • 예측이 동일 클래스의 실제 상자와 일치하는지 측정
    • FP
      • False Positives
      • 에측이 실제 상자와 일치하지 않는지 측정
    • FN
      • False Negatives
      • 실제 분류값이 그와 일치하는 예측을 갖지 못하는지 측정

precision = TP / (TP + FP)


recall = TP / (TP + FN)

  • 모델이 안정적이지 않은 특징을 기반으로 객체 존재를 예측하면 거짓긍정(FP)이 많아져서 정밀도가 낮아짐
  • 모델이 너무 엄격해서 정확한 조건을 만족할 때만 객체가 탐지된 것으로 간주하면 거짓부정(FN)이 많아져서 재현율이 낮아짐

정밀도-재현율 곡선 (precision-recall curve)

  • 신뢰도 임계값마다 모델의 정밀도와 재현율을 시각화
  • 모든 bounding box와 함께 모델이 예측의 정확성을 얼마나 확실하는지 0 ~ 1 사이의 숫자로 나타내는 신뢰도를 출력
  • 임계값 T에 따라 정밀도와 재현율이 달라짐
    • 임계값 T 이하의 예측은 제거함
    • T가 1에 가까우면 정밀도는 높지만 재현율은 낮음
      놓치는 객체가 많아져서 재현율이 낮아짐. 즉, 신뢰도가 높은 예측만 유지하기 때문에 정밀도는 높아짐
    • T가 0에 가까우면 정밀도는 낮지만 재현율은 높음
      대부분의 예측을 유지하기 때문에 재현율은 높아지고, 거짓긍정(FP)이 많아져서 정밀도가 낮아짐
  • 예를 들어, 모델이 보행자를 탐지하고 있으면 특별한 이유 없이 차를 세우더라도 어떤 보행자도 놓치지 않도록 재현율을 높여야 함
    모델이 투자 기회를 탐지하고 있다면 일부 기회를 놓치게 되더라도 잘못된 기회에 돈을 거는 일을 피하기 위해 정밀도를 높여야 함
[이미지 출처] : https://www.researchgate.net/figure/a-Example-of-Precision-Recall-curve-with-the-precision-score-on-the-y-axis-and-the_fig1_321672019

AP (Average Precision, 평균 정밀도)와 mAP (mean Average Precision)

  • 위 그림의 곡선 아래 영역에 해당
  • 항상 1x1 정사각형으로 구성되어 있음
    즉, 항상 0 ~ 1 사이의 값을 가짐
  • 단일 클래스에 대한 모델 성능 정보를 제공
  • 전역 점수를 얻기 위해서 mAP를 사용
  • 예를 들어, 데이터셋이 10개의 클래스로 구성된다면 각 클래스에 대한 AP를 계산하고, 그 숫자들의 평균을 다시 구함
  • (참고)
    • 최소 2개 이상의 객체를 탐지하는 대회인 PASCAL Visual Object Classes와 Common Objects in Context(COCO)에서 mAP가 사용됨
    • COCO 데이터셋이 더 많은 클래스를 포함하고 있기 때문에 보통 Pascal VOC보다 점수가 더 낮게 나옴
    • 예시
[이미지 출처] : https://www.researchgate.net/figure/Evaluation-on-PASCAL-VOC-2007-and-MS-COCO-test-dev_tbl2_328939155

Dataset

VOC

  • 2005년부터 2012년까지 진행
  • Object Detection 기술의 benchmark로 간주
  • 데이터셋에는 20개의 클래스가 존재
    (background, aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, diningtable, dog, horse, motorbike,
    person, pottedplant, sheep, sofa, train, tvmonitor)
  • 훈련 및 검증 데이터 : 11,530개
  • ROI에 대한 27,450개의 Annotation이 존재
  • 이미지당 2.4개의 객체 존재

    [이미지 출처]https://paperswithcode.github.io/sotabench-eval/pascalvoc/

COCO Dataset

  • Common Objects in Context
  • 200,000개의 이미지
  • 80개의 카테고리에 500,000개 이상의 객체 Annotation이 존재
      bicycle
      car
      motorbike
      aeroplane
      bus
      train
      truck
      boat
      traffic light
      fire hydrant
      stop sign
      parking meter
      bench
      bird
      cat
      dog
      horse
      sheep
      cow
      elephant
      bear
      zebra
      giraffe
      backpack
      umbrella
      handbag
      tie
      suitcase
      frisbee
      skis
      snowboard
      sports ball
      kite
      baseball bat
      baseball glove
      skateboard
      surfboard
      tennis racket
      bottle
      wine glass
      cup
      fork
      knife
      spoon
      bowl
      banana
      apple
      sandwich
      orange
      broccoli
      carrot
      hot dog
      pizza
      donut
      cake
      chair
      sofa
      pottedplant
      bed
      diningtable
      toilet
      tvmonitor
      laptop
      mouse
      remote
      keyboard
      cell phone
      microwave
      oven
      toaster
      sink
      refrigerator
      book
      clock
      vase
      scissors
      teddy bear
      hair drier
      toothbrush
[이미지 출처]https://cocodataset.org/#home

YOLO (You Only Look Once)

  • 가장 빠른 객체 검출 알고리즘 중 하나
  • 256x256 사이즈의 이미지
  • GPU 사용 시, 초당 170프레임(170FPS, frames per second),
    이는 파이썬, 텐서플로 기반 프레임워크가 아닌 C++로 구현된 코드 기준
  • 작은 크기의 물체를 탐지하는 것은 어려움

YOLO Backbone

  • 백본 모델(backbone model) 기반
  • 특징 추출기(Feature Extractor)라고도 불림
  • YOLO는 자체 맞춤 아키텍쳐 사용
  • 어떤 특징 추출기 아키텍쳐를 사용했는지에 따라 성능 달라짐
[이미지 출처]https://www.researchgate.net/figure/Structure-detail-of-YOLOv3It-uses-Darknet-53-as-the-backbone-network-and-uses-three_fig1_335865923
  • 마지막 계층은 크기가 w x h x D인 특징 볼륨 출력
  • w x h는 그리드의 크기, D는 특징 볼륨 깊이

YOLO의 계층 출력

  • 마지막 계층 출력은 w x h x M 행렬
    • M = B x (C + 5)
      • B: 그리드 셀당 경계 상자 개수
      • C: 클래스 개수
    • 클래스 개수에 5를 더한 이유는 해당 값 만큼의 숫자를 예측해야 함
      • tx, ty는 경계 상자의 중심 좌표를 계산
      • tw, th는 경계 상자의 너비와 높이를 계산
      • c는 객체가 경계 상자 안에 있다고 확신하는 신뢰도
      • p1, p2, ..., pC는 경계 상자가 클래스 1, 2, ..., C의 객체를 포함할 확률
[이미지 출처]https://www.researchgate.net/figure/Structure-of-one-output-cell-in-YOLO_fig3_337705605

앵커 박스 (Anchor Box)

  • YOLOv2에서 도입
  • 사전 정의된 상자(prior box)
  • 객체에 가장 근접한 앵커 박스를 맞추고 신경망을 사용해 앵커 박스의 크기를 조정하는 과정 때문에 tx, ty, tw, th이 필요
[이미지 출처]https://kr.mathworks.com/help/vision/ug/getting-started-with-yolo-v2.html

YOLOv3 Inference 연습 : tensorflow2

Clone ane install dependencies

0개의 댓글