Deep Learning - 이미지/영상 분야의 다양한 기술 - Objection Detection (YOLO)

화이티 ·2024년 1월 11일
0

Deep Learning

목록 보기
16/24

  • Classification
  • Classification + Localization
  • Object Detection
  • Instance Segmentation

1. Object Detection

이미지 내에서 객체 (사물, 사람등)를 감지해 내는 것




차령을 차주변에 파악할 수 있다, laser sensor

객체 탐지 알고리즘의 역사

1. Traditional Dectection methods

2. Two-stage detector > R-CNN

  • 영역추정 (Region Proposal) 과 탐지 (Dectection)


비슷한 객체 가져오기 -> 한번도 모아 > 한번도 모아-> 객체 줄어들다
장점: 성능 많습니다 - 높은 성능
단점: 속도가 느리다 10~15 fps (동영상이 보통 30fps) > 실시간 탐지 불가능

3. - One Stage Detection - YOLO

  • 영역추정과 탐지를 같이 진행
    단: 낮은 성능 > 0.7
    장: 속도가 빠름 30~40 fps > 실시간 탐지 가능

Labelling

  • Roboflow 사용

처리


-> 경로 다운로드


test label 의미:

  • 첫번째 숫자 = cat (0) or dog(1)
  • 2~5 번째 숫자 객체의 위치
  • x1, y1, x2, y2
  • 각각의 숫자는 찍은 위치의 픽셀값/이미지 크기/ 0~1 숫자로 적혀있음
  • roboflow에서 라벨링 한 데이터 가져오기

!curl -L "https://app.roboflow.com/ds/At1kvgVH5l?key=QfDSImtcCA" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

  • make directory
# mkdir (make directory)
%mkdir dataset
  • move
# mv(move)
%mv ./README.dataset.txt ./README.roboflow.txt ./data.yaml train test valid /content/dataset
  • 하난의 변수에 사용한 파일 모아주기

  • 이미지 파일의 결로 모은 에모장파일 만들기

  • train.txt, val.txt

  • 파일 경로 불러오기

from glob import glob
train_img_list = glob('/content/dataset/train/images/*.jpg')
train_img_list

val_img_list = glob('/content/dataset/valid/images/*.jpg')

  • 이미지파일의 경로를 txt파일 안에 담기

with open('/content/dataset/train.txt','w') as f:
  f.write('\n'.join(train_img_list)+ '\n') # 하나입력enter
with open('/content/dataset/val.txt','w') as f:
  f.write('\n'.join(val_img_list)+ '\n') # 하나입력enter
  • 학습시에는 data.yam 파일을 사용
  • data.yam파일 안에서 train. val 경로 수정 > train.txt, val.txt 경로 적기
  • 데이터셋 사용 준비 완료

YOLOv5 사용하기 준비

!git clone https://github.com/ultralytics/yolov5

  • print working directory
%pwd
  • change directory
%cd yolov5
  • install library
!pip install -r requirements.txt
!python train.py --img 640 --batch 16 --epochs 50 --data /content/dataset/data.yaml --name cat_dog_yolov5s_results

YOLO 환경설정
#파이썬 3.8버전으로 yolov5이름의 환경 만들기
conda create -n yolov5 python==3.8
#yolov5 환경 접속하기
activate yolov5
#yolov5를 다운로드 받기위해서 git 설치
pip install git-python
conda install git
#github에서 yolov5관련 파일 다운로드 받기
git clone https://github.com/ultralytics/yolov5
#yolov5실행하기위한 라이브러리 설치
cd yolov5
pip install -r requirements.txt
#jupyter notebook 실행파일 설치
pip install jupyter

YOLOv5 사용하기

import torch # yolo 사용하는 라이브러리
import numpy as np
import cv2 # 이미지 다루는 라이브러리
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
# 모델 불러오기
model = torch.hub.load('ultralytics/yolov5', 'custom', path='./data/best.pt' , force_reload=True)
dog = cv2.imread('./data/dog.1500.jpg')
cv2.imshow('dog',dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 이미지 불러오기
cat = cv2.imread('./data/KakaoTalk_20240112_122826900.jpg')
# 객체 검출하기
result = model(cat)
# ctrl +shift + '-' -> 커서 기준으로 샐 분할
result
# 객체 검출했으면 이미지에 표시하기
cv2.rectangle(dog, (x1,y1) , (x2,y2) , (0,0,255), 2)
# 이미지 뛰우기
cv2.imshow('cat',cat)
cv2.waitKey(0)
cv2.destroyAllWindows()

dog = cv2.imread('./data/KakaoTalk_20240112_122826900_03.jpg')
# 객체 검출하기
result = model(dog)
detect = result.xyxyn[0].numpy()
# 크기
x = dog.shape[1]
y = dog.shape[0]

# 계산
x1 = int(detect[0,0]*x)
y1 = int(detect[0,1]*y)
x2 = int(detect[0,2]*x)
y2 = int(detect[0,3]*y)
cv2.rectangle(dog, (x1,y1) , (x2,y2) , (0,0,255), 2)
# 이미지 뛰우기
cv2.imshow('dog',dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

여러마리

  • for함수 활용하기
dog = cv2.imread('./data/3 dog.png')
# 객체 검출하기
result = model(dog)
detect = result.xyxyn[0].numpy()
# 크기
x = dog.shape[1]
y = dog.shape[0]
# 여러 마리 검출했을 경우
for i in range (len(detect)):
# 계산
    x1 = int(detect[i,0]*x)
    y1 = int(detect[i,1]*y)
    x2 = int(detect[i,2]*x)
    y2 = int(detect[i,3]*y)
    cv2.rectangle(dog, (x1,y1) , (x2,y2) , (0,0,255), 2)
# 이미지 뛰우기
cv2.imshow('dog',dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2

# 모델 불러오기
torch.hub.load('ultralytics/yolov5', 'custom', path='./data/best.pt' , force_reload=True)
# 동영상 연결하기
video_path ='./data/cat_video.mp4'
# 비디오 연결한 코드
video = cv2.VideoCapture(video_path)
# 초당 30장의 사진을 가져온다 > 한장씩 사용
while video.isOpened():
    ret, img = video.read() #이미지 한장 가져오기
    # ret = 성공여부, img = 이미지 값
    
    
    if not ret:
        break
    result = model(img)
    detect = result.xyxyn[0].numpy()
    # 크기
    x = img.shape[1]
    y = img.shape[0]
    # 여러 마리 검출했을 경우
    for i in range (len(detect)):
    # 계산
        x1 = int(detect[i,0]*x)
        y1 = int(detect[i,1]*y)
        x2 = int(detect[i,2]*x)
        y2 = int(detect[i,3]*y)
        cv2.rectangle(img, (x1,y1) , (x2,y2) , (0,0,255), 2)
    cv2.imshow('video', img)
    # 동영상 종료기능 (!)
    k = cv2.waitKey(1)
    if k == 49:
        break

videos. realeased()
# 원두우에 뛰운창 종료
cv2.destroyAllWindows ()
profile
열심히 공부합시다! The best is yet to come! 💜

0개의 댓글

관련 채용 정보