KT AIVLE School/[TIL] AIVLE School 당일 복습

[TIL] [KT AIVLE School] 에이블스쿨 DX 트랙 10주차 4일. 딥러닝 심화(3). Object Detection

guoyee94 2024. 11. 7. 18:11

 

오늘부터 김건영 강사님께서 강의를 하신다.

 

중독성 있는 스피치를 소유하고 계신다.

 

지~난번에 했었던 CNN(합성곱신경망)을 바탕으로 ,

Vision Task를 중점적으로 배울 예정.

 


 

1. Computer Vision Task

말 그대로, 시각적 요인들을 컴퓨터로 인식/처리하는 방법들의 총체를 가리킨다.

 

세부 분야로는 다음과 같은 것들이 있다.

분야 대표적인 데이터셋
Image Classification
이미지 분류
  • MNIST
  • Fashion MNIST
  • CIFAR-10/100
  • Caltech-101/256
  • ImageNet
  • ImageNette / ImageWoof
Object Detection
객체 탐지
  • PASCAL VOC
  • MS COCO
  • Open Images
  • KITTI
  • Argoverse
  • Global Wheat
  • Objects365
  • SKU-110K
  • VisDrone
  • xView
Oriented Bounding Boxes
객체 탐지의 확장 버전
  • DOTA
Semantic Segmentation
픽셀 단위 분류
  • MS COCO-Stuff
  • CITYSCAPES
  • ADE20K
  • CamVid
Instance Segmentation
Object Detection
+
Semantic Segmentation
  • MS COCO
  • CITYSCAPES
  • ApolloScape
Pose
사람의 자세 인식
  • MS COCO
Vision and Natural Language
시각 정보와 텍스트 병행 처리
  • MS COCO Captions
  • Visual Genome
  • Flickr30K

 

아래쪽에 있는 것들은 좀 심화과정이고,

맨 위에 있는 이미지 분류는 CNN 다루면서 해 봤다.

 

이번에 배울 것은 그 아래, Object Detection이다.

 

 

 

 

 

 

 

 


 

 

 

 

 

2. Object Detection

Instance Segmentation은 잠시 넣어두자.

 

기본적으로 Object DetectionMultiple Classification + Localization으로 정의된다.

Localization
하나의 개체가 있는 위치를 Bounding Box로 지정하여 찾는 방법이다.

기본적으로 회귀적 방법론을 사용하는데,
Bounding Box의 위치 정보를 파악하는 것이기 때문에
좌표 기반의 학습이 쓰인다.

예측의 정확도를 따지기 위해서 두 가지 지표를 쓴다.
1. IoU : Ground Truth Box와 Predicted Box의 일치도를 나타낸다.(0~1)
2. Confidence Score : 모델이 Box 안에 객체가 있다고 확신하는 정도.(0~1)

 

그러니까 Object Detection이란건,

동시에 여러 대상을 구분(Classification)하면서 위치를 결정(Localization)하는 작업이다.

 


 

 

IoU의 산정을 나타낸 그림. 보라색 원이 Ground Truth Box이다.

 

위 그림을 보면, 익숙한 TP, FP, FN등이 보인다.

 

그럼 당연히 임계값이 있겠지.

 

이를 IoU threshold라고 한다.

 

위 그림은 IoU threshold = 0.5일때의 판정이다.

 


 

모델이 아주 강하게 확신하여 confidence score가 높다.

 

threshold는 IoU뿐만 아니라 Confidence Score에도 있다.

 

분류는 평가 기준이 있어야 하니까 당연하겠지?

 

Confidence Score threshold는 모델 입장에서의 확신도를 나타내므로,

Box를 그리느냐 마느냐의 기준이 된다.

 

따라서 모델은 IoU threshold와 Confidence Score threshold를 모두 고려하여

PrecisionRecall을 산출한다.

 

 


 

 

Localization 모델의 평가는 이를 바탕으로 그린

Precision - Recall Curve를 그려서 진행한다.

 

이 곡선이 그리는 면적을 Average Precision(AP)라고 하고,

그 평균을 mAP라고 한다.

 

이 mAP가 모델의 성능을 평가하는 지표가 된다.

