728x90

2024-01-02 73th Class

Deep Learning History

#️⃣ 비전, NLP 발전 단계

Vision: AlexNet > RCNN > Faster RCNN > YOLO
NLP: RNN > LSTM > Seq2Seq > Attention > Transformer


Object Detection

#️⃣ Computer Vision 카테고리

  • Classification
  • Classification + Localizaiton
  • Object Detection
  • Instance Segmentation

이미지 분류(Image Classification): 디지털 이미지를 사전 정의된 카테고리 중 하나로 할당하는 문제. ex) CNN

객체 검출(Object Detection): 이미지에서 물체의 위치와 정보를 찾는 기술.
기존의 컴퓨터 비전 기술인 이미지 분류 및 객체 인식 기술이 필요

세분화(Segmentation): 이미지를 작은 부분으로 나누어 각 부분에 레이블을 할당하는 작업.
전통적인 방법으로는 기하학적 모델링, 통계적 모델링, 머신러닝이 사용되고, 최근에는 딥러닝 기반의 방법들이 많이 연구 됨

생성(Generation): 입력 이미지나 비디오로부터 새로운 이미지나 비디오를 생성하는 기술. ex) GAN

#️⃣ Bounding Box

방법1

400

  • (x, y, w, h) 형태로 표현
  • x와 y는 bounding box의 왼쪽 상단 모서리의 좌표, w와 h는 bounding box의 너비와 높이

방법2

  • (x1, y1, x2, y2) 형태로 표현
  • (x1, y1)은 물체의 왼쪽 상단 모서리의 좌표, (x2, y2)는 물체의 오른쪽 하단 모서리의 좌표

#️⃣ Object Detection 방식

  1. Sliding Window : 커널이 이동되면서 검출. 시간 소요 大
  2. Region Proposal : selective search, edge boxes 알고리즘으로 물체가 있을만한 후보 영역을 찾아서 객체 탐지

#️⃣ Object Detection의 과제

  • 작은 객체
  • 겹치는 객체
  • 다양한 크기의 객체
  • 실시간 처리

#️⃣ One-Stage Detector vs Two-Stage Detector

History

Process

특징 One-Stage Detector Two-Stage Detector
검출 속도 빠름 (Real-time 용이) 느림 (Real-time용으로는 제한적)
정확도 상대적으로 낮음 상대적으로 높음
아키텍처 단일 네트워크 두 개의 연속된 네트워크
예시 모델 YOLO (You Only Look Once) Faster R-CNN, R-CNN, Mask R-CNN 등
목적 실시간 객체 검출 (e.g., 자율 주행차량) 정확한 객체 위치 및 세분화 (e.g., 물체 인식 및 분할)
훈련 및 데이터 필요량 적은 데이터 및 계산 리소스 필요 많은 데이터 및 계산 리소스 필요
감지 성능 (Detection Performance) 일반적으로 정확도 낮음 높은 정확도
객체 크기 및 비율 다양한 크기와 비율의 객체 처리 가능 작은 객체 및 불균형한 비율의 객체에 더 적합
시행 과정 Localization + Classification Localization → Classification

One-stage Detector

  • 단일 네트워크로 이루어져 있고, 객체 위치와 클래스를 한 번에 예측
  • train, predict 속도가 빠름 => 실시간 응용 프로그램에 적합
  • Anchor Box 사용

Two-stage Detector

  • 두개의 연속된 네트워크 아키텍처로 구성 (1st: 객체 후보 생성 > 2nd: 후보를 분류하고 객체 위치 보정)
  • Region Proposal Network 사용하여 후보 객체 영역을 생성하고, 두번째 네트워크로 전달됨
  • 정확도를 중시해서 train, predict에 연산량 多 => 객체 세분화 작업에 적합

#️⃣ Dataset

  1. COCO
  2. Pascal VOC
  3. ImageNEt
  4. Open Images

#️⃣ Metrics

Intersection over Union (IOU)

Pasted image 20240102103455.png|600

IOU = (예측된 영역과 실제 영역의 교집합 면적) / (예측된 영역과 실제 영역의 합집합 면적)

  • IOU는 예측 바운딩 박스와 실제 바운딩 박스가 얼마나 겹치는지를 나타내는 정도
  • IOU는 0 ~ 1 (1에 가까울 수록 정확)

Mean Average Precision (mAP)

평균 정밀도(MAP)는 다양한 임계값에서의 평균 정밀도를 의미

#️⃣ NMS (Non-Maximum Suppression)

NMS(Non-Maximum Suppression)은 객체 탐지에서 중복된 예측 결과를 제거하는 기술

  1. 예측된 바운딩 박스들을 IOU(Intersection over Union)를 기준으로 내림차순으로 정렬
  2. 가장 높은 점수를 가진 바운딩 박스를 선택하고, 이를 최종 결과로 유지
  3. 선택한 바운딩 박스와 IOU가 높은 다른 바운딩 박스들을 제거
  4. 남아 있는 바운딩 박스들에 대해 위의 과정을 반복

