2024.03.04
Yolo
YOLO: you only look once의 약자
- openCV: 영상처리가 중심(모델 등)
- yolo: 영상관련된 모델(분류, 인식 등)
최근에 v8모델이 나왔고, 오늘 해볼건 v3 정도로 진행
- yolo가 인기 있는 이유는 빠르고 적당한 성능 때문이다.
- 기본 구조 : conv 중심 모델
Yolo의 이미지 분류, 이미지 검출
- 이미지 분류 : 개인지 고양이인지
- 이미지 검출: 개가 있는지, 어디에 있는지
- 참고) 이미지 검출
- yolo는 기본적으로 2가지 정보(전체 grid)를 나눠서 진행
- 각기 box들에 대해서 유효한지 체크, 확률적으로 높은지.
성능은 기존 모델이 더 좋기는 하지만 속도 문제가 있었음.
속도를 그래도 괜찮다 하고 인식할 정도로 제시한 것이 yolo다.
Yolo 실습
yolo 모델 다운로드 후 아래 코드 실행
# 필요한 패키지들
import numpy as np
import pandas as pd
import cv2
import matplotlib.pyplot as plt
# yolo v3이 학습한 80개의 종류
names = open("/content/coco.names").read()
names= names.split("\n")
# yolo 관련된 필요한 정보들 불러오기
weight_path = "/content/yolov3.weights"
conf_path = "/content/yolov3.cfg"
# 참고: opencv에서 처리할 때
yolo_model = cv2.dnn.readNetFromDarknet(conf_path,weight_path,)
layers = yolo_model.getLayerNames()
# opencv에서 사용할 때 주의사항 : 출력층에 대한 분리
# 3가지 스케일에 대한 특징들을 하나의 출력용으로 묶어
output_layers = [layers[i-1] for i in yolo_model.getUnconnectedOutLayers()]
이미지에 적용하기
기존 v3가 학습한 80개의 종류들 중에서 처리해본다.
# 이미지 불러오기
image = cv2.imread("/content/dog.png")
print("입력 이미지 크기:",image.shape )
# 이미지 확인(코랩용으로 RGB 변환후 출력)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
# 데이터 전처리
blob = cv2.dnn.blobFromImage( image,
1/255.,
(416,416),
swapRB = True,
crop=False)
# 이미지에 yolo v3 모델 적용
yolo_model.setInput( blob )
output_sample = yolo_model.forward( output_layers )
# 결과 확인
print(type(output_sample))
print(len(output_sample))
output_sample[0].shape
# 결과
<class 'tuple'>
3
(507, 85)
# --> 80 : 학습한 coconet 종류 80개
# --> 5 : 박스당 확률, x,y,w,h : 5개
# --> 85개 정보
박스들 확률값에 대한 기준치 설정
# 기준1 : # 0.5보다 작은 박스의 확률값은 박스로 인정 X
pro_min = 0.5
# 기준2 : 겹쳐진 박스가 같은 종류인지 다른 종류인지 구별해주는 기준
# yolo 기준으로 0.2-0.4정도
threshold = 0.3
결과 확인
classes = []
confidence = []
boxes = []
Height = image.shape[0]
Width = image.shape[1]
for out in output_sample:
for res in out:
# 앞에 5개는 정보, 뒤에 6번째부터 85번째까지가 각 80개 클래스별 확률값
# 가장 큰 값의 클래스를 확인
scores = res[5:]
class_current = np.argmax( scores)
confidence_current = scores[class_current]
# 가장 큰 확률값을 가지는 클래스에 대해서 유효한지 아닌지 체크
if confidence_current > 0.5:
box = res[0:4] * np.array( [Width, Height, Width, Height])
x, y, w, h = box.astype("int")
x = int( x - ( w/2))
y = int( y - ( h/2))
# 생성한 정보들을 추가
boxes.append([ x, y, int(w), int(h)])
confidence.append(float(confidence_current) ) # 박스의 신뢰도
classes.append(class_current) # 학습에 사용한 80개 해당하는 인덱스
# NMSBoxes 메서드 입력: 박스 좌표값, 박스에 신뢰도, 기준 값)
results = cv2.dnn.NMSBoxes( boxes, confidence, 0.5, 0.4)
결과를 이미지에 나타내기
colorarea = np.random.randint( 0, 255, size=(len(names), 3))
print(colorarea.shape)
print(colorarea[0])
if len(results) >0 :
for i in results:
# box를 그리기 위한 준비
x, y = boxes[i][0], boxes[i][1]
width, height = boxes[i][2], boxes[i][3]
# 박스색
colorarea_currnet = [ int(j) for j in colorarea[ classes[i]]]
# 원본, 사각형 시작점, 끝점, 색상정보(c1,c2,c3), 두께
cv2.rectangle( image, ( x,y), (x+width, y+height) , colorarea_currnet, 5)
# 라벨 텍스트 : 가장 확률이 큰 클래스명, 그 때의 확률값
text_bar_current = "{}:{:.4f}".format( names[classes[i]], confidence[i] )
# 텍스트를 이미지에 얹기
cv2.putText( image,text_bar_current, (x+2, y+2), cv2.FONT_HERSHEY_DUPLEX, 0.5,(0,0,0))
plt.imshow( cv2.cvtColor( image, cv2.COLOR_BGR2RGB))
plt.show()
'ASAC 빅데이터전문가과정 > DL' 카테고리의 다른 글
ASAC 60일차_딥러닝 13일차 (1) | 2024.09.06 |
---|---|
ASAC 59일차_딥러닝 12일차 (0) | 2024.09.05 |
ASAC 57일차_딥러닝 11일차 (0) | 2024.09.05 |
ASAC 56일차_딥러닝 10일차 (5) | 2024.09.05 |
ASAC 55일차_딥러닝 9일차 (0) | 2024.09.04 |