AP
사실 AP도 하나의 그림은 아니다.
한 클래스의 AP를 구하려면,
threshold를 0.5 ~ 0.95까지 조절하며 여러번의 곡선을 그리고,
그 곡선들의 면적을 평균낸 것이 진짜 AP다.

mAP는 그 클래스별 AP의 평균인 것.

 

 


 

 

 

Object Detection에 대한 평가가 끝나면 뭐하지?

 

당연히 예측(predict)해야지.

 

이때 모델은 딸깍 한번만 예측하지 않는다.

 

여러번의 예측을 거친 후에, 가장 적절한 예측을 남기고 다 없애버리는 후처리를 거친다.

 

이 후처리를 Non-Max-Suppression(NMS)라고 한다.

model.predict()로 만들어진 Box들을 제거하는 NMS 과정

 

이 과정에서도 threshold 원리가 사용된다.

 

우선 예측한 box들 중에서 Confidence Score threshold에 미치지 못하는 것들을 제거하고,

남은 것들 중 Confidence Score가 가장 높은 box와 다른 box들의 IoU를 측정한다.

 

이 IoU는, Confidence Score가 가장 높은 box(A라 하자)와

다른 box(B라 하자)가 겹치는 정도를 나타내는 셈이다.

 

여기에서의 IoU가 높다는 것은 A와 B가 많이 겹친다(= B는 불필요하다)는 뜻이기에,

이런 B들은 다 제거해 주어야 한다.

 

왜? 같은 대상을 나타내는 box라고 보는거지.

 

이것을 반복하면 각 대상을 가리키는 하나의 박스만 남게 된다.

 

Annotation
Object Detection을 위해서는 이미지뿐만 아니라
이미지의 class_idx, x, y, w, h 값을 명세해 주는 txt 파일이 필요하다.
이는 학습 시의 정답 데이터이기도 하다.
이를 Annotraion 파일이라고 한다.

Roboflow
End to End 개발을 지원하는 사이트.
Annotation 작업을 할 수 있다.

 

 

 

 

 


 

 

 

 

 

 

3. UltraLytics

 

YOLO(You Only Look Once)는 실시간 Object Detection를 수행하는 딥러닝 모델이다.

 