YOLO

  1. 입력 이미지를 S × S 그리드로 나눔
  2. 전체 이미지를 활용하여 모든 bounding Box를 동시 예측 및 confidence(신뢰도) 할당
  3. 겹치는 bounding Box와 높은 confidence(신뢰도)를 가지는 S × S 그리드로 나눈 그리드 중 일부를 해당 클래스로 할당
  4. 그리드를 연결하여 최종 bounding Box 생성
  1. mAP (mean Average Precision)
  • 의미: mAP는 객체 탐지 모델의 정확도를 측정하는 지표. 모델이 얼마나 많은 객체를 정확하게 탐지하고 분류하는지 의미
  • 계산 방법: mAP는 각 클래스에 대한 평균 정밀도(Average Precision, AP)의 평균값으로 계산됨. AP는 정밀도(precision)와 재현율(recall) 곡선 아래 면적으로 정의
  1. FPS (Frames Per Second)
  • 의미: FPS는 시스템이나 모델이 초당 처리할 수 있는 이미지 프레임의 수. 이는 객체 탐지 시스템의 속도와 효율성을 측정하는 지표
  • mAP와의 관계: 일반적으로, 높은 정확도(mAP)를 달성하기 위해서는 더 많은 계산이 필요하여 FPS가 감소. 반대로, 빠른 처리 속도(FPS)를 위해 모델을 단순화하면 정확도(mp)가 저하

YOLOv8은 이전 버전들의 성공을 기반으로 새로운 기능과 개선 사항을 도입하여 성능, 유연성 및 효율성을 향상시켰습니다. YOLOv8은 탐지분할자세 추정추적분류를 포함하여 다양한 비전 AI 작업을 지원합니다. 이러한 다재다능함은 사용자들이 다양한 애플리케이션과 도메인 전반에 걸쳐 YOLOv8의 능력을 활용할 수 있도록 합니다.

Ref.
Predict guidelines : Predict - Ultralytics YOLOv8 Docs
YOLOv8 Tutorial : YOLOv8 Tutorial - Colaboratory (google.com)


YOLO v8 객체검출 실습 (자유주제)

Fubao Detector

  • 판다 푸바오를 검출하는 YOLOv8 모델 만들기
  • 이미지에서 푸바오 검출 가능
  • 영상에서 푸바오 검출 가능
  • => 판다월드 CCTV를 통해 푸바오가 안전하게 잘 있는지 확인 할 수 있음

code (image)

import locale
from roboflow import Roboflow
from ultralytics import YOLO
import cv2
from google.colab.patches import cv2_imshow
import cv2

locale.getpreferredencoding = lambda: "UTF-8"

# Data
API_KEY = ""
rf = Roboflow(api_key=API_KEY)
project = rf.workspace("det").project("panda_person")
dataset = project.version(1).download("yolov8")

# Train
# Load a model
model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)

# Use the model
model.train(data="panda_person-1/data.yaml", epochs=50)  # train the model

# Predict (Image)
model = YOLO('/content/runs/detect/train/weights/best.pt')
results = model('/content/baby_fubao.jpg', save=True)

images='/content/runs/detect/predict/baby_fubao.jpg'
image = cv2.imread(images)
cv2_imshow(image)

Pasted image 20240102165733.png

code (video)

# Predict (Video)

# Open the video file
video_path = 'fubao.mp4'
cap = cv2.VideoCapture(video_path)

# Get video properties for VideoWriter
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # or 'XVID'
out = cv2.VideoWriter('/content/output.mp4', fourcc, fps, (frame_width, frame_height))

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLOv8 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Write the frame into the file
        out.write(annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release everything
cap.release()
out.release()
cv2.destroyAllWindows()

0: 640x384 1 panda, 6.4ms
Speed: 2.1ms preprocess, 6.4ms inference, 1.4ms postprocess per image at shape (1, 3, 640, 384)

0: 640x384 1 panda, 7.7ms
Speed: 2.0ms preprocess, 7.7ms inference, 1.4ms postprocess per image at shape (1, 3, 640, 384)

0: 640x384 1 panda, 8.0ms
Speed: 2.0ms preprocess, 8.0ms inference, 1.5ms postprocess per image at shape (1, 3, 640, 384)

0: 640x384 1 panda, 10.1ms
Speed: 1.9ms preprocess, 10.1ms inference, 1.3ms postprocess per image at shape (1, 3, 640, 384)

0: 640x384 1 panda, 10.1ms
Speed: 1.7ms preprocess, 10.1ms inference, 1.5ms postprocess per image at shape (1, 3, 640, 384)
반응형