이를 개발하는 회사가 UltraLytics(https://github.com/ultralytics)이다.

 

오늘은 YOLO v11을 기반으로 학습한다.

 

기본적으로 YOLO는 이미 학습된 모델이기에, 사용하는 법은 간단하다.

!pip install ultralytics
from ultralytics import YOLO, settings
model = YOLO()

 

아무런 매개변수를 전달하지 않으면,

오늘(2024.11.07) 기준으로 yolo11n.pt가 다운로드된다.

 

이때 매개변수를 줘서 모델의 버전과 task를 지정할 수도 있다.

model = YOLO(model='yolo11n.pt', task='detect')

 

colab에서 실행하면 현재 세션에 설치된다.

 

pt파이토치 파일임을 나타내는데,

PyTorch는 구조(Structure)과 가중치(Weight)로 구성되어 있다.

 

따라서 우리가 받은 모델 'yolo11n'은,

모델의 구조(식)과 학습 결과로 저장된 가중치를 포함하고 있는 것이다.

 

한편 n은 모델의 사이즈를 나타낸다.(n=나노, s=스몰.... 이런 식이다.)

 

 


 

 

이제 이 모델을 동작시켜보자.

model.train(
    model='/content/yolo11n.pt',
    data='coco8.yaml',
    epochs=10
            )

 

매개변수 model에는 아까 저장된 모델의 경로를 설정해 준다.

 

여기 있는 모델을 쓰겠다 이거지.

 

data도 경로를 지정해 줄 수 있고, 여기서는 미리 처리된 UltraLytics의 데이터셋을 썼다.

 

이외에도 모델을 학습시키는(.fit()이 아니라 .train()임을 주의!) 과정에서 다양한 옵션들이 있다.

Argument default 기능
data coco8.yaml 학습시킬 데이터셋 경로
epochs 100 학습 횟수
batch 16 배치 사이즈, -1이면 자동 설정
imgsz 640 입력 이미지 사이즈
save True 학습 과정 저장 여부 설정
project   학습 과정이 저장되는 폴더의 이름
name   project 폴더 내부의 폴더 이름
exist_ok False 동일한 이름의 폴더가 있을 때 덮어씌울지 설정
pretrained True 사전 학습된 모델을 사용할 것인지
pretrained model

사전학습된 모델.

방금 쓴 YOLO 또한 MS COCO라는 이미지셋으로 학습된 모델이다.

MS COCO에는 80여개의 클래스가 정의되어 있으나,
세상 모든 객체가 80개로 표현될 리가 없다.

따라서 우리는 우리의 목적에 맞게
모델을 Fine-Tunning하여 쓸 수 있어야 한다. 

 

model.val()을 통해 검증을 수행할 수 있지만,

train()의 매개변수로 val=True가 기본적으로 들어 있기에

웬만해서는 따로 할 일이 없다.

 

 


 

 

 

이제 이렇게 학습한 모델에게 실제 이미지를 주어 Object Detection을 수행시켜 보자.

results = model.predict(
    conf=0.5,
    iou=0.5,
    save=True, save_txt=True, line_width=2
    )

 

predict()는 언제나 값에 담지.

 

여기서 유의해야 할 부분이 바로 conf(Confidence threshold)와 iou(IoU threshold)이다.

 

이 둘은 우리가 조절할 하이퍼파라미터인데,

predict() 단계에서 사용하는 것이므로 NMS 측면의 threshold를 의미하는 것이다.

 

그렇다면 그 효과는 이렇겠지.

  높은 경우 낮은 경우
conf
기본 0.25
신뢰도가 높은 결과만 남김
오탐 ↓, 객체를 놓칠 가능성 ↑
보다 많은 결과를 남김
오탐 ↑, 객체를 놓칠 가능성 ↓
iou
기본 0.5
많이 겹쳐져야 중복으로 판단
겹쳐진 여러 객체를 더 잘 구분
하나의 객체를 중복 탐지할 가능성 ↓
조금만 겹쳐도 중복으로 판단
겹쳐진 여러 객체를 하나로 판단
하나의 객체를 중복 탐지할 가능성 ↑

 

predict가 이루어지고 나면, 그 결과 파일을 사전 설정된 경로에 저장한다.

 

저장 결과는 이렇게 확인할 수 있다.

 

이런 식으로 대상을 구분한다. YOLO의 기본 학습데이터인. MS COCO나, Annotation으로 쓴 coco8.yaml이나 사람, 차 위주라 구분이 잘 된다.

 

 

 

 

 

 

 


 

 

 

 

 

 

 

4. Roboflow

Annotation 작업을 수행할 수 있는 웹.

 

아까 말했듯, 우리는 사전학습된(pretrainde) 모델인 YOLO를 쓰기 때문에,

우리의 용도에 맞게 Fine-Tunning. 즉 강화할 필요가 있다.

 

Roboflow에서는 특정 주제의 데이터셋 + yaml파일(Annotation 파일)을 받아

model.train()에 써먹을 수 있다.

https://universe.roboflow.com/

 

Roboflow에서 데이터셋을 받아서 진행한다.

 

간단히 클릭-클릭으로 다운로드할 수 있다.

 

이런 식으로 API를 발급받아 데이터셋을 받을 수 있다.

 

ipynb에 그대로 코드를 붙여넣어 실행하면 데이터셋이 다운로드된다.

 

 

다운로드가 끝나면 Ultralytics의 기본 setting 위치에 폴더가 생긴다.

이런 이유로, 특히나 colab을 쓴다면 Ultralyrics의 기본 경로를 잘 지정해 놓아야 한다.

colab기준으로 기본 위치가 /content/이므로
아래와 같이 미리 설정해놓는 편이 좋다.
from ultralytics import settings # setting이 dictionary 형태로 정의됨
settings['datasets_dir'] = '/content/'

 

이때 위의 .yaml 파일이 Annotation 파일이다.

 

이 뒤로는 똑같이 train - predict이긴 한데...

 

UltraLytics의 내부 문제로 무슨 데이터를 돌려도 무한루프가 걸린다 ㅠㅠ

 

결국 결과는 확인 못해